微信公眾號支付(二)H5調起支付
上一篇講到統一下單,得到微信返回的預支付交易會話標識prepay_id,那麼下單完成後要做的就是在html頁面調起支付視窗。
檢視官方文件:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6,即可看到h5調起支付需要的引數。
而且還說明了javascript的寫法,主要是onBridgeReady()方法的封裝。注意,如果某個頁面如pay.html需要進行支付,那麼此js就應該解除安裝這個pay.html中,而且微信官方還說明如下: 注意:WeixinJSBridge內建物件在其他瀏覽器中無效。
$scope.onBridgeReady = function () { $http.post("/wechat/createSign", $scope.payOrder).then(function (data) { var order = data.data.data; WeixinJSBridge.invoke( 'getBrandWCPayRequest', { "appId": order.appid,//公眾號名稱,由商戶傳入 "timeStamp": order.timeStamp, //時間戳,自1970年以來的秒數 "nonceStr": order.nonce_str, //隨機串 "package": "prepay_id=" + order.prepay_id, "signType": "MD5", //微信簽名方式 "paySign": order.sign //微信簽名 }, function(res) { if (res.err_msg == "get_brand_wcpay_request:ok") { //alert("微信支付成功!"); $http.post("/wechat/toPaySuccessUrl").then(function (data) { window.location.href = data.data.data + "?orderNo=" + order.out_trade_no; }) // window.location.href = "http://qiansheng.imwork.net/paydone.html?orderNo=" + order.out_trade_no; } else if (res.err_msg == "get_brand_wcpay_request:cancel") { //alert("使用者取消支付!"); } else { alert("支付失敗!"); } }); }) }
appId,timeStamp,nonceStr,signType等引數都可以通過ajax從後臺獲取。這些基本都是寫死的資料。但是唯獨一點,package裡面有個prepay_id,這個引數是上一篇文章中統一下單後,微信返回給我們的引數。在後臺直接設定即可。但是最坑最坑的一點來了,就是這裡面的paySign,就是簽名。這個可不是第一次統一下單得到的簽名。而是統一下單完成後,根據返回引數,再一次生成的新簽名。這裡微信官方文件沒有提到,所以非常坑人。
參考文件:
二次簽名:
二次簽名需要appId,timeStamp,nonceStr,package,singType等引數。其實也就是H5支付需要的引數。
//下單返回 SortedMap<Object, Object> secondParam = new TreeMap<>(); secondParam.put("appId", Constant.APPID); secondParam.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); secondParam.put("nonceStr", order.getNonce_str()); secondParam.put("package", "prepay_id=" + order.getPrepay_id()); secondParam.put("signType", Constant.SIGN_TYPE); //二次簽名 String sign = SignUtils.createSign("UTF-8", secondParam);
二次簽名後,後臺再一次組裝ajax需要的引數。paySign就是二次簽名的簽名!!!!!!
如下是我從後臺組裝的物件,標紅的都是ajax需要的,然後將這個物件轉換為json即可。前臺pay.html對值進行填充。
到這裡,H5調起支付就完成了。
開發過程可能會遇到以下問題:
1.H5調起支付的時候提示簽名錯誤
解決辦法:十有八九是package裡面的prepay_id錯了,還有就是沒有進行二次簽名
2.提示調起支付時,提示“當前頁面url未註冊”
由於2017年8月1日微信官方把關於支付的資訊轉移到了商戶平臺:公眾平臺微信支付公眾號支付授權目錄、掃碼支付回撥URL配置入口已於8月1日遷移至商戶平臺(pay.weixin.qq.com )
所以進入以下位置:
登入微信商戶平臺-產品中心-開發配置,配置支付授權路徑。如果掉起支付的頁面在 域名/pay.html中,那麼就在此新增授權路徑,如我的掉起支付的頁面在www.weixinPay.com/pay.html 中,那麼授權目錄就配置為htt://www.weixinPay.com/
注意:後面的 / 一定要加上,表示該路徑下的頁面都可以調起微信的支付介面。