建議閱讀之前多看幾遍文檔,本文不適合不看文檔的程序狗。
流程部分
因?yàn)橹Ц读鞒潭己軓?fù)雜,設(shè)計(jì)業(yè)務(wù)邏輯也很多。所以在開(kāi)發(fā)之前應(yīng)該先熟悉兩個(gè)支付的流程。熟悉流程之后在進(jìn)行開(kāi)發(fā)會(huì)節(jié)省很多debug的時(shí)間。
本次使用的laravel包為yansongda/pay
微信
H5支付
在手機(jī)瀏覽器中使用微信支付,通過(guò)瀏覽器喚起微信支付。
(1)請(qǐng)求統(tǒng)一下單接口
用戶點(diǎn)擊支付之后后臺(tái)進(jìn)行統(tǒng)一下單接口請(qǐng)求。其實(shí)操作僅僅是在微信支付服務(wù)端,產(chǎn)生了一個(gè)訂單而已。
(2)調(diào)起微信客戶端付款
這里用的就是上面接口返回?cái)?shù)據(jù)中的 mweb_url (這個(gè)參數(shù)只有在 return_code(請(qǐng)求標(biāo)識(shí)) 和 result_code(業(yè)務(wù)標(biāo)識(shí)) 都為SUCCESS時(shí)返回),這個(gè)參數(shù)就是瀏覽器調(diào)起支付的地址。直接訪問(wèn)即可。
但是在 yansongda/pay 中 return $pay->wap($order); 就會(huì)直接重定向到該地址。
(3)支付結(jié)束回到瀏覽器
這里流程應(yīng)該是這樣子:瀏覽器調(diào)起微信->微信支付過(guò)程->調(diào)起瀏覽器并打開(kāi)剛才的網(wǎng)址。
注意這里是:調(diào)起瀏覽器 重新打開(kāi)剛才的地址
所以在回到瀏覽器的時(shí)候,應(yīng)該做查詢訂單狀態(tài)的操作。比如給用戶一個(gè)選擇,已付款還是付款出現(xiàn)問(wèn)題。
(4)支付回調(diào)
上面的流程前端永遠(yuǎn)不知道用戶到底付款還是沒(méi)付款。
用戶支付成功,微信會(huì)通過(guò)后臺(tái)的接口進(jìn)行更新?tīng)顟B(tài)。
所以要在后臺(tái)進(jìn)行對(duì)訂單的改變。記得按照要求return,不然微信會(huì)一直發(fā)送通知請(qǐng)求。并且在在更新訂單前也要確認(rèn)是否更新過(guò)。這都是必要的操作。
常見(jiàn)問(wèn)題:
1、商家存在未配置的參數(shù),請(qǐng)聯(lián)系商家解決
1.當(dāng)前調(diào)起H5支付的域名(微信側(cè)從referer中獲?。┡c申請(qǐng)H5支付時(shí)提交的授權(quán)域名不一致,如需添加或修改授權(quán)域名,請(qǐng)登陸商戶號(hào)對(duì)應(yīng)的商戶平臺(tái)--"產(chǎn)品中心"--"開(kāi)發(fā)配置"自行配置
2.如果設(shè)置了回跳地址redirect_url,請(qǐng)確認(rèn)設(shè)置的回跳地址的域名與申請(qǐng)H5支付時(shí)提交的授權(quán)域名是否一致
2、商家參數(shù)格式有誤,請(qǐng)聯(lián)系商家解決
1.當(dāng)前調(diào)起H5支付的referer為空導(dǎo)致,一般是因?yàn)橹苯釉L問(wèn)頁(yè)面調(diào)起H5支付,請(qǐng)按正常流程進(jìn)行頁(yè)面跳轉(zhuǎn)后發(fā)起支付,或自行抓包確認(rèn)referer值是否為空
3、網(wǎng)絡(luò)環(huán)境未能通過(guò)安全驗(yàn)證,請(qǐng)稍后再試
此處有坑! 如果后端是使用docker容器,則會(huì)報(bào) 「網(wǎng)絡(luò)環(huán)境未能通過(guò)安全驗(yàn)證,請(qǐng)稍后再試」的錯(cuò)誤。原因就是傳遞的參數(shù)中IP又問(wèn)題。因?yàn)?「yansongda/pay」中自動(dòng)獲取IP是 Request::createFromGlobals()->getClientIp() 在docker中這個(gè)獲取的是docker局域網(wǎng)IP。所以要在參數(shù)重重寫(xiě) Request::createFromGlobals()->server('HTTP_X_REAL_IP') **
但是這個(gè)IP是干嘛的?
下圖完美解釋。