[TOC] #### 1. 準備資料 --- 沙箱環(huán)境: 用于開發(fā)時進行支付回調(diào)測試 支付寶開放平臺: [https://open.alipay.com](https://open.alipay.com) , 使用支付寶掃碼登錄,進入控制臺,找到沙箱環(huán)境 開放平臺沙箱環(huán)境: [https://open.alipay.com/platform/appDaily.htm?tab=info](https://open.alipay.com/platform/appDaily.htm?tab=info) ![](https://img.itqaq.com/art/content/4c6e591e478b85821da9bc8ebc4f4c77.jpg) **沙箱賬號: 用于登錄沙箱版支付寶** #### 2. 創(chuàng)建網(wǎng)頁應(yīng)用 --- 登錄支付寶開放平臺: [https://open.alipay.com](https://open.alipay.com) , 進入控制臺面板: [https://open.alipay.com/platform/developerIndex.htm](https://open.alipay.com/platform/developerIndex.htm) 在控制臺中的我的應(yīng)用中創(chuàng)建 **網(wǎng)頁&移動應(yīng)用**,并且選擇支付接入 ![](https://img.itqaq.com/art/content/8d501749daa3045346634b59f290ac18.png) 應(yīng)用類型設(shè)置為 **網(wǎng)頁應(yīng)用**,其他信息按照提示填寫即可 ![](https://img.itqaq.com/art/content/c7a338f563f97209883e8993416f976e.png) #### 3. 生成支付寶應(yīng)用公鑰 ---- 點擊接口加密方式中的 **設(shè)置** ![](https://img.itqaq.com/art/content/da4ffa6e621276a68c7f3285c34504d1.png) 加簽內(nèi)容配置 ![](https://img.itqaq.com/art/content/6effe5d1881a33e4fe6bafead4f0327f.png) 支付寶密鑰在線生成器: [https://miniu.alipay.com/keytool/create](https://miniu.alipay.com/keytool/create) , 也可以下載軟件版生成器生成密鑰 將下圖中的應(yīng)用公鑰復制并粘貼到上圖中的 **序號3: 公鑰字符**,進而得到支付寶應(yīng)用公鑰,開發(fā)者在調(diào)起支付時需要使用應(yīng)用私鑰和支付寶應(yīng)用公鑰。所以, 一定要將 **應(yīng)用私鑰、應(yīng)用公鑰、支付寶應(yīng)用公鑰** 保存好存起來 ![](https://img.itqaq.com/art/content/eda019327f19aaa42fcfa729fb2417da.png) 通過應(yīng)用公鑰獲取到支付寶應(yīng)用公鑰,加簽配置完成 ![](https://img.itqaq.com/art/content/c3e75c577574d046c9c003ae4faecffd.png) #### 4. 商家綁定網(wǎng)頁應(yīng)用 --- 通過提示可得出結(jié)論: 要使用手機網(wǎng)站支付、當面付能力需要商家綁定此應(yīng)用進行簽約 ![](https://img.itqaq.com/art/content/5bcdae898c5f31078d7e6048122c40ea.png) 進入支付寶商家中心: [https://mrchportalweb.alipay.com](https://mrchportalweb.alipay.com) , 在賬號中心中找到 APPID 綁定,點擊 `添加綁定` ![](https://img.itqaq.com/art/content/26c86f96e4c80985a06a2f2f1642b7b5.png) 輸入支付寶開發(fā)平臺網(wǎng)頁應(yīng)用的 APPID,點擊 `下一步` 完成綁定 ![](https://img.itqaq.com/art/content/c8d815855f0a8a1f232e467f17c0936c.png) 綁定此應(yīng)用的商家如果已經(jīng)簽約該能力,應(yīng)用的能力名稱對應(yīng)的狀態(tài)直接就是 `已生效` ![](https://img.itqaq.com/art/content/52fd3ff18da8519d62081d371fe397a0.png) 如果商家沒有簽約的話,可以在`商家中心-產(chǎn)品中心`進行簽約, 簽約成功后網(wǎng)頁應(yīng)用的狀態(tài)自動變?yōu)?`已簽約` ![](https://img.itqaq.com/art/content/cba2572d35d054e1b88733fb236d70e9.png) #### 5. 當面付: 買家掃描商家二維碼完成支付 --- 技術(shù)棧: ThinkPHP6.0 + yansongda/pay=2.* + endroid/qr-code 使用 **yansongda/pay** 擴展包調(diào)用支付寶掃碼支付接口 獲取掃碼支付URL地址, 例如: [https://qr.alipay.com/bax01214wuzcetwrql5700a8](https://qr.alipay.com/bax01214wuzcetwrql5700a8) ``` composer require yansongda/pay:^2.10 ``` 使用 **endroid/qr-code** 擴展包將支付寶接口返回的URL地址轉(zhuǎn)為二維碼 (收款碼) ``` composer require endroid/qr-code ``` 查看掃碼支付章節(jié): [https://pay.yansongda.cn/docs/v2/alipay/pay.html](https://pay.yansongda.cn/docs/v2/alipay/pay.html) 在構(gòu)造方法中初始化配置參數(shù),并且生成支付寶功能操作實例: **$alipay** ```php public function __construct() { $config = [ 'app_id' => '', // 應(yīng)用appid 'notify_url' => '', // 異步通知地址 'ali_public_key' => '', // 支付寶應(yīng)用公鑰 'private_key' => '', // 應(yīng)用私鑰 加密方式: **RSA2** 'mode' => 'dev', // 設(shè)置此參數(shù),將進入沙箱模式;省略該參數(shù),進入正式環(huán)境 ]; $this->alipay = \Yansongda\Pay\Pay::alipay($config); } ``` $qrcode 是一個 URL 地址,根據(jù)此地址生成一張二維碼 $image, 生成商家收款碼,讓用戶使用支付寶掃碼支付 ```php $order = [ 'out_trade_no' => time(), // 商家訂單號 'total_amount' => 1, // 訂單金額,單位:元 'subject' => '購買商品', // 訂單備注 ]; try { // 應(yīng)用 appid 配置錯誤時會拋出異常 $qrcode = $this->alipay->scan($order)->qr_code; } catch (\Exception $e) { // 異常處理 記錄日志 ... // $e->getMessage() } $image = \Qrcode::generate($qrcode); echo '<img src="' . $image . '">'; ``` 異步通知地址: 當用戶使用支付寶支付成功后,支付寶會向配置的 `notify_url ` 發(fā)送請求,并攜帶一些參數(shù) 在 ThinkPHP 6.0 中可以通過 **input()** 來獲取這些參數(shù),或通過以下函數(shù)獲取 ```php file_get_contents("php://input"); ``` 但是實際開發(fā)中要用擴展包提供的方式,因為它幫助我們完成了驗簽的操作,可以更好的處理回調(diào)邏輯 ```php /** * 異步通知地址 */ public function notify() { try { $data = $this->alipay->verify(); // 是的,驗簽就這么簡單! // 請自行對 trade_status 進行判斷及其它邏輯進行判斷 // 只有交易通知狀態(tài)為 TRADE_SUCCESS 或 TRADE_FINISHED 時,支付寶才會認定為買家付款成功。 // 1、商戶需要驗證該通知數(shù)據(jù)中的out_trade_no是否為商戶系統(tǒng)中創(chuàng)建的訂單號; // 2、判斷total_amount是否確實為該訂單的實際金額(即商戶訂單創(chuàng)建時的金額); // 3、校驗通知中的seller_id(或者seller_email) 是否為out_trade_no這筆單據(jù)的對應(yīng)的操作方 // 4、驗證app_id是否為該商戶本身。 // 5、其它業(yè)務(wù)邏輯情況 if (in_array($data->trade_status, ['TRADE_SUCCESS', 'TRADE_FINISHED'], true)) { // 業(yè)務(wù)邏輯處理 修改訂單狀態(tài) } } catch (\Exception $e) { // $e->getMessage(); } return $this->alipay->success()->send(); } ``` #### 6. 手機網(wǎng)站支付: 通過瀏覽器喚起支付寶客戶端進行付款 --- 在構(gòu)造方法中初始化配置并且獲取操作實例 ```php public function __construct() { $config = [ 'app_id' => '', // 應(yīng)用appid 'notify_url' => '', // 異步通知地址 'return_url' => '', // 回調(diào)地址 'ali_public_key' => '', // 支付寶應(yīng)用公鑰 'private_key' => '', // 應(yīng)用私鑰 加密方式: **RSA2** 'mode' => 'dev', // 設(shè)置此參數(shù),將進入沙箱模式;省略該參數(shù),進入正式環(huán)境 ]; $this->alipay = \Yansongda\Pay\Pay::alipay($config); } ``` 在小程序中可以生成一個 URL 鏈接地址,讓用戶復制鏈接至瀏覽器進行支付 這個鏈接地址就是調(diào)用手機網(wǎng)站支付的控制器方法入口,比如: [http://waterflosserreview.com/h5_pay/index](http://waterflosserreview.com/h5_pay/index) ```php /** * 手機網(wǎng)站支付 */ public function index() { $order = [ 'out_trade_no' => time(), 'total_amount' => 1, 'subject' => '手機網(wǎng)站支付', ]; return $this->alipay->wap($order)->send(); } ``` 訪問上面的 URL 鏈接地址,會自動重定向到以下頁面,如下圖所示,提供了兩種支付方式: 1、 使用支付寶 APP 付款 (拉起支付寶客戶端進行付款) 2、 繼續(xù)瀏覽器付款 (登錄支付寶賬號進行付款) ![](https://img.itqaq.com/art/content/a0dc652f1542c8b19d39bf4f48cd7901.jpg) 支付成功后,異步通知同掃碼支付,點擊 `已完成付款` 會自動重定向到 **return_url** 地址,可在頁面中放張支付成功的圖片 ![](https://img.itqaq.com/art/content/244d856d5b6963a5070d74c130659ebf.jpg)