paypal
PayPal, 全球眾多用戶使用的國際貿易支付工具, 能夠輕松完成境外收付款! 一個賬戶全球通用, 成為PayPal商家, 就能在任何地方接受更多付款方式。
下載paypal sdk
在 composer.json 中加入 “paypal/rest-api-sdk-php” : “1.7.4”,如圖:
執行composer update
注冊開發者賬號,創建測試應用,測試賬戶
地址:
https://developer.paypal.com
創建沙盒測試賬戶
賬號后臺(可以看到自己的消費記錄):
https://www.sandbox.paypal.com/signin?returnUri=https%3A%2F%2Fwww.sandbox.paypal.com%2Fmyaccount%2Fsummary&state=%2F
創建應用
查看應用配置
點擊創建的應用,查看配置Client ID,Secret,后面請求接口需要用到,sandbox為測試環境,live為線上環境
新建測試賬號
可設置金額及密碼
接入代碼
下單邏輯
<?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 = 'xxxxxxxxx';//應用Client ID const clientSecret = 'xxxxxxxx';//Secret const accept_url = 'http://xxx.laravel.com/Api/paypal/Callback'; //支付成功和取消交易的跳轉地址 const Currency = 'USD';//貨幣單位 protected $PayPal; public function __construct() { $this->PayPal?=?new?ApiContext( ????????????new?OAuthTokenCredential( ????????????????self::clientId, ????????????????self::clientSecret ????????????) ????????); ?//如果是沙盒測試環境不設置,請注釋掉 //????????$this->PayPal->setConfig( //????????????array( //????????????????'mode'?=>?'live', //????????????) //????????); ????} ????/** ?????*?@param ?????*?$product?商品 ?????*?$price?價錢 ?????*?$shipping?運費 ?????*?$description?描述內容 ?????*/ ????public?function?pay() ????{ ????????$product?=?'1123'; ????????$price?=?1; ????????$shipping?=?0; ????????$description?=?'1123123'; ????????$paypal?=?$this->PayPal; ????????$total?=?$price?+?$shipping;//總價 ????????$payer?=?new?Payer(); ????????$payer->setPaymentMethod('paypal'); ????????$item?=?new?Item(); ????????$item->setName($product)->setCurrency(self::Currency)->setQuantity(1)->setPrice($price);? ????????$itemList?=?new?ItemList(); ????????$itemList->setItems([$item]); ????????$details?=?new?Details(); ????????$details->setShipping($shipping)->setSubtotal($price); ????????$amount?=?new?Amount(); ????????$amount->setCurrency(self::Currency)->setTotal($total)->setDetails($details); ????????$transaction?=?new?Transaction(); ????????$transaction->setAmount($amount)->setItemList($itemList)->setDescription($description)->setInvoiceNumber(uniqid()); ????????$redirectUrls?=?new?RedirectUrls(); ????????$redirectUrls->setReturnUrl(self::accept_url?.?'?success=true')->setCancelUrl(self::accept_url?.?'/?success=false'); ????????$payment?=?new?Payment(); ????????$payment->setIntent('sale')->setPayer($payer)->setRedirectUrls($redirectUrls)->setTransactions([$transaction]); ????????try?{ ????????????$payment->create($paypal); ????????}?catch?(PayPalConnectionException?$e)?{ ????????????echo?$e->getData(); ????????????die(); ????????} ????????$approvalUrl?=?$payment->getApprovalLink(); ????????header("Location:?{$approvalUrl}"); ????}
走完下單邏輯會跳轉到paypal的支付頁面,第一次需要輸入賬號密碼,如圖:
進入支付頁面,選擇Paypal余額支付,支付完成或取消交易會自動跳轉到你下單時傳的跳轉地址,并會傳兩個參數 paymentId(paypal訂單號),PayerID(用戶id),你可以根據你的業務邏輯寫對應邏輯,一般同步回調確認用戶是否付款,異步回調處理業務邏輯
同步回調
?/** ?????*?回調 ?????*/ ????public?function?Callback() ????{ ????????$success?=?trim($_GET['success']); ????????if?($success?==?'false'?&&?!isset($_GET['paymentId'])?&&?!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->PayPal); ????????$execute?=?new?PaymentExecution(); ????????$execute->setPayerId($PayerID); ????????try?{ ????????????$payment->execute($execute,?$this->PayPal); ????????}?catch?(Exception?$e)?{ ????????????echo?',支付失敗,支付ID【'?.?$paymentId?.?'】,支付人ID【'?.?$PayerID?.?'】';die; ????????} ????????echo?'支付成功,支付ID【'?.?$paymentId?.?'】,支付人ID【'?.?$PayerID?.?'】';die; ????}
異步回調
回調地址配置在后臺,地址必須為https開頭,設置一般過一段時間才會生效(我是下午申請,第二天上午才生效的,如圖:
你可以勾選很多事件發送通知,不過最重要的還是支付完成(Payment sale completed)以及退款(Payment sale refunded)
支付完成
public?function?notify(){ ????????//獲取回調結果 ????????$json_data?=?$this->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->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->setCurrency('USD') ????????????????->setTotal('99');??//?退款的費用 ????????????$refund?=?new?Refund(); ????????????$refund->setAmount($amt); ????????????$sale?=?new?Sale(); ????????????$sale->setId($txn_id); ????????????$refundedSale?=?$sale->refund($refund,?$this->PayPal); ????????}?catch?(Exception?$e)?{ ????????????//?PayPal無效退款 ????????????return?json_decode(json_encode(['message'?=>?$e->getMessage(),?'code'?=>?$e->getCode(),?'state'?=>?$e->getMessage()]));??//?to?object ????????} ????????//?退款完成 ????????return?$refundedSale;? ????}
查看相關流水
總結
paypal對于擴展海外支付的業務還是很有幫助的,它支持多種貨幣,可綁定各種信用卡,銀行卡,缺點是接入時不會有paypal技術人員和你對接,反正我是在接入完成之后才聯系到paypal對接人的,好在接入難度不大,網上資料比較豐富,希望此文章可以給各位帶來幫助,對于海外支付有興趣的可以和我來討論。
相關教程推薦:《laravel》