微信支付分為JSAPI支付,掃碼支付,APP支付,小程序支付等不同的支付方式。但大體的支付過程是一致的,本文以JSAPI支付,也就是微信內的H5支付為例,描述一下支付的整個開發流程。
配置
商戶需要提前開通商戶平台,並去公眾平台或開放平台提交微信支付申請,獲得商戶號和秘鑰。
支付流程
微信支付的流程圖畫的很完整,開發前要把整個流程研究清楚。
整個流程,服務端需要做的有三件事。
- 前端支付按鈕被觸發后,服務端要去調用 統一下單 接口,把預付單信息、支付參數和參數簽名返回給前端。前端根據這些參數喚起支付。
- 當用戶支付成功后,微信會給我們一個回調通知,告知我們支付結果。這一步要實現“完成訂單”操作,標記用戶已經成功支付,進入“發貨”流程。
- 提供一個查詢接口,讓前端再次確認是否支付成功。
統一下單
在支付前,商戶系統先調用該接口在微信支付后台生成預支付交易單,同樣的,商戶系統也需要在自己的表里記錄一筆“未完成訂單”。生成之后返回正確的預付單信息、支付參數和參數簽名返回給前端。前端根據這些參數喚起支付。
接口
https://api.mch.weixin.qq.com/pay/unifiedorder
這里需要說明的一點是,我們在調用這個接口時,需要簽一次名用來給微信做校驗,微信也返回了一個新的簽名用來給我們做校驗,然后我們還要返回給前端一個簽名,用來喚起支付。這三個簽名都不是同一個。
我們不能直接把調用統一下單接口返回的簽名返回給前端,而是根據前端喚起支付的參數去重新簽名。
注意,是根據前端喚起支付的參數去重新簽名,因為前端的參數名和后端的參數名會略微有差別,這里需要小心。
說明:簽名的意圖是用來校驗身份,當前端把這些參數傳給微信,微信會把調用參數除去簽名后重新簽名,用來校驗簽名的正確性,所以用來簽名的參數名要和前端參數一致。
支付結果通知
在統一下單時我們填了一個參數叫 notify_url
,這是一個服務端的接口地址,微信在用戶支付成功后,會回調這個地址,告知我們支付結果。
在這一步還是需要做多點校驗的,免得被人有機可乘。
- 校驗支付是否成功,不成功直接返回"FAIL"
- 校驗簽名和appid
- 校驗訂單是否完成(冪等校驗,防止微信多次回調導致多次訂單寫入)
- 訂單金額校驗
一通校驗完事之后就可以做業務相關的事了。記得所有操作結束后返回"SUCCESS",不然微信會不斷發起回調。
總結
- 流程圖描述的很清楚,要仔細閱讀流程圖。
- 調用完下單接口后要進行二次簽名,簽名的參數要看前端驗簽用哪些參數,即使是同一個參數,字段名也會跟第一次加簽不一樣。
- 前端支付完成之后微信會有一個回調,我們需要做以下幾點校驗:
- 做冪等處理(因為同樣的通知微信可能發送多次)。
- 校驗簽名,校驗APPID。
- 校驗訂單金額。
- 訂單狀態分為 0-未支付 1-支付完成 2-支付失敗:
- 用戶觸發支付組件然后關閉或者殺掉進程微信不會給到后台任何回復,始終處於 0-未支付,所以這個狀態也是一個支付失敗狀態。
- 支付失敗比較少見(到現在沒有遇到過),比如簽名錯誤(發生在調試階段)。
- 微信回執表盡量詳細的記錄微信傳回的所有必有參數,以備出問題時排查。
- 至今還沒有找到微信本地調試的方法。