參考:https://github.com/paypal/PayPal-PHP-SDK/wiki
https://blog.csdn.net/markely/article/details/79044145
最近公司做一個國際版商城,國內的支付寶和微信支付不太適用,故而選擇PayPal。PayPal在國內開發還是比較少的,不如支付寶和微信,所以沒有中文文檔,辛辛苦苦啃了好幾天終於跑通了,在這里做一下總結,方便以后再用。
PayPal在國外的市場占有率還是很高的,只是手續費之高讓人有點兒腎疼,不過這不是我關心的東西,只是實現功能。
廢話不多說,直接展示開發過程。
一、准備工作:
首先需要測試賬號,PayPal開發感覺好的一點是提供測試賬號(也叫沙箱賬號)
1、瀏覽器訪問 https://www.paypal.com/c2/home 進入PayPal官網
2、點擊注冊,根據 要求填寫信息進行注冊(easy)
3、注冊完成以后,訪問https://developer.paypal.com/
4、點擊右上角的 Log Into Dashboard 按鈕,登錄你剛才注冊的賬號,進入儀表盤
5、登錄之后點擊左側的accounts,左側頁面會顯示你的買家和買家測試賬號
6、點擊profile,會進入買家的賬戶管理,在里面可以設置密碼和金額等信息
7、點擊左上角的My apps & credentials ,出現如下頁面
8、點擊create app,創建自己的應用,這一步主要clientID和secret,在調用API接口是生成token需要這兩個值,很重要
二、准備工作做完了,要上代碼了
1、根據wiki上提供的有兩種方式下載安裝
我選擇的是composer,沒有安裝composer的童鞋自行安裝,這里不再贅述。當然也可以使用第二種方式
2、新建文件夾
3、進去后打開cmd,輸入composer require "paypal/rest-api-sdk-php:*" ,回車
4、當看到這個的時候說明下載完成
目錄結構如下:vendor目錄下是PayPal-PHP-SDK的API接口
新建目錄:目錄結構如下
payment.php
<?php
use PayPal\Api\Amount; use PayPal\Api\Details; use PayPal\Api\Item; use PayPal\Api\ItemList; use PayPal\Api\Payer; use PayPal\Api\Payment; use PayPal\Api\RedirectUrls; use PayPal\Api\ShippingAddress; use PayPal\Api\Transaction; $payer = new Payer(); $payer->setPaymentMethod("paypal"); //設置商品詳情 /** * 詳情信息:單價、收貨地址等請結合自己的業務去數據庫或者其他存儲數據的地方查詢 * 這里只是演示支付流程,不結合實際業務 */ $item1 = new Item(); $item1->setName('test pro 1') ->setCurrency('USD') ->setQuantity(1) ->setSku("testpro1_01") ->setPrice(2.3); $item2 = new Item(); $item2->setName('test pro 2') ->setCurrency('USD') ->setQuantity(5) ->setSku("testpro2_01") ->setPrice(1.1); $itemList = new ItemList(); $itemList->setItems(array($item1, $item2)); // 自定義用戶收貨地址,如果這里不定義,在支付頁面能夠修改,可能會誤操作,與用戶想等地質不一致 $address = new ShippingAddress(); $address->setRecipientName("張三") ->setLine1("小區名") ->setLine2("樓號") ->setCity("城市") ->setState("省份") ->setPhone(15211111111) //收貨電話 ->setPostalCode(000000) //郵編 ->setCountryCode('CN'); $itemList->setShippingAddress($address); //設置總價,運費等金額。注意:setSubtotal的金額必須與詳情里計算出的總金額相等,否則會失敗 $details = new Details(); $details->setShipping(1) ->setTax(2) ->setSubtotal(7.8); // 同上,金額要相等 $amount = new Amount(); $amount->setCurrency("USD") ->setTotal(10.8) ->setDetails($details); $transaction = new Transaction(); $transaction->setAmount($amount) ->setItemList($itemList) ->setDescription("Payment description") ->setInvoiceNumber(uniqid()); /** * 回調 * 當支付成功或者取消支付的時候調用的地址 * success=true 支付成功 * success=false 取消支付 */ $redirectUrls = new RedirectUrls(); $redirectUrls->setReturnUrl("http://localhost/paypal/payment/exec.php?success=true") ->setCancelUrl("http://localhost/paypal/payment/cancel.php?success=false"); $payment = new Payment(); $payment->setIntent("sale") ->setPayer($payer) ->setRedirectUrls($redirectUrls) ->setTransactions(array($transaction)); //創建支付 $payment->create($apiContext); //生成地址 $approvalUrl = $payment->getApprovalLink(); // var_dump($approvalUrl); //跳轉 header("location:" . $approvalUrl);
exec.php
<?php set_time_limit(3600); require_once('./common.php'); use PayPal\Api\Amount; use PayPal\Api\Details; use PayPal\Api\ExecutePayment; use PayPal\Api\Payment; use PayPal\Api\PaymentExecution; use PayPal\Api\Transaction; if (isset($_GET['success']) && $_GET['success'] == 'true') { $paymentId = $_GET['paymentId']; $payment = Payment::get($paymentId, $apiContext); $execution = new PaymentExecution(); $execution->setPayerId($_GET['PayerID']); $transaction = new Transaction(); $amount = new Amount(); $details = new Details(); $details->setShipping(1) ->setTax(2) ->setSubtotal(7.8); $amount->setCurrency('USD'); $amount->setTotal(10.8); $amount->setDetails($details); $transaction->setAmount($amount); $execution->addTransaction($transaction); try { $result = $payment->execute($execution, $apiContext); echo "支付成功"; } catch (Exception $ex) { echo "支付失敗"; die; } return $payment; } else { echo "PayPal返回回調地址參數錯誤"; }
common.php
<?php require_once('../vendor/autoload.php'); use PayPal\Rest\ApiContext; use PayPal\Auth\OAuthTokenCredential; // 下面為申請app獲得的clientId和clientSecret,必填項,否則無法生成token。 $clientId = 'ATnuSLiYPPpNovryQJ4ZsiD1FfR2Jelv5GBkSGNjd59Ef8SW8XEH48fFwOf7L9wcyZARGx3LanesBuvb'; $clientSecret = 'EAadzJ40KVcpBanjhdAR13N2mxPBi2O7uQYMs8h-wMga5scKmwHEyCIOLLgQk2FLEcEOc2xS5ORwyQSo'; $apiContext = new ApiContext( new OAuthTokenCredential( $clientId, $clientSecret ) ); $apiContext->setConfig( array( 'mode' => 'sandbox', 'log.LogEnabled' => true, 'log.FileName' => '../PayPal.log', 'log.LogLevel' => 'DEBUG', 'cache.enabled' => true ) );
cancel.php
<?php echo "用戶取消支付";
瀏覽器訪問:http://localhost/paypal/payment/payment.php
成功后跳轉到
登錄買家的賬號,在前面提到過。登錄成功后跳轉到支付頁面
點擊繼續進行付款,成功后回調代碼中提供的url
然后登陸自己的沙箱賬號:https://sandbox.paypal.com/us/signin,(注:是自己的賣家賬號)就能看到剛才支付的詳情了
這樣一個完整的支付流程就跑通了,如果需要根據自己的業務去設置商品價格詳情。
注:這個流程只對兩位小數有效,我們的業務是四位小數,當傳入四位小數時一直提示傳入參數錯誤,目前還沒有找到解決辦法,等解決后再來補充,如果有能解決的大佬,歡迎留言,不勝感激。