摘要:最近在寫一個面向國外買家的一個商城項目,既然面向國外,那就要用到這個支付平臺。因為在對接的過程中遇到了一些問題,花費了一些時間,所以把對接的過程記下來,也希望能幫助到用到的朋友。以下皆以代碼的形式展現(xiàn),沒有截圖,但我盡量用代碼講解明白。
最近在寫一個面向國外買家的一個商城項目,既然面向國外,那就要用到PayPal這個支付平臺。因為在對接PayPal的過程中遇到了一些問題,花費了一些時間,所以把對接的過程記下來,也希望能幫助到用到PayPal的朋友。
我集成的是paypal/rest-api-sdk-php。PayPal的api有 v1和v2兩個版本,我用的這個是v1版本。
以下皆以代碼的形式展現(xiàn),沒有截圖,但我盡量用代碼講解明白。
假設(shè)你已經(jīng)有了用laravel寫的一個項目:
composer require paypal/rest-api-sdk-phpStep:2創(chuàng)建payment.php配置文件
在Config目錄新建payment.php配置文件,內(nèi)容如下
return [ "paypal" => [ /** set your paypal credential **/ "client_id" =>"paypal client_id", "secret" => "paypal secret ID", /** * SDK 配置 */ "settings" => array( /** * 沙盒測試"sandbox" 或者 "live" */ "mode" => "sandbox", /** * 請求超時時間 */ "http.ConnectionTimeOut" => 1000, /** * 是否開啟日志:true開啟,false不開啟 */ "log.LogEnabled" => true, /** * 日志存儲的文件 */ "log.FileName" => storage_path() . "/logs/paypal.log", /** * 日志級別 "DEBUG", "INFO", "WARN" or "ERROR" * */ "log.LogLevel" => "INFO" ), ], "2checkout" => [ // ] ];Step:3創(chuàng)建路由
// 第一步:顯示表單,這是一個簡單的表單頁面,我們把金額輸入,然后點擊提交 Route::get("paypal-form", "PaymentPayPalController@payPalShow")->name("paypal-form"); // 第二步:第一步提交后發(fā)送請求,請求該方法,該方法用于創(chuàng)建訂單,創(chuàng)建支付流程 Route::post("paypal-pay", "PaymentPayPalController@pay")->name("payment.paypay.pay"); // 第三步:異步回調(diào) Route::post("paypal-notify", "PaymentPayPalController@payPalNotify")->name("payment.paypal.notify"); // 第三步:前端回調(diào) Route::get("paypal-return", "PaymentPayPalController@payPalReturn")->name("payment.paypal.return"); // 第三步:取消 Route::get("paypal-cancel", "PaymentPayPalController@payPalCancel")->name("payment.paypal.cancel");Step:3創(chuàng)建控制器
_api_context = new ApiContext(new OAuthTokenCredential( $payPal_config["client_id"], $payPal_config["secret"] )); $this->_api_context->setConfig($payPal_config["setting"]); } // 顯示表單 public function payPalShow() { return view("payment.paypal"); } // 第二步,請求這里 public function pay(Request $request) { $payer = new Payer(); $payer->setPaymentMethod("paypal"); // 產(chǎn)品名稱,幣種,數(shù)量,單個產(chǎn)品金額 $item1 = new Item(); $item1->setName("item1") ->setCurrency("USD") ->setQuantity(1) ->setPrice($request->get("amount")); // 將所有產(chǎn)品集合到 ItemList中 $item_list = new ItemList(); $item_list->setItems([$item1]); $amount = new Amount(); $amount->setCurrency("USD") ->setTotal($request->get("amount")); // 生成交易 $transaction = new Transaction(); $transaction->setAmount($amount) ->setItemList($item_list) ->setDescription("你的交易") ->setNotifyUrl(route("notify_url")) // 注意,這里設(shè)置異步回調(diào)地址 ->setInvoiceNumber($order->order_number); // 這里設(shè)置訂單號 // 設(shè)置前端回調(diào)地址和取消支付地址 $redirect_urls = new RedirectUrls(); $redirect_urls->setReturnUrl(route("payment.paypal.return")) ->setCancelUrl(route("payment.paypal.cancel")); $payment = new Payment(); $payment->setIntent("Sale") ->setPayer($payer) ->setRedirectUrls($redirect_urls) ->setTransactions(array($transaction));
try { // 這里生成支付流程 $payment->create($this->_api_context); } catch (PayPalExceptionPayPalConnectionException $ex) { if (config("app.debug")) { session()->put("error","Connection timeout"); return redirect()->route("paypal-form"); /** echo "Exception: " . $ex->getMessage() . PHP_EOL; **/ /** $err_data = json_decode($ex->getData(), true); **/ /** exit; **/ } else { session()->put("error","Some error occur, sorry for inconvenient"); return redirect()->route("paypal-form"); } } foreach($payment->getLinks() as $link) { if($link->getRel() == "approval_url") { $redirect_url = $link->getHref(); break; } } // $payment->getId()得到的是支付流水號 session()->put("paypal_payment_id", $payment->getId()); if(isset($redirect_url)) { // 跳轉(zhuǎn)到支付頁面 return redirect()->away($redirect_url); } session()->put("error","Unknown error occurred"); return session()->route("paypal-form"); } public function payPalReturn(Request $request) { // 支付成功后,在前端頁面跳轉(zhuǎn)回來時,url地址中會帶有paymentID 和 PayerID $payment_id = session()->get("paypal_payment_id"); session()->forget("paypal_payment_id"); if (empty(Input::get("PayerID")) || empty(Input::get("token"))) { session()->put("error","Payment failed"); return redirect()->route("paypal-form"); } $payment = Payment::get($payment_id, $this->_api_context); $execution = new PaymentExecution(); $execution->setPayerId(Input::get("PayerID")); $result = $payment->execute($execution, $this->_api_context); // 當(dāng)拿到的狀態(tài)時approved表示支付成功 if ($result->getState() == "approved") { session()->put("success","Payment success"); return redirect()->route("paypal-form"); } session()->put("error","Payment failed"); return redirect()->route("paypal-form"); } public function payPalNotify() { Log::info(12312, Input::get()); // 這里寫我們的業(yè)務(wù)邏輯,訂單狀態(tài)更新,物流信息等等. } }Step:4創(chuàng)建表單
以上既是我做商城項目時PayPal的對接流程,因為英語不好的問題,開發(fā)起來會出現(xiàn)很多問題,
如果英文好,想知道更多的用法,可以看PayPal的開發(fā)者文檔,還有demo演示。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/31266.html
摘要:原文地址不知道是不是有和我一樣使用到聯(lián)想懂得物聯(lián)網(wǎng)卡的兄。戳這里以下是使用說明此擴展是聯(lián)想的,可以方便的在中集成。由于聯(lián)想懂得的接口還在開發(fā)中,所以這個擴展包將處于開發(fā)階段,等穩(wěn)定之后會發(fā)布版本。 原文地址 不知道是不是有和我一樣使用到聯(lián)想懂得物聯(lián)網(wǎng)卡的兄dei。我將接口封裝成了laravel框架的擴展,也可以在laravel之外的項目中使用。 github戳這里 以下是使用說明: 此...
摘要:本文非原創(chuàng),基于學(xué)院在中使用實現(xiàn)文件導(dǎo)入導(dǎo)出功能這篇文章在實際中測試調(diào)整。簡介在中集成套件中的,從而方便我們以優(yōu)雅的富有表現(xiàn)力的代碼實現(xiàn)文件的導(dǎo)入和導(dǎo)出。 本文非原創(chuàng),基于laravel 學(xué)院《在 Laravel 5 中使用 Laravel Excel 實現(xiàn) Excel/CSV 文件導(dǎo)入導(dǎo)出功能》 這篇文章在實際中測試調(diào)整。 showImg(https://segmentfault.c...
摘要:中異常處理類主要包含兩個方法和,其中就是主要用來向第三方發(fā)送異常報告,這里選擇向這個神器發(fā)送異常報告,并使用通知開發(fā)人員。通過也能發(fā)現(xiàn)的執(zhí)行流程。 說明:Laravel學(xué)習(xí)筆記之bootstrap源碼解析中聊異常處理時提到過Sentry這個神器,并打算以后聊聊這款神器,本文主要就介紹這款Errors Tracking神器Sentry,Sentry官網(wǎng)有一句話個人覺得帥呆了: Stop ...
摘要:因為這對于一個剛參加工作的工程師來說,這有可能就是一月和一個月的區(qū)別了。多編寫網(wǎng)站編程說到底其實也就是一門手藝,就對于智商差不多的程序員來說,技藝的高超程度往往就在于練的多少了。 利益相關(guān):以下的所有文字都是僅代表個人觀點,不代表全組織的利益。 本人就是一大三狗,自學(xué)PHP時間已經(jīng)快兩年了,感覺自己還是一個入門級的選手。說說自己是如何一步步走過來的。 1. 官方文檔 對,我還是堅...
摘要:也就是說在中,我們的代碼是要在環(huán)境中運行。而在中,是沒有等以及的,即所有的框架都是不可以使用的。比如相關(guān)組件,相關(guān)組件,等都不能在中引用。是可以在中使用的。 接著第一彈講,我們已經(jīng)搭建好一個屬于自己的weex項目了,然后如何開發(fā)呢?由于之前項目中都是采用vue全家桶進行開發(fā),路由使用vue-router插件,狀態(tài)管理使用vuex,Ajax前后臺交互使用axios,圖標庫使用font-a...
閱讀 2160·2023-04-25 18:49
閱讀 1871·2019-08-30 14:02
閱讀 2676·2019-08-29 17:24
閱讀 3349·2019-08-28 18:10
閱讀 2956·2019-08-28 18:03
閱讀 516·2019-08-26 12:01
閱讀 3342·2019-08-26 11:31
閱讀 1459·2019-08-26 10:29