詳解Laravel接入paypal支付

paypal

PayPal, 全球眾多用戶使用的國際貿易支付工具, 能夠輕松完成境外收付款! 一個賬戶全球通用, 成為PayPal商家, 就能在任何地方接受更多付款方式。

下載paypal sdk

composer.json 中加入 “paypal/rest-api-sdk-php” : “1.7.4”,如圖:

詳解Laravel接入paypal支付

執行composer update

注冊開發者賬號,創建測試應用,測試賬戶

地址:

https://developer.paypal.com

創建沙盒測試賬戶

賬號后臺(可以看到自己的消費記錄):

https://www.sandbox.paypal.com/signin?returnUri=https%3A%2F%2Fwww.sandbox.paypal.com%2Fmyaccount%2Fsummary&state=%2F

創建應用

詳解Laravel接入paypal支付

查看應用配置

點擊創建的應用,查看配置Client ID,Secret,后面請求接口需要用到,sandbox為測試環境,live為線上環境

詳解Laravel接入paypal支付

新建測試賬號

可設置金額及密碼

詳解Laravel接入paypal支付

接入代碼

下單邏輯

<?php namespace AppHttpControllersApi; use IlluminateHttpRequest; use AppHttpControllersController; use PayPalApiPayer; use PayPalApiItem; use PayPalApiItemList; use PayPalApiDetails; use PayPalApiAmount; use PayPalApiTransaction; use PayPalApiRedirectUrls; use PayPalApiPayment; use PayPalAuthOAuthTokenCredential; use PayPalExceptionPayPalConnectionException; use PayPalRestApiContext; use PayPalApiPaymentExecution; class paypalController extends Controller {     const clientId = &#39;xxxxxxxxx&#39;;//應用Client ID     const clientSecret = &#39;xxxxxxxx&#39;;//Secret     const accept_url = &#39;http://xxx.laravel.com/Api/paypal/Callback&#39;; //支付成功和取消交易的跳轉地址     const Currency = &#39;USD&#39;;//貨幣單位     protected $PayPal;     public function __construct()     {         $this->PayPal?=?new?ApiContext( ????????????new?OAuthTokenCredential( ????????????????self::clientId, ????????????????self::clientSecret ????????????) ????????); ?//如果是沙盒測試環境不設置,請注釋掉 //????????$this-&gt;PayPal-&gt;setConfig( //????????????array( //????????????????'mode'?=&gt;?'live', //????????????) //????????); ????} ????/** ?????*?@param ?????*?$product?商品 ?????*?$price?價錢 ?????*?$shipping?運費 ?????*?$description?描述內容 ?????*/ ????public?function?pay() ????{ ????????$product?=?'1123'; ????????$price?=?1; ????????$shipping?=?0; ????????$description?=?'1123123'; ????????$paypal?=?$this-&gt;PayPal; ????????$total?=?$price?+?$shipping;//總價 ????????$payer?=?new?Payer(); ????????$payer-&gt;setPaymentMethod('paypal'); ????????$item?=?new?Item(); ????????$item-&gt;setName($product)-&gt;setCurrency(self::Currency)-&gt;setQuantity(1)-&gt;setPrice($price);? ????????$itemList?=?new?ItemList(); ????????$itemList-&gt;setItems([$item]); ????????$details?=?new?Details(); ????????$details-&gt;setShipping($shipping)-&gt;setSubtotal($price); ????????$amount?=?new?Amount(); ????????$amount-&gt;setCurrency(self::Currency)-&gt;setTotal($total)-&gt;setDetails($details); ????????$transaction?=?new?Transaction(); ????????$transaction-&gt;setAmount($amount)-&gt;setItemList($itemList)-&gt;setDescription($description)-&gt;setInvoiceNumber(uniqid()); ????????$redirectUrls?=?new?RedirectUrls(); ????????$redirectUrls-&gt;setReturnUrl(self::accept_url?.?'?success=true')-&gt;setCancelUrl(self::accept_url?.?'/?success=false'); ????????$payment?=?new?Payment(); ????????$payment-&gt;setIntent('sale')-&gt;setPayer($payer)-&gt;setRedirectUrls($redirectUrls)-&gt;setTransactions([$transaction]); ????????try?{ ????????????$payment-&gt;create($paypal); ????????}?catch?(PayPalConnectionException?$e)?{ ????????????echo?$e-&gt;getData(); ????????????die(); ????????} ????????$approvalUrl?=?$payment-&gt;getApprovalLink(); ????????header("Location:?{$approvalUrl}"); ????}

走完下單邏輯會跳轉到paypal的支付頁面,第一次需要輸入賬號密碼,如圖:

詳解Laravel接入paypal支付

進入支付頁面,選擇Paypal余額支付,支付完成或取消交易會自動跳轉到你下單時傳的跳轉地址,并會傳兩個參數 paymentId(paypal訂單號),PayerID(用戶id),你可以根據你的業務邏輯寫對應邏輯,一般同步回調確認用戶是否付款,異步回調處理業務邏輯

同步回調

?/** ?????*?回調 ?????*/ ????public?function?Callback() ????{ ????????$success?=?trim($_GET['success']); ????????if?($success?==?'false'?&amp;&amp;?!isset($_GET['paymentId'])?&amp;&amp;?!isset($_GET['PayerID']))?{ ????????????echo?'取消付款';die; ????????} ????????$paymentId?=?trim($_GET['paymentId']); ????????$PayerID?=?trim($_GET['PayerID']); ????????if?(!isset($success,?$paymentId,?$PayerID))?{ ????????????echo?'支付失敗';die; ????????} ????????if?((bool)$_GET['success']?===?'false')?{ ????????????echo??'支付失敗,支付ID【'?.?$paymentId?.?'】,支付人ID【'?.?$PayerID?.?'】';die; ????????} ????????$payment?=?Payment::get($paymentId,?$this-&gt;PayPal); ????????$execute?=?new?PaymentExecution(); ????????$execute-&gt;setPayerId($PayerID); ????????try?{ ????????????$payment-&gt;execute($execute,?$this-&gt;PayPal); ????????}?catch?(Exception?$e)?{ ????????????echo?',支付失敗,支付ID【'?.?$paymentId?.?'】,支付人ID【'?.?$PayerID?.?'】';die; ????????} ????????echo?'支付成功,支付ID【'?.?$paymentId?.?'】,支付人ID【'?.?$PayerID?.?'】';die; ????}

異步回調

回調地址配置在后臺,地址必須為https開頭,設置一般過一段時間才會生效(我是下午申請,第二天上午才生效的,如圖:

詳解Laravel接入paypal支付

你可以勾選很多事件發送通知,不過最重要的還是支付完成(Payment sale completed)以及退款(Payment sale refunded)

支付完成

public?function?notify(){ ????????//獲取回調結果 ????????$json_data?=?$this-&gt;get_JsonData(); ????????if(!empty($json_data)){ ?????????????Log::debug("paypal?notify?info:rn".json_encode($json_data)); ????????}else{ ????????????Log::debug("paypal?notify?fail:參加為空"); ????????} ??????????//自己打印$json_data的值看有那些是你業務上用到的 ??????????//比如我用到 ??????????$data['invoice']?=?$json_data['resource']['invoice_number']; ??????????$data['txn_id']?=?$json_data['resource']['id']; ??????????$data['total']?=?$json_data['resource']['amount']['total']; ??????????$data['status']?=?isset($json_data['status'])?$json_data['status']:''; ??????????$data['state']?=?$json_data['resource']['state']; ????????try?{ ?????????????????//處理相關業務 ????????}?catch?(Exception?$e)?{ ????????????//記錄錯誤日志 ????????????Log::error("paypal?notify?fail:".$e-&gt;getMessage()); ????????????return?"fail"; ????????} ????????return?"success"; ????} ????public?function?get_JsonData(){ ????????$json?=?file_get_contents('php://input'); ????????if?($json)?{ ????????????$json?=?str_replace("'",?'',?$json); ????????????$json?=?json_decode($json,true); ????????} ????????return?$json; ????}

處理退款

public?function?returnMoney() ????{ ????????try?{ ????????????$txn_id?=?"xxxxxxx";??//異步加調中拿到的id ????????????$amt?=?new?Amount(); ????????????$amt-&gt;setCurrency('USD') ????????????????-&gt;setTotal('99');??//?退款的費用 ????????????$refund?=?new?Refund(); ????????????$refund-&gt;setAmount($amt); ????????????$sale?=?new?Sale(); ????????????$sale-&gt;setId($txn_id); ????????????$refundedSale?=?$sale-&gt;refund($refund,?$this-&gt;PayPal); ????????}?catch?(Exception?$e)?{ ????????????//?PayPal無效退款 ????????????return?json_decode(json_encode(['message'?=&gt;?$e-&gt;getMessage(),?'code'?=&gt;?$e-&gt;getCode(),?'state'?=&gt;?$e-&gt;getMessage()]));??//?to?object ????????} ????????//?退款完成 ????????return?$refundedSale;? ????}

查看相關流水

詳解Laravel接入paypal支付

總結

paypal對于擴展海外支付的業務還是很有幫助的,它支持多種貨幣,可綁定各種信用卡,銀行卡,缺點是接入時不會有paypal技術人員和你對接,反正我是在接入完成之后才聯系到paypal對接人的,好在接入難度不大,網上資料比較豐富,希望此文章可以給各位帶來幫助,對于海外支付有興趣的可以和我來討論。

相關教程推薦:《laravel

? 版權聲明
THE END
喜歡就支持一下吧
點贊13 分享