티스토리 뷰
paypal IPN 처리를 하지 않았을 경우 문제점
paypal의 결제가 완료 되었을 때 return 페이지로 가도록 되어있다. 결제가 잘 되어서 return으로 설정 한 페이지로 가면
아무 문제가 없겠지만, 단순히 return된 페이지로 처리하기엔 아주 큰 문제점이 존재한다.
첫번째. 결제가 마무리된 URL로 바로 접근 할 경우, "보안"과 "오작동"의 문제.
악의적인 목적을 가진 사용자가 URL로 접근하여 서버사이드 페이지를 강제로 호출하게 됨으로써 일어나는 문제이다.
두번째. 결제가 완료 되었다 한들 'complete'인지 'refund'인지는 아직 모른다. 그저 일련의 과정이 모두 종료되고 return으로 등록한
페이지를 호출하여 처리하는 것이다. 결제가 되던 안되던 간에.
paypal IPN 수신 흐름
1. 클라이언트 -> 2. paypal 결제 페이지 호출 -> 3. paypal에서 -> 4-1. 클라이언트 페이지 호출 (return 혹은 cancel)
-> 3. paypal에서 -> 4-2. 서버 페이지 호출 (IPN)
페이팔의 결제 호출 흐름이다.
3번과 4-1, 4-2를 살펴보면 값을 수신하는 주체(대상이)가 다르므로 우리는 IPN을 클라이언트에서 바로 확인하려 해도 볼 수 가 없다.
그러므로 "3. paypal" 결제 페이지를 호출할때 unique ID, 세션정보 혹은 거래번호 등을 넘겨주고 "4-2. IPN"이 호출되면
먼저 결제가 complete로 잘 처리되었는지 확인하고 아까 넘겼던 unique ID, 세션정보 혹은 거래번호 를 다시 받아서
SQL의 select로 장바구니에 있던 리스트를 이제 실제 주문 테이블에 insert 하고 최종 승인(SMS나 SMTP-eMail 등)처리를 하면 된다.
paypal 결제가 잘 되었습니다.
1번에서 2번으로 넘어갈 때 새창으로 띄웠다는 전제하에 결제가 완료 되어 "완료되었습니다!" 하고 4-1에서 알려주는게 가장 좋지만...
호출 시점의 차이와 확인 절차가 필요하기 때문에 완료 페이지를 만들기가 쉽지 않다.
예를들어 데이터의 흐름이 4-2를 통해 IPN에서 받은 값을 유니크 키로 SQL에 insert 해서 4-1에서 유니크 키로 조회 했을때 정상 테이블
정보가 있었다면 문제가 없겠지만 반대로 4-1이 실행되는 동안 4-2의 처리가 지연되거나 하는 경우 문제가 생긴다는 점이다.
이에 관련한 처리는 나중에 포스팅 하겠다.
따라서 일단 return 페이지는 메인 페이지로 해놓고(return 이 무조건 결제가 잘 완료되었다는 보장이 없음) 위에 언급했듯이 4-2에서
최종 승인 SMS, SMTP 서비스를 통해 공지 하는것이 흐름상 오류가 없다.
IPN 어떻게 수신하나
IPN에서크게 두가지 방법이 있다. 그 중 하는 사이트에서 직접 받을 URL을 지정하는 것이다. 장단점이 각각 다르다.
1. 사이트에서 URL 지정하기
ㄱ-1. 먼저 https://developer.paypal.com/ 으로 로그인 한뒤 Application > Sandbox accounts > Enter Sandbox site를 클릭한다.
ㄱ-2. 혹은 https://www.sandbox.paypal.com 에서 계정이 아닌 테스트ID (id-facilitator@myemail.com 과 같은)로 로그인 한다.
ㄴ. My Account 화면이 뜰 것이다.
ㄷ. Profile > My Selling Tools 를 클릭하면
ㄹ. Getting paid and managing my risk 항목에서 > Instant payment notificationsIntegrate PayPal payment notifications with
my website. 를 클릭.
ㅁ. Edit settings를 클릭
ㅂ. Notification 에 IPN이 호출되어 수신할 URL적어주고 IPN messsages에 Receive IPN messages (Enabled) 체크 한 뒤 Save.
2. 호출할 때 notify_url 항목에 URL 지정하기
저번 시간에 살펴 본 것과 같이 그냥 notify_url 항목에 URL을 기입하면 된다.
<input type="index" name="notify_url" value="http://www.mySite/paypal/complete.asp" size="50" /><br />
* 주의 할 점은 사이트에도 등록하고 notify_url에도 url을 적으면 페이지를 두 번 호출하게 된다.
'■ 개발관련 ■ > PayPal' 카테고리의 다른 글
05. IPN수신 페이지(notify_url)의 처리방법 (작성 중) (7) | 2014.04.29 |
---|---|
03. 페이팔 수수료 확인과 USD환율 적용하기 (0) | 2014.04.22 |
02. paypal에서 "한글"을 전달할 때 유의사항과 값 넘기기 (0) | 2014.04.18 |
01. paypal의 테스트 ID만들고, 결제 창 띄워 보기 (6) | 2014.04.16 |