안녕하세요.
영카트에 페이팔 연동 작업을 완료하면서, 도움 되실분이 있을까 하고 정리합니다.
작업 순서는 1번부터 보시면 됩니다. (최대한 심플하게!!)
1. www.paypal.com 계정 생성.
2. https://developer.paypal.com/ 접속
3. https://developer.paypal.com/developer/accounts/ 페이지에서 create Account 클릭.
- country > united states :: 국가는 상관이 없다. 기본꺼 쓰자..
- account type > business :: 비지니스 계정으로 생성하면
- email > test@web.com :: 테스트 이메일 추가
- password
- paypal balance > 999999 :: 금액 최대한.. 부럽..
--> create Account를 눌러 계정을 생성.
4. 계정을 생성하면 sandbox accounts 테이블안에 personal 계정과 business 계정이 생성됩니다.
- personal 계정은 돈을 보내는 계정
- business 계정은 돈을 받는 계정
5. 4번까지 계정을 완료 했다면 60%는 완료했다고 보면 됩니다. 6번 가시죠. (영카트 연동 시작부분)
6. 영카트는 WebRoot/shop 폴더를.. (다 아시겠다고 생각하고 script 이름만 알려드리겠습니다. ).
WebRoot/shop/orderform.sub.php :: 영카트 기본 주문서 작성 페이지에서 페이팔을 선택할 수 있게 라디오박스를 만듭니다.
- $multi_settle++; :: 결제(신용카드, 무통장입금등등)를 사용할 때 마다 ++ 시켜줌..
echo '<input type="radio" id="od_settle_paypal" name="od_settle_case" value="페이팔" '.$checked.'> <label for="od_settle_paypal">페이팔 </label>'.PHP_EOL; :: 페이팔 라디오박스 추가
$checked = ''; :: checked 풀죠.
7. 6번을 진행하시면 주문서 작성 페이지 하단 보시면 페이팔 라디오박스가 하나 생성됩니다.
8. 페이팔 라디오박스를 선택하고 주문하기를 누르면 orderformupdate.php 를 form으로 부르는데 이 때 $od_settle_case이 페이팔일 경우 컨트롤 합니다.
- 기존은 goto_url(G5_SHOP_URL.'/orderinquiryview.php?od_id='.$od_id.'&uid='.$uid); 이 url로 바로 갔지만 페이팔 일 경우 order_paypal.php(제가 만든 스크립트)를 부르게합니다.
- if($od_settle_case == "페이팔"){
goto_url(G5_SHOP_URL.'/order_paypal.php?od_id='.$od_id);
}else{
goto_url(G5_SHOP_URL.'/orderinquiryview.php?od_id='.$od_id.'&uid='.$uid);
}
9. order_paypal.php 소스입니다.
# 테스트 URL
$pp_url = "https://www.sandbox.paypal.com/cgi-bin/webscr";
$recv_mail = "test@web.com ; :: 좀 전에 비지니스 계정 넣으세요. pp_url에 sandbox가 붙으면 테스트 계정이라 보시면 됩니다.
# 상용 URL
# $pp_url = "https://www.paypal.com/cgi-bin/webscr";
# $recv_mail = "; :: 상용일 때 실제 계정..
$usd_api = shell_exec("curl -k https://api.manana.kr/exchange/rate/KRW/USD.json"); :: 실시간 환율 적용
//echo $use_api."\n";
$usd_arr = json_decode($usd_api, true);
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="<?=$recv_mail?>">
<input type="hidden" name="item_name" value="<?php echo $it_name;?>"> :: 상품 이름
<input type="hidden" name="item_number" value="<?php echo $od_id;?>"> :: 상품 아이디
<input type="hidden" name="currency_code" value="USD">
<input type="hidden" name="amount" value="<?php echo ($tot_sell_price/$paypal_usd);?>"> :: 상품가격 / 환율
<input type="hidden" name="charset" value="UTF-8">
<!--<input type="image" name="submit" border="0" src="https://www.paypalobjects.com/en_US/i/btn/btn_buynow_LG.gif" alt="PayPal - The safer, easier way to pay online">
-->
</form>
9. 8번에서 form.submit을 하게 되면 paypal 페이지로 리다이렉트가 됩니다. 여기서 personal 계정으로 결제를 해봅시다.
- 결제를 하기 전에 페이팔 결제가 완료되면 현재 서버로 리다이렉트가 가능하며 그 리다이렉트의 파라미터를 이용해서 결제 완료시 상품 완불 처리 하고 G5_SHOP_URL.'/orderinquiryview.php 페이지로 옮겨보죠.
- https://www.sandbox.paypal.com/ 접속 :: 비지니스 계정으로 로그인.
- 오른쪽 상단 profile > profile and settings
- 왼쪽 사이드 메뉴에서 My selling toos > website preferences > update
- auto return > on
- return URL > return 받을 서버를 넣으세요.
- payment data transfer > on
--> save
10. My selling toos > website preferences > update 들어가시면 Identity Token 이 생겼을 겁니다. 그거 저장. ( 90프로 완료)
11. personal 계정으로 결제 완료시 9번에서 추가한 return url로 옮겨지게 됩니다.
12. paypal_callback.php 소스입니다. :: 리턴 url >> 해당 소스는 인터넷에서 찾아보시면 있습니다.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
$pp_hostname = "www.sandbox.paypal.com";
$auth_token = ""; :: 10 번에 token 넣어주세요.
# 상용 서버
# $pp_hostname = "www.paypal.com";
# $auth_token = "";
$req = 'cmd=_notify-synch';
$tx_token = $_REQUEST['tx'];
$req .= "&tx=$tx_token&at=$auth_token";
$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, 0); // 0 error 시 1로 변경하세요.
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Host: $pp_hostname"));
$res = curl_exec($ch);
curl_close($ch);
if(!$res){
//HTTP ERROR
echo "Paypal 서버 연동 오류가 발생했습니다.";
exit;
}else{
$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'];
} else if (strcmp ($lines[0], "FAIL") == 0) {
echo ("<p><h3>결제오류가 발생했습니다!</h3></p>");
}
goto_url(G5_SHOP_URL.'/orderinquiryview.php?od_id='.$_REQUEST["item_number"]); // 상품 정보
13. 완료
- 실시간으로 api를 통해서 환율을 적용.
- 기존 영카트의 프로세스를 따라서 적용.
- 개인적인 코드는 삭제하였습니다. 완불 처리라던지, status를 입금으로 변경하는거는 12번에서 컨트롤 하시면 됩니다.
- 생각보다 쉬움...