小程序如何接入微信支付?你可能會趕上這些坑

微信支付於 2013 年正式發佈,一路走來,明顯感受到,微信支付的接口穩定程度有質的提高,圍繞支付相關的場景也配備了對應的接口。php

微信小程序的發佈,隨機附送了一個微信支付模塊,該模塊使用起來的狀況如何?如今我就來告訴你。前端

業務流

咱們先總覽微信支付的一些基本狀況。算法

微信支付有如下支付模式:小程序

  • 微信客戶端內的網頁支付 (JSAPI)後端

  • 掃碼支付 (PC 端,移動支付終端)微信小程序

  • 刷卡支付 (支付終端掃描)api

  • app 支付 (iOS, Android)安全

各類支付交互流程可經過微信支付文檔進行查看,在此不贅述。微信

1. 支付發起

全部支付方式都須要經過 「統一下單」的 API 來獲取一個支付憑證。app

但在小程序內測期間,尚未「統一下單」的概念。HTML 5 應用發起支付須要直接經過前端構造參數來發起(不通過後端驗證),很容易形成支付憑證泄露等安全問題。

爲此,微信支付將其流程進行了優化:在全部支付場景中插入「統一下單」的特性。推薦開發者在後端完成支付參數的構建等行爲。

該優化帶來如下好處:

  • 儘量讓開發者不犯低級錯誤,形成財務損失。

  • 簡化構造支付參數的複雜度,全部支付方式可共享一個支付後端接口。

經過「統一下單」獲取到相對應 prepay_id 或者 code_url 等參數,便可經過各類支付模式的 SDK 來進行微信支付的發起。

2. 支付結果接收

微信支付發起完成後,微信還須要提供一個通知系統,以便及時讓應用知道用戶已經完成支付,進行下一步的業務操做。

通知方式爲一個 POST 請求,payload 爲支付的狀態信息,以及支付訂單信息。

須要注意的是,必須對通知參數進行簽名驗證,以確保安全。

進行簽名驗證時,除去簽名字段(通常參數名爲: sign)不須要參與簽名外,其他全部接收到的參數均須要參與簽名。

3. 周邊接口

經過 「支付發起」、「支付結果接收」,便可完成一個簡單的微信支付系統。固然,微信還提供如下接口:

  • 查詢訂單

  • 取消訂單

  • 申請退款

  • 查詢退款

  • 下載對帳單

具體使用能夠參考微信支付文檔,根據自身業務狀況適當的進行採用。

絆腳石

嗯,沒錯,咱們吃了一次螃蟹。

在小程序剛內測的時候,咱們就決定使用微信支付模塊,畢竟咱們要實現的是一個電商應用 (電商沒支付算什麼嘛)。

在開發過程當中,咱們掉了一些坑。

1. 支付憑證

小程序的微信支付須要單獨去申請,由於小程序是有獨立的 appid,不能使用之前的支付帳戶。

即便是全網發佈也不能,由於小程序不是一個 HTML 5 應用。

2. 統一下單參數

統一下單時須要注意將 trade_type 設置爲 JSAPI,同時 openid 須要使用與小程序相關聯的 openid。

3. 簽名方式

MD5!MD5!MD5!

微信公衆文檔有不少 SHA1, MD5 的簽名要求,微信支付相關的簽名,暫時暫時暫時都是使用 MD5。

小程序端在發起微信支付的時候,是經過如下方式來進行發起:

screen-shot-2016-10-25-at-5-12-17-pm

按照微信文檔簽名的要求,參與簽名的字段應該爲:

  •  

     
    timeStamp

     

  •  

     
    nonceStr

     

  •  

     
    package

     

  •  

     
    signType

     

OK,按照簽名算法獲得的簽名,去發起支付,竟然提示失敗了。

通過與微信對接人員溝通後,參與簽名的字段還須要加上 

 
appid

,哦,不對,是 

 
appId

(請嚴重區分駝峯命名的大小寫)。

 

對這樣的結果我表示不服,隨即我翻閱了微信支付全部文檔,終於在微信 JSSDK 的文檔中找到一行備註。

備註:

 
prepay_id
 經過微信支付統一下單接口拿到,
 
paySign
 採用統一的微信支付 
 
Sign
 簽名生成方法,注意這裏 
 
appId
 也要參與簽名,
 
appId
 與 
 
config
 中傳入的 
 
appId
 一致,即最後參與簽名的參數有 
 
appId
 
timeStamp
 
nonceStr
 
package
 
signType

 

怪我咯(黑人問號) ……

4. 

 
timestamp

 類型

小程序端發起微信支付的方式已經貼在上面了,但沒那麼簡單,繼續貼文檔說明。

 

 
timeStamp DateInt
 時間戳從 1970 年 1 月 1 日 00:00:00 至今的秒數,即當前的時間。

 

文檔告訴咱們 

 
timeStamp

 應該帶着 

 
int

 類型傳入。咱們前端的同窗照作了,而後就過來罵我。

 

大家後端參數是否是有問題!提示 

 
timeStamp
 不存在了都?

 

通過排查,傳入的 

 
timeStamp

 的值類型應該爲 

 
String

 

結尾語

整體上,小程序接入微信支付仍是比較簡單的,沒有過多複雜的設置。

若是以前開發過微信支付後端的開發者,還能夠複用同一個支付模塊。

微信文檔的編寫不嚴謹,使得開發舒爽度嚴重被削減。相信隨着時間推動,文檔會慢慢完善,畢竟之前也是這麼過來的。

相關文章
相關標籤/搜索