微信支付於 2013 年正式發佈,一路走來,明顯感受到,微信支付的接口穩定程度有質的提高,圍繞支付相關的場景也配備了對應的接口。php
微信小程序的發佈,隨機附送了一個微信支付模塊,該模塊使用起來的狀況如何?如今我就來告訴你。前端
咱們先總覽微信支付的一些基本狀況。算法
微信支付有如下支付模式:小程序
微信客戶端內的網頁支付 (JSAPI)後端
掃碼支付 (PC 端,移動支付終端)微信小程序
刷卡支付 (支付終端掃描)api
app 支付 (iOS, Android)安全
各類支付交互流程可經過微信支付文檔進行查看,在此不贅述。微信
全部支付方式都須要經過 「統一下單」的 API 來獲取一個支付憑證。app
但在小程序內測期間,尚未「統一下單」的概念。HTML 5 應用發起支付須要直接經過前端構造參數來發起(不通過後端驗證),很容易形成支付憑證泄露等安全問題。
爲此,微信支付將其流程進行了優化:在全部支付場景中插入「統一下單」的特性。推薦開發者在後端完成支付參數的構建等行爲。
該優化帶來如下好處:
儘量讓開發者不犯低級錯誤,形成財務損失。
簡化構造支付參數的複雜度,全部支付方式可共享一個支付後端接口。
經過「統一下單」獲取到相對應 prepay_id 或者 code_url 等參數,便可經過各類支付模式的 SDK 來進行微信支付的發起。
微信支付發起完成後,微信還須要提供一個通知系統,以便及時讓應用知道用戶已經完成支付,進行下一步的業務操做。
通知方式爲一個 POST 請求,payload 爲支付的狀態信息,以及支付訂單信息。
須要注意的是,必須對通知參數進行簽名驗證,以確保安全。
進行簽名驗證時,除去簽名字段(通常參數名爲: sign)不須要參與簽名外,其他全部接收到的參數均須要參與簽名。
經過 「支付發起」、「支付結果接收」,便可完成一個簡單的微信支付系統。固然,微信還提供如下接口:
查詢訂單
取消訂單
申請退款
查詢退款
下載對帳單
具體使用能夠參考微信支付文檔,根據自身業務狀況適當的進行採用。
嗯,沒錯,咱們吃了一次螃蟹。
在小程序剛內測的時候,咱們就決定使用微信支付模塊,畢竟咱們要實現的是一個電商應用 (電商沒支付算什麼嘛)。
在開發過程當中,咱們掉了一些坑。
小程序的微信支付須要單獨去申請,由於小程序是有獨立的 appid,不能使用之前的支付帳戶。
即便是全網發佈也不能,由於小程序不是一個 HTML 5 應用。
統一下單時須要注意將 trade_type 設置爲 JSAPI,同時 openid 須要使用與小程序相關聯的 openid。
MD5!MD5!MD5!
微信公衆文檔有不少 SHA1, MD5 的簽名要求,微信支付相關的簽名,暫時暫時暫時都是使用 MD5。
小程序端在發起微信支付的時候,是經過如下方式來進行發起:
按照微信文檔簽名的要求,參與簽名的字段應該爲:
|
|
|
|
OK,按照簽名算法獲得的簽名,去發起支付,竟然提示失敗了。
通過與微信對接人員溝通後,參與簽名的字段還須要加上
|
,哦,不對,是
|
(請嚴重區分駝峯命名的大小寫)。
對這樣的結果我表示不服,隨即我翻閱了微信支付全部文檔,終於在微信 JSSDK 的文檔中找到一行備註。
備註:
經過微信支付統一下單接口拿到,
prepay_id 採用統一的微信支付
paySign 簽名生成方法,注意這裏
Sign 也要參與簽名,
appId 與
appId 中傳入的
config 一致,即最後參與簽名的參數有
appId 、
appId 、
timeStamp 、
nonceStr 、
package 。
signType
怪我咯(黑人問號) ……
|
類型
小程序端發起微信支付的方式已經貼在上面了,但沒那麼簡單,繼續貼文檔說明。
時間戳從 1970 年 1 月 1 日 00:00:00 至今的秒數,即當前的時間。
timeStamp DateInt
文檔告訴咱們
|
應該帶着
|
類型傳入。咱們前端的同窗照作了,而後就過來罵我。
大家後端參數是否是有問題!提示
不存在了都?
timeStamp
通過排查,傳入的
|
的值類型應該爲
|
。
整體上,小程序接入微信支付仍是比較簡單的,沒有過多複雜的設置。
若是以前開發過微信支付後端的開發者,還能夠複用同一個支付模塊。
微信文檔的編寫不嚴謹,使得開發舒爽度嚴重被削減。相信隨着時間推動,文檔會慢慢完善,畢竟之前也是這麼過來的。