1. 程式人生 > >關於微信支付的那些坑

關於微信支付的那些坑

最近在做微信支付,原本是用原版的支付方式;

關於一些支付所需引數,

    我這裡先假設引數都沒有問題;

這裡是微信內H5調起支付的程式碼:

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,但並不保證它絕對可靠。 
       }
   ); 
}
if (typeof WeixinJSBridge == "undefined"){
   if( document.addEventListener ){
       document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
   }else if (document.attachEvent){
       document.attachEvent('WeixinJSBridgeReady', onBridgeReady); 
       document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
   }
}else{
   onBridgeReady();
}
老版的微信支付到這裡基本就結束了,關於一些:
get_brand_wcpay_request:fail 這種異常,

我們使用:

alert(JSON.stringify(res));

直接可以打印出對應的錯誤資訊;


------------------------------------------我是一條分割線---------------------------------------

接下來是jssdk的,

wx.chooseWXPay({
timestamp: 0, // 支付簽名時間戳,注意微信jssdk中的所有使用timestamp欄位均為小寫。但最新版的支付後臺生成簽名使用的timeStamp欄位名需大寫其中的S字元
nonceStr: '', // 支付簽名隨機串,不長於 32 位
package: '', // 統一支付介面返回的prepay_id引數值,提交格式如:prepay_id=\*\*\*)
signType: '', // 簽名方式,預設為'SHA1',使用新版支付需傳入'MD5'
paySign: '', // 支付簽名
success: function (res) {
// 支付成功後的回撥函式
    alert(JSON.stringify(res));
    if(res.errMsg == "chooseWXPay:ok"){
         // 支付成功後的回撥函式
         
         apus.ui.toastr.info("支付成功");
    }else{
         apus.ui.toastr.info("支付失敗");
         alert(res.errMsg);
    }
 },
cancel: function () {
    alert("取消");
//  window.location.href = "cart3.aspx?Code=<%=Code %>";
},
error: function (e) {
    alert("失敗");
}
});

當然,wx.chooseWXPay()這個方法是jssdk的,所以必須要引:

<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

這個js;

而且必須要先進行jssdk初始化:

wx.config({
  	    debug: true, // 開啟除錯模式,呼叫的所有api的返回值會在客戶端alert出來,若要檢視傳入的引數,可以在pc端開啟,引數資訊會通過log打出,僅在pc端時才會列印。
  	    appId: '', // 必填,公眾號的唯一標識
  	    timestamp: '', // 必填,生成簽名的時間戳
  	    nonceStr: '', // 必填,生成簽名的隨機串
  	    signature: '',// 必填,簽名,見附錄1
  	    jsApiList: ['chooseWXPay'] // 必填,需要使用的JS介面列表,所有JS介面列表見附錄2
  	});

這裡安卓手機最常出現的錯誤就是:

"errMsg":"chooseWXPay:fail"

這是jssdk最噁心的地方,不過能報這個錯,基本都不會是大問題,大都是細節要注意一下,例如:

微信jssdk中的所有使用timestamp欄位均為小寫。但最新版的支付後臺生成簽名使用的timeStamp欄位名需大寫其中的S字元

或者支付授權目錄的配置問題;

細心找一下,還是可以找到的;

不過出現最多的,大部分都是當前頁面url未註冊的問題;

因為我們是公眾號開發,所以會有shopId和wx標識存在,例如http://www.abc.cn/shop33333/wx11/pay/index.html;

像這樣的請求地址,我們在配置支付授權目錄的時候,必須要配到http://www.abc.cn/shop33333/wx11/pay/;

    很多框架會直接省略掉後面的index.html;這樣的話我們的請求路徑就是http://www.abc.cn/shop33333/wx11/pay;

那麼我們的支付授權目錄則配到:http://www.abc.cn/shop33333/wx11/;這樣就可以了;

下面貼一些對應的錯誤解決方法,主要是連結!

比較綜合的:

https://www.cnblogs.com/xueranzp/p/5287691.html

問題解決不絕對,只是提供建議

"errMsg":"chooseWXPay:fail"


因為我個人研究了好幾天,到後來才發現,最終還是支付授權目錄的坑;