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