今天來講講支付。
工作到現在,接入過好幾個項目的支付,其中涉及到了微信支付、支付寶支付、銀聯支付。
三種支付的對接感受其實整體上大同小異。都遵循同一個流程:
1)、商戶APP向商戶服務器請求生成訂單
2)、商戶服務器通過生成的訂單編號向第三方支付平台請求簽名信息返回給商戶APP
3)、商戶APP拿到授權簽名信息向第三方支付平台調起支付
4)、用戶支付完成
5)、第三方支付平台向商戶服務器發起支付結果回調
6)、商戶服務器根據回調信息處理業務邏輯
接下來談談對比。
1.文檔和SDK對比
總體感受是支付寶的文檔的SDK最好用。面向對象很舒服。
微信的開放平台/商戶平台/公眾平台初次接入者很容易混淆,搞不清楚哪個是哪個。
銀聯的demo很詳細,基本不需作多大改動就可以拿來用,只不過在環境配置上多了幾個證書,簽名和驗簽時都需要證書,稍顯麻煩。
2.前端調起支付所需參數對比
相比之下,支付寶的SDK最方便,把所有參數和方法都封裝成了面向對象的方式,清晰易懂。
3.需要注意的地方
補充:
1.如果調起了支付,然后回到商戶app取消了訂單,此時再跳轉到第三方支付頁面去支付,並且支付成功了。這種情況,本來應該是請求第三方平台關閉訂單,但是支付寶和微信都是在下單后的短時間內不能馬上取消訂單。解決辦法是:在支付回調的方法里面加上判斷,如果是錯誤或者重復支付,則退款給買家。
2.支付寶收到多個支付成功回調的問題:
支付寶的解釋是:
只要交易狀態發生改變,符合滿足支付寶異步觸發條件,就會發送異步通知;
其中,像即時到賬,移動支付,手機網站支付等接口,默認都是支持3個月可退款的,支付成功之后,支付寶會發送一個trade_success(支付成功)的異步通知,3個月之后,此交易就不允許退款,此時支付寶會再次發送(trade_finished)的異步通知,因此會在3個月之后再次收到一次異步通知;
注意,只trade_success狀態下處理自己的業務邏輯;
我遇到的問題是:如果調用了部分退款接口,會觸發一個交易狀態為TRADE_SUCCESS的支付成功回調回來。導致數據錯亂。
解決辦法:判斷回調是否有返回退款參數,gmt_refund,refund_fee(退款時間和退款金額)這些,以此來區分是退款成功之后的回調還是正常支付完成的回調。
如果有朋友需要相關代碼,可以留言。
收到代碼的朋友,如果覺得我的文章幫助到了你,請酌情適當打賞樓主煙錢。