上一篇講到拿到了 預支付交易標識 wx251xxxxxxxxxxxxxxxxxxxxxxxxxxxxx078700javascript
微信文檔中已經明確給出了全部參數名和參與簽名計算的參數,即php
微信文檔中給出參與簽名的參數是 appId、timeStamp、nonceStr、package、signType,要注意計算簽名的方法和《微信支付 第二篇 JSAPI 調用統一下單接口獲取預支付交易數據》計算方式是一致的,回顧一下html
須要注意的是,參數名要嚴格按照騰訊文檔的命名方式,包括大小寫,如 appId 不能寫成 appid 或 appID。開發時爲了方便,H5頁面將部分參數設置成了可編輯文本框,先看一下它的樣子前端
本例中,點擊建立隨機字符串將得到當前時間戳,將其做爲 nonceStr 和 timeStamp 的值,點擊建立簽名計算出完整結果,本例中因爲 JS 實現 hmacsha256 比較麻煩,就改用了 MD5 方式,根據微信要求統一下單接口中的簽名算法也改成了 MD5,下面列出本例實現代碼java
<!--建立完整簽名--> <script type="text/javascript"> function onCreatePaySign() { // 從網頁的各個文本框獲取參數值 var appid = $("#text-appid").val(); var nonceStr = $("#text-nonceStr").val(); var prepayid = $("#text-prepayid").val(); var timeStamp = nonceStr; var signType = "MD5"; // 拼接字符串 var sourceStr = ""; sourceStr += "appId=" + appid; sourceStr += "&nonceStr=" + nonceStr; sourceStr += "&package=prepay_id=" + prepayid; sourceStr += "&signType=" + signType; sourceStr += "&timeStamp=" + timeStamp; sourceStr += "&key=asxxxxxxxxxxxxxxxN82"; // MD5方式計算 var hash = md5(sourceStr).toUpperCase(); // 在頁面中查看一下計算結果 $("#text-paySign").val(hash); // 在控制檯查看拼接字符串原文和MD5結果 console.log("拼接字符串結果: " + sourceStr); console.log("MD5結果: " + hash); } </script>
對比查看結果(爲了避免泄露,appId和mchKey均做了處理,但由於算法固定,所以簽名計算結果徹底不影響正確性)web
這一步的"坑"是,必需要在真實設備下進行訪問,也就是手機、平板等運行微信APP的設備,微信開發者工具都不行,會報錯沒法運行。所以,H5 頁面或者說運行微信支付的那部分 JS 必定要在真實設備上才能正確運行。先看一下微信給出的源代碼(官方文檔裏有)算法
function onBridgeReady(){ WeixinJSBridge.invoke( 'getBrandWCPayRequest', { "appId":"wx2421b1c4370ec43b", //公衆號名稱,由商戶傳入 "timeStamp":"1395712654", //時間戳,自1970年以來的秒數 "nonceStr":"e61463f8efa94090b1f366cccfbbb444", //隨機串 "package":"prepay_id=u802345jgfjsdfgsdg888", "signType":"MD5", //微信簽名方式: "paySign":"70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信簽名 }, function(res){ if(res.err_msg == "get_brand_wcpay_request:ok" ){ // 使用以上方式判斷前端返回,微信團隊鄭重提示: //res.err_msg將在用戶支付成功後返回ok,但並不保證它絕對可靠。 } }); }
就是這段代碼,必需要在真實設備運行,所以本例中採起的方式是將 H5 頁面放到服務器上,用開發者工具運行 獲取openid 和 獲取預支付交易標識 兩個步驟,拿到交易標識後在手機端微信裏打開 H5 頁面,生成簽名並運行支付。根據實際狀況,對放到 H5 頁面中的 onBridgeReady 函數進行了修改,使其從文本框中獲取真實數據api
<!--微信支付調用--> <script type="text/javascript"> function onBridgeReady() { WeixinJSBridge.invoke( 'getBrandWCPayRequest', { "appId": $("#text-appid").val(), //公衆號名稱,由商戶傳入 "timeStamp": $("#text-nonceStr").val(), //時間戳,自1970年以來的秒數 "nonceStr": $("#text-nonceStr").val(), //隨機串 "package": "prepay_id=" + $("#text-prepayid").val(), "signType": "MD5", //微信簽名方式: "paySign": $("#text-paySign").val() //微信簽名 }, function (res) { console.log("微信支付返回值:"); console.log(res); if (res.err_msg == "get_brand_wcpay_request:ok") { // 使用以上方式判斷前端返回,微信團隊鄭重提示: //res.err_msg將在用戶支付成功後返回ok,但並不保證它絕對可靠。 alert("get_brand_wcpay_request:ok"); } alert(res.err_msg); alert(res); // 顯示是個 Object }); } </script>
在手機中,點擊頁面上的支付按鈕,將調起真實的微信支付頁面,支付時忘了截圖,首先先顯示的是信息頁和金額,點擊支付輸入密碼/錄入指紋,驗證成功即支付成功,顯示支付成功頁面(這個有),而且在用戶微信內也會接到來自微信支付的通知消息。本例實現時並無作H5支付成功後的處理頁面,所以在支付成功頁面中點擊完成,就回到了H5頁面中,運行了 function (res) 內的代碼,並在彈窗中顯示出了相關信息服務器
至此,完成了微信支付 JSAPI 支付主要流程。羅列一下關鍵點微信