paypal php 對接


項目需要要在php中使用paypal支付。

先吐槽下paypal,以前做過國內的一些支付接口,有些經驗。想到的是直接找paypal客服要接口文檔。

尼瑪加paypal客服QQ  不在線。幾天如此。這么大的支付居然沒技術支持,真不能理解。文檔后面還是在官網7找8找才找到了。

 

正文:

首先要在sandbox環境申請主帳號。連接:https://developer.paypal.com/

申請后用主帳號登錄申請賣家以及買家帳號。然后進行一些設置。

注意:如果買家是國外的,那么創建買家帳號的時候就要設置所在國家。這樣在支付頁面才會以該國家的語言顯示界面。

申請帳號以及設置問題請參考文檔  連接:https://www.paypal-biz.com/development/documentation/PayPal_Sandbox_Guide_CN_V2.0.pdf

 

支付過程首先第一步是提交表單給paypal 當然post方式。

<form id="form_starPay" name="form_starPay" action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_xclick"> //告訴paypal該表單是立即購買
<input type="hidden" name="business" value="XXXXXX@XXXXX.com"> //賣家帳號  也就是收錢的帳號
<input type="hidden" name="item_name" value="name"> //商品名稱
<input type="hidden" name="amount" value="10000"> //價格
<input type="hidden" name="currency_code" value="JPY"> //幣種
<input type="hidden" name="return" value="http://localhost/frontend/pay/PDT_order"> //支付成功后網頁跳轉地址
<input type="hidden" name="notify_url" value="http://localhost/frontend/pay/IPN_Order"> //支付成功后paypal后台發送訂單通知地址
<input type="hidden" name="invoice" value=""> //自定義訂單號 paypal原樣返回
<input type="hidden" name="custom" value=""> // 自定義變量 paypal原樣返回
<input type="hidden" name="lc" value="JP"> //支付頁面語言設置
<input style="visibility:hidden" type="image" src=" https://www.paypal.com/en_US/i/btn/btn_buynow_LG.gif " border="0" name="submit" alt=" PayPal - The safer, easier way to pay online">//支付按鈕

</form>

當支付成功后 paypal就會跳轉到我們設置的 “return” 地址,會帶上一個流水號 我們get方式就可以取到值。流水號鍵名 “tx”。

拿到流水號然后加上身份標識跟cmd變量就可以到paypal請求剛才支付的訂單的交易內容。

例如:cmd=_notify-synch&tx=123sflsfjlw12&tx_token=fsfljvw3lwejloj43jfvdflf2

cmd=_notify-synch是告訴paypal你要做什么,這里是查詢訂單交易。

tx_token值要在paypal后台取,剛才注冊帳號的時候要開通pdt功能才行。

這個過程paypal稱為:PDT (Payment Data Transfer 付款數據傳輸)。

我們接收到返回的一些數據后就可以進行一些支付后的操作,比如發金幣,發貨等等。

pdt 詳細的返回參數最后給出文檔。

代碼:

<?php 
//獲取 PayPal 交易流水號 tx 
$tx_token = $_GET['tx']; 
//定義您的身份標記 
$auth_token = "CHANGE-TO-YOUR-TOKEN"; 
//形成驗證字符串 
$req = " cmd=_notify-synch&tx=$tx_token&at=$auth_token"; 
//將交易流水號及身份標記返回 PayPal 驗證 
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n"; 
$header .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; 
$fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30); 
if (!$fp) { 
// HTTP ERROR 
} else { 
fputs ($fp, $header . $req); 
//獲取返回數據 
$res = ''; 
$headerdone = false; 
while (!feof($fp)) { 
$line = fgets ($fp, 1024); 
if (strcmp($line, "\r\n") == 0) { 
//獲取頭 
$headerdone = true; 
}else if ($headerdone){ 
//獲取主體內容 
$res .= $line; 
} 
} 
//解析獲取內容 
$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); 
} 
//檢查交易付款狀態 payment_status 是否為  „Completed‟ 
//檢查交易流水號 txn_id 是否已經被處理過 
//檢查接收 EMAIL receiver_email 是否為您的 PayPal 中已經注冊的 EMAIL 
//檢查金額 mc_gross 是否正確 
//…… 
//處理此次付款明細 
//該付款明細所有變量可參考: 
//https://www.paypal.com/IntegrationCenter/ic_ipn-pdt-variable-reference.html 
$name = $keyarray['first_name'] . ' ' . $keyarray['last_name']; 
$itemname = $keyarray['item_name']; 
$amount = $keyarray['mc_gross']; 
echo ("<p><h3>Thank you for you purchase!</h3></p>"); 
echo ("<b>Payment Details:</b><br>\n"); 
echo ("<li>Name: $name</li>\n"); 
echo ("<li>Item: $itemname</li>\n"); 
echo ("<li>Amount: $amount</li>\n"); 
}else if (strcmp ($lines[0], "FAIL") == 0) { 
//獲取付款明細失敗,記錄並檢查 
} 
} 
fclose ($fp); 
?> 

 

 

為了防止用戶關掉瀏覽器,訂單通知不到的情況。paypal還提供了一種通知方式:IPN (Instant Payment Notification 即時付款通知);

IPN 是在后台進行http請求通知。

當開通了ipn功能,並且訂單狀態發生改變的時候,paypal會主動請求我們支付表單中變量“notify_url”提供的地址。

我們在接收到paypal請求后要拿到所有的數據

然后用 “cmd=_notify-validate”加上剛才的數據,http發送給paypal進行驗證,以防請求是偽造的。

代碼:

<?php 
//從 PayPal 出讀取 POST 信息同時添加變量„cmd‟ 
$req = 'cmd=_notify-validate'; 
foreach ($_POST as $key => $value) { 
$value = urlencode(stripslashes($value)); 
$req .= "&$key=$value"; 
} 
//建議在此將接受到的信息記錄到日志文件中以確認是否收到 IPN 信息 
//將信息 POST 回給 PayPal 進行驗證 
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n"; 
$header .= "Content-Type:application/x-www-form-urlencoded\r\n"; 
$header .= "Content-Length:" . strlen($req) ."\r\n\r\n"; 
//在 Sandbox 情況下,設置: 
//$fp = fsockopen(„www.sandbox.paypal.com‟,80,$errno,$errstr,30); 
$fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30); 
//將 POST 變量記錄在本地變量中 
//該付款明細所有變量可參考: 
//https://www.paypal.com/IntegrationCenter/ic_ipn-pdt-variable-reference.html 
$item_name = $_POST['item_name']; 
$item_number = $_POST['item_number']; 
$payment_status = $_POST['payment_status']; 
$payment_amount = $_POST['mc_gross']; 
$payment_currency = $_POST['mc_currency']; 
$txn_id = $_POST['txn_id']; 
$receiver_email = $_POST['receiver_email']; 
$payer_email = $_POST['payer_email']; 
//… 
//判斷回復 POST 是否創建成功 
if (!$fp) { 
//HTTP 錯誤 
}else { 
//將回復 POST 信息寫入 SOCKET 端口 
fputs ($fp, $header .$req); 
//開始接受 PayPal 對回復 POST 信息的認證信息 
while (!feof($fp)) { 
$res = fgets ($fp, 1024); 
//已經通過認證 
if (strcmp ($res, "VERIFIED") == 0) { 
//檢查付款狀態 
//檢查 txn_id 是否已經處理過 
//檢查 receiver_email 是否是您的 PayPal 賬戶中的 EMAIL 地址 
//檢查付款金額和貨幣單位是否正確 
//處理這次付款,包括寫數據庫 
}else if (strcmp ($res, "INVALID") == 0) { 
//未通過認證,有可能是編碼錯誤或非法的 POST 信息 
} 
} 
fclose ($fp); 
} 
?> 

 

接口對接就這樣好了,搞清楚了流程很簡單。

如果幣種不是paypal默認的,在訂單支付后訂單狀態一直是pending, 用賣家帳號登錄在訂單狀態哪里點擊接收,paypal就會自動設置接收該幣種功能。

技術文檔地址:https://www.paypal-biz.com/developer/documentation/2134.html

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM