최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday

티스토리 뷰


 

   paypal의 기본 캐릭터셋 'UTF-8'

 

paypal에서 별다른 설정 없이 사용하면 기본 인코딩 값은 utf-8이다. 


이와 관련하여 작업 중 볼 수 있는 3가지 정도의 오류 상황이 존재 할 수 있다.



첫번째. 문서는 EUC-KR (혹은 다른)인데 UTF-8(기본값) 으로 접근 : 명시적인 encoding 에러

 

 




두번째. 파일 형식과 명시적으로 선언한 캐릭터 타입은 UTF-8이 맞으나, paypal에게 넘겨주었던 변수의 출처가 

      

          EUC-KR(혹은 다른) 일 때 : 한글만 다 깨진다. (변수를 최종 인코딩 안 해 주었기 때문에)





세번째. 일부러 에러를 내지 않는 이상 보기 힘든 에러.

      

           파일 속성과 명시적 선언 타입도 UTF-8로 일치하지만, paypal에 넘겨주는 캐릭터셋 타입이 


           엉뚱하게 EUC-KR로 되어있는 경우.



 

 

   한글을 넘겨 줄 때에는 모든 타입의 일관성을 체크해야 한다.

 

작업 할 때 다음의 4가지 항목을 하나하나 살펴보면 되는데


1. 파일 속성의 인코딩


2. 명시적 선언의 인코딩


3. 변수의 타입 속성 확인 (어떤 Type에서 최초 시작했는지 출처를 추적해야 함)


4. paypal에 전달 해 주는 캐릭터셋을 정의 한다.

 

이렇게 순서와 항목을 인지하고 삽질을 하기까지 이틀이나 허비했다. 모든 문제가 그렇지만 알고나면 간단한데 그 과정이 험난하다.


직접 화면을 통해서 어떻게 하는지 살펴보자.


1. 파일 속성 확인 (에디트플러스의 경우)




2. 명시적 선언의 인코딩 (ASP의 경우)



php의 경우 : header("Content-type:text/html;charset=utf-8");


3. 변수의 타입 속성 확인 (직접 문자열 상수를 썼기 때문에, 타입 에러 자체가 없는 상황)




ASP 변수의 경우 : EUC-KR > UTF-8


ㄱ. EUC-KR 쪽

  

a. HTML에 적어 줄 경우.


     <input type="hidden" name="goodsname" value="<%=escape(goodsname)%>">


b. javascript로 적어 줄 경우.


var formName = document.formName;

formName.goodsname.value = "<%=escape(goodsname)%>";

formName.submit();


ㄴ. UTF-8쪽


Dim goodsname

goodsname = unescape(request("goodsname"))


php 변수의 경우 : EUC-KR > UTF-8


$goodsname = iconv("EUC-KR","UTF-8", $goodsname); //참 간편하다.


4. 페이팔에 정의 해 줄 캐릭터셋 선언



이렇게 해서 모든 확인 절차가 마무리 되었다.




   넘겨주는 방법은 GET이건 POST건 편한대로 쓰면 된다.


GET으로 쓸 경우 문자열로 URL만 적어준 뒤 redirect 시키면 되고, 


POST의 경우 HTML의 form엘리먼트에 속성을 나열해 준 뒤에 자바스크립트로 submit 하면 된다.



GET의 경우

<%@ CODEPAGE="65001" LANGUAGE="VBSCRIPT" %>
<% session.codepage = "65001" %>
<% response.charset = "utf-8" %>

<%
'paypal variables
Dim paypal_business, paypal_cmd, success_url, cancel_url, notify_url
Dim paypal_charset, paypal_currencyType, paypal_amount, paypal_itemName, paypal_quantity, paypal_itemNumber

paypal_business = "info-facilitator@myemail.co.kr"
paypal_cmd = "_xclick"
success_url = "http://mysite.com/paypal/successTransfer.asp"
cancel_url = "http://mysite.com/paypal/cancelTransfer.asp"
notify_url = "http://mysite.com/paypal/notify.asp"
paypal_charset = "UTF-8"
paypal_currencyType = "USD"
paypal_amount = "50"
paypal_itemName = "꽃바구니"
paypal_quantity = "5"
paypal_itemNumber = "12345"

Dim url
url = "https://www.sandbox.paypal.com/cgi-bin/webscr"
	url = url & "?cmd=" & paypal_cmd
	url = url & "&business=" & paypal_business
	url = url & "&return=" & success_url
	url = url & "¬ify_url=" & notify_url
	url = url & "&cancel_return=" & cancel_url
	url = url & "&quantity=" & paypal_quantity
	url = url & "&item_name=" & paypal_itemName
	url = url & "&item_number=" & paypal_itemNumber
	url = url & "&amount=" & paypal_amount
	url = url & "&charset" & paypal_charset
	url = url & "&no_shipping=1"
	url = url & "&no_note=0"
	url = url & "¤cy_code=" & paypal_currencyType
response.redirect url
%>


한개의 url 변수에 계속 string을 이어 붙여서 표현할 수 있기 때문에 간편하다는 장점이 있다.




POST의 경우

<%@ CODEPAGE="65001" LANGUAGE="VBSCRIPT" %>
<% session.codepage = "65001" %>
<% response.charset = "utf-8" %>

<%
'paypal variables
Dim paypal_business, paypal_cmd, success_url, cancel_url, notify_url
Dim paypal_charset, paypal_currencyType, paypal_amount, paypal_itemName, paypal_quantity, paypal_itemNumber

paypal_business = "info-facilitator@myemail.co.kr"
paypal_cmd = "_xclick"
success_url = "http://mysite.com/paypal/successTransfer.asp"
cancel_url = "http://mysite.com/paypal/cancelTransfer.asp"
notify_url = "http://mysite.com/paypal/notify.asp"
paypal_charset = "UTF-8"
paypal_currencyType = "USD"
paypal_amount = "50"
paypal_itemName = "꽃바구니"
paypal_quantity = "5"
paypal_itemNumber = "12345"
%>
<!DOCTYPE html>
<html lang="ko">
<head>
	<meta charset="utf-8">
	<title>paypal</title>
	
	<script type="text/javascript">
		function init_orderid()
		{
			var frm = document.paypal_form;
			var url = "https://www.sandbox.paypal.com/cgi-bin/webscr";
			frm.action = url;
			frm.submit();
		}
	</script>
	
</head>
<body onload="init_orderid();">
	<form method="POST" name="paypal_form">
		<input type="text" name="business" value="<%=paypal_business%>" />
		<input type="text" name="cmd" value="<%=paypal_cmd%>" />
		<input type="text" name="return" value="<%=success_url%>" />
		<input type="text" name="notify_url" value="<%=notify_url%>" />
		<input type="text" name="cancel_return" value="<%=cancel_url%>" />
		<input type="text" name="quantity" value="<%=paypal_quantity%>" />
		<input type="text" name="item_name" value="<%=paypal_itemName%>" />
		<input type="text" name="item_number" value="<%=paypal_itemNumber%>" />
		<input type="text" name="amount" value="<%=paypal_amount%>" />
		<input type="text" name="charset" value="<%=paypal_charset%>" />
		<input type="text" name="currency_type" value="<%=paypal_currencyType%>" />
	</form>
</body>
</html>


HTML에 한번 바인딩하여 사용한다. 자동으로 submit 해주는 부분은 body가 onload되었을 때 자바스크립트에서 처리 해 준다.


다음 시간에는 IPN 수신 방법을 설정하는 내용으로 포스팅.







댓글