안녕하세요.


영카트에 페이팔 연동 작업을 완료하면서, 도움 되실분이 있을까 하고 정리합니다.


작업 순서는 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.'&amp;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.'&amp;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번에서 컨트롤 하시면 됩니다.

  - 생각보다 쉬움...



+ Recent posts