流程:php
上圖的網址爲:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_4前端
如上圖所示,微信網頁支付的具體流程大體分爲三個部分,最重要的是第一和第二部分:java
window.onload
事件的時候)。prepay_id
,並根據算法(後面會提到)生成支付簽名,而後將prepay_id
和支付簽名做爲上一步支付請求的響應數據返回給客戶端,客戶端 緩存此數據 。注意: 第二部分和商戶的服務器沒有任何交互。web
上面的介紹詳細解釋了微信支付的流程,那麼根據此流程,咱們就能夠分別對微信網頁支付設計前端和後端的實現方案。算法
咱們能夠看到,上面的支付流程中有一點不是很合理的地方:就是每進入一次網頁就請求一次支付接口,產生一個訂單。由於不少時候,用戶打開網頁並不會點擊購買產生實質的支付請求。這樣會無端消耗很多服務器資源,特別是對於高併發網站來講。spring
對此個人改進方案是:在用戶點擊相關的產生實質支付的按鈕時,才向商戶後臺發送支付,再調統一下單接口,返回
prepy_id
和簽名,而後利用這個數據進行上面的第二部分,請求微信支付。這樣作的好處是能夠減小無效請求,可是壞處是兩次請求的時間可能會較長,特別是第一個向商戶後臺下訂單的請求,由於這個還須要調微信支付的服務,可能整個請求的響應會超過1s,慢的甚至2~3s,這會嚴重影響用戶體驗。並且此時,通常須要在前端顯示一個「正在請求支付」的加載動畫,否則幾秒沒響應用戶會覺得沒效果再點擊形成重複下單。後端
咱們按照上面描述的改進方案進行前端和後端支付業務流程的設計。api
在第一節的圖中忽略了一點,使用微信JSAPI支付的網頁,必須在支付前使用微信JSAPI的
config
接口注入權限驗證配置,這一步通常放在網頁加載後,即window.onload()
函數中來執行。具體內容參考:微信網頁開發說明緩存
前端的流程以下:服務器
window.onload()函數
編寫wx.config()函數
),權限配置驗證中須要向商戶服務器請求籤名,後面會提到。prepay_id
和生成的支付簽名。簽名算法說明 。WeixinJSBridge.invoke
函數調起支付,並編寫支付成功和失敗的回調函數。微信支付主要的邏輯在後端,後端的邏輯以下:
access_token
是:網頁受權access_token處理上一步的響應,若是成功,根據說明連接產生簽名字符串,響應上一步的請求。
爲了前端處理方便,這一步能夠將支付請求所需的全部參數都生成而後返回。
notify_url
添加支付結果處理邏輯,根據支付結果通知所述,返回指定信息,此接口要有處理重複通知的能力,具體詳見前面的連接。下面幾篇文章將展現實現微信網頁支付邏輯的前端和後端(基於java web框架spring mvc)的示例代碼。
若有錯誤和疑惑之處請在評論區指出,謝謝。