1. 程式人生 > >微信公眾號支付(二)H5調起支付

微信公眾號支付(二)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內建物件在其他瀏覽器中無效。
因此,我在pay.html中的配置如下,配置完成後再微信手機端進行頁面瀏覽

$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/

注意:後面的 / 一定要加上,表示該路徑下的頁面都可以調起微信的支付介面。