티스토리 뷰
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 수신 방법을 설정하는 내용으로 포스팅.
'■ 개발관련 ■ > PayPal' 카테고리의 다른 글
05. IPN수신 페이지(notify_url)의 처리방법 (작성 중) (7) | 2014.04.29 |
---|---|
04. paypal의 "IPN" 수신하는 2가지 방법 (2) | 2014.04.24 |
03. 페이팔 수수료 확인과 USD환율 적용하기 (0) | 2014.04.22 |
01. paypal의 테스트 ID만들고, 결제 창 띄워 보기 (6) | 2014.04.16 |