상세 컨텐츠

본문 제목

페이팔(Paypal) 웹방식 연동하기 - 3. 결제결과 전달받기

프로그램개발/web

by fsteam 2014. 7. 20. 11:42

본문

paypal과 연동하고 사용자가 결제한 결과를 리턴받기 위해서는 paypal에 몇가지 설정이 필요하다. 이러한 기능은 PDT(Payment Data Transfer) 또는 IPN(Instant Payment Notification)을 통해서 처리할 수 있으며 이 두가지 모두 결제 결과를 우리의 서버에게 보내준다는 것은 동일하다. 하지만  다음과 같은 차이점과 장단점이 존재한다.


구분 

 PDT

 IPN

 차이점

 실시간으로 결제 결과를 결제를 요청한 서버로 전송해 준다. (동기 방식 - sync)

 paypal 서버에 이벤트를 보관해 두었다가 결제요청 서버로 전송해 준다. (비동기 방식 - async)

장점 

 결제처리 완료 후 즉시 결과를 알수 있다.

 (컨텐츠 다운로드 시스템 등 결제결과를 즉시 알아야만 되는 서비스에 적용 가능)

 결제요청 서버에서 결과를 수신하지 못한 경우 paypal 서버에서 재전송을 해준다. (최대 약 한달까지 재전송을 시도한다.)

단점 

 일회성 이벤트로 결제요청서버에서 결과값을 수신하지 못한 경우.. 이벤트가 사라지게 된다.

 비동기 방식이므로.. 실시간 결과값을 얻는다는 보장이 없다.



[PDT 방식]




[IPN 방식]


PDT와 IPN의 장단점을 기준으로 해당 서버에 적절한 기능을 선택해서 사용하면 된다. 또는 두가지 모두를 이용할 수도 있다.

컨텐츠 다운로드 등.. 결제가 이루어진 후 사용자에게 즉시 서비스를 해주어야 되는 시스템의 경우 PDT가 적당할 것이고.. 결제가 완료되면 확인 후 물건을 배송해 주는 일반적인 쇼핑몰은 IPN을 적용하는 것이 적당할 것이다.


1. PDT 설정하기

paypal 메인화면에서 Profile -> My Selling Tools 메뉴를 선택한다.


오른쪽에서 Website preferences 메뉴를 선택한다.


PDT를 사용하기 위해서는 Auto Return 부분을 반드시 On 시켜야 된다. 그리고 아래의 Return URL 항목에 결과를 리턴받을 주소를 적어준다. 마지막으로 Payment Data Transfer 항목을 On 시키고 설정을 저장한다.


설정이 저장되면 아래와 같이 PDT에 대한 Identiry Token 이 생성된다. 이 값은 paypal 서버에서 tx값을 받은 후 다시 paypal 서버로 상세 결제결과를 요청할때 필요한 값이므로 잘 저장해 놓는다.

여기까지 진행했으면 PDT를 사용하기 위한 paypal 설정은 끝이다. 이제 paypal 서버에서 결과값을 받아서 처리해 주는 프로그램만 작성하면 된다. 아래는 PDT 결과를 받아서 처리하는 간단한 PHP 예제 소스이다. 


<?php

# 테스트 서버

$pp_hostname = "www.sandbox.paypal.com";

$auth_token = "F38mfT6OBJ_OIX_Y8u1eyyI....................SQ8JwPLpjt5oHCBtua";


# 상용 서버

// $pp_hostname = "www.paypal.com";

// $auth_token = "Yxbn0IuUwYjrXPUZL4M.....................LaUcVpk4cgcSsy3yiC";


$req = 'cmd=_notify-synch';

$tx_token = $_REQUEST['tx'];

$req .= "&tx=$tx_token&at=$auth_token";


# 수신한 tx 값과 token 값을 paypal 서버로 전송

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://$pp_hostname/cgi-bin/webscr");

curl_setopt($ch, CURLOPT_POST, 1);

curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);

curl_setopt($ch, CURLOPT_POSTFIELDS, $req);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);

curl_setopt($ch, CURLOPT_HTTPHEADER, array("Host: $pp_hostname"));

$res = curl_exec($ch);

curl_close($ch);


# 최종 결과값 분석

if(!$res){

//HTTP ERROR

echo "Paypal 서버 연동 오류가 발생했습니다.";

exit;

}else{

 // 결과값을 로그로 기록해 보기

$date_time = date("Y-m-d H:i:s");

$fp = fopen("./tmp/pp_log.txt", "a");

fwrite($fp, "\n[".$date_time."]==========================================\n");


$lines = explode("\n", $res);

$keyarray = array();

if (strcmp ($lines[0], "SUCCESS") == 0) {

   // 결제가 성공한 경우

for ($i=1; $i<count($lines);$i++){

list($key,$val) = explode("=", $lines[$i]);

$keyarray[urldecode($key)] = urldecode($val);

fwrite($fp, urldecode($key).":".urldecode($val)."\n");

}

$firstname = $keyarray['first_name'];

$lastname = $keyarray['last_name'];

$itemnumber = $keyarray['item_number'];

$itemname = $keyarray['item_name'];

$amount = $keyarray['payment_gross'];


echo ("<p><h3>결제가 잘 처리되었습니다!</h3></p>");

echo ("<b>상세 내용</b><br>\n");

echo ("<li>이름: $firstname $lastname</li>\n");

echo ("<li>주문번호: $itemnumber</li>\n");

echo ("<li>상품명: $itemname</li>\n");

echo ("<li>금액: $amount</li>\n");


} else if (strcmp ($lines[0], "FAIL") == 0) {

    // 결제가 실패한 경우

echo ("<p><h3>결제오류가 발생했습니다!</h3></p>");

}

fclose($fp);

}

?>


2. IPN 설정하기

IPN 을 사용하기 위해서는 profile -> My selling tools -> Instant payment notification 메뉴를 선택한다.


아래 화면에서 Choose IPN Settings 버튼을 눌러 다음으로 이동한다.


아래 화면이 나오면 IPN 수신할 서버의 URL을 입력하고 하단의 Receive IPN messages(Enabled) 를 선택하고 저장하면 셋팅이 완료된다. 이제 설정한 URL에서 데이터를 수신하고 처리하는 프로그램을 작성하면 된다.


관련글 더보기