這篇文章分享給大家的內容是關於H5微信支付之引入微信的js-sdk包失敗的解決方法,內容很有參考價值,希望可以幫到有需要的小伙伴。
在開發微信公眾號活動中,由於之前沒有接觸過與微信相關的開發,所以導致掉坑,爬坑,不過也讓我對微信公眾和微信官方文件的熟悉度大大增加。
在微信的官方文件中:https://pay.weixin.qq. com/wik...
有這樣的一個DEMO:
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(); }
在後端同事授權成功後,在活動頁面頁面引入這段程式碼,開開心心,build 提交測試嗯蘋果沒問題,安卓好像沒問題,然鵝安卓有時候調不起支付,開始以為是微信版本的原因,等等其他,但是,調起成功的機率也太TM低了,10次才能調起1次,得,肯定是代碼原因了。改吧。
開微信開發者工具,打log,最後發現在這一步驟時候if (typeof WeixinJSBridge == "undefined")
1.ios能夠調起微信瀏覽器的js-sdk
2.安卓大部分都走到undefined裡面去了
這裡其實我也不太清楚原因。個人感覺是微信安卓內建的瀏覽器版本和這個 WeixinJSBridge 方法的問題。 (希望有大神能夠解答一下)
既然js-sdk 調不起,那就手動引入配置吧 //所以有時候偷懶反而更加麻煩,吸取教訓
if (typeof WeixinJSBridge == "undefined"){ console.log( WeixinJSBridge); if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', onBridgeReady); document.attachEvent('onWeixinJSBridgeReady', onBridgeReady); } }else{ onBridgeReady(); }
npm i -S weixin-js-sdk
在需要引入的頁面引入模組
import wx from 'weixin-js-sdk'
配置(參考微信官方文件:https://mp.weixin.qq.com/wiki...):
wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '', // 必填,公众号的唯一标识 timestamp: , // 必填,生成签名的时间戳 nonceStr: '', // 必填,生成签名的随机串 signature: '',// 必填,签名 jsApiList: [] // 必填,需要使用的JS接口列表 比如我要调用支付接口 那么就是 [chooseWXPay] }); 这里timestamp是小写 s 是小写,数据类型是 int 类型
接下來既然設定成功了,那就繼續看官方文件
在官方文件是這麼說的,有個ready的方法,在config驗證成功之後,把介面放在裡面確保執行。
wx.ready(function(){ // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。 });
ready裡面的引入參數(注意資料類型,和後端同事好好配合- -)
wx.chooseWXPay({ timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 nonceStr: '', // 支付签名随机串,不长于 32 位 package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*) signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5' paySign: '', // 支付签名 success: function (res) { // 支付成功后的回调函数 } });
在ready裡面使用Vue data中的數據,一不小心掉到this指向的坑,如果不加bind,wx.chooseWXPay裡面的參數是拿不到從後端請求回來的數據的,這裡的this並不是指向VueComponent,自然無法獲取請求後我賦值給this.wx_config這個陣列物件的資料。
getConfig(){ wx.config({ debug: this.wx_config.debug, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: this.wx_config.appId, // 必填,公众号的唯一标识 timestamp: this.wx_config.timestamp, // 必填,生成签名的时间戳 nonceStr: this.wx_config.nonceStr, // 必填,生成签名的随机串 signature:this.wx_config.signature,// 必填,签名 jsApiList: this.wx_config.jsApiList // 必填,需要使用的JS接口列表 }); //微信支付 wx.ready(function() { // console.log(this.jsApiCall()); wx.chooseWXPay({ timestamp: this.wechat_code.timestamp, nonceStr:this.wechat_code.nonceStr, package: this.wechat_code.package, signType: this.wechat_code.signType, paySign: this.wechat_code.paySign, success: function () { // 支付成功后的回调函数 alert("支付成功"); window.location.href = "/hd/becomevip"; }, cancel: function() { alert("支付失败"); } }); }.bind(this)); },
踩坑總是難免的,總結,還有不要因為怕麻煩而不去做正確的事~
相關推薦:
#以上是H5微信支付之引進微信的js-sdk包失敗的解決方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!