在開發微信公眾號活動中,由於之前沒有接觸過與微信相關的開發,所以導致掉坑,爬坑,不過也讓我對微信公眾和微信官方文檔的熟悉大大增加。
爬坑之路爬坑一:單頁SPA和後端路由的問題
爬坑二:安卓大概率調起微信支付失敗(引入微信的js-sdk包失敗)
在微信的官方文件中:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6
有這樣的一個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 ){ // 使用上述方式將使用者支付在前端完成:微信團隊鄭重提示後返回ok,但不保證它絕對可靠。 }); }if (typeof WeixinJSBridge == undefined){ if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false); }else if (document.S. 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); }elattachif (documentument. document.attachEvent('WeixinJSBridgeReady', onBridgeReady); document.attachEvent('onWeixinJSBridgeReady', onBridgeReady); }}else{ onBridgeReady();}Vue引入微信js-sdk包
npm i -S weixin-js-sdk
在需要引入的頁面引入模組
import wx from 'weixin-js-sdk'
配置(參考微信官方文件:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115):
wx.config({ debug: true, // 開啟調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數資訊會透過log打出,僅在pc端時才會列印。隨機串signature: '',// 必填,簽章jsApiList: [] // 必填,需要使用的JS介面清單例如我要呼叫支付介面那麼就是[chooseWXPay]});
這裡timestamp是小寫s 是小寫,資料型別是int 型別
接下來既然配置成功了,那就繼續看官方文檔
在官方文件是這麼說的,有個ready的方法,在config驗證成功之後,把介面放在裡面確保執行。
wx.ready(function(){ // config資訊驗證後會執行ready方法,所有介面呼叫都必須在config介面取得結果之後,config就是一個客戶端的非同步操作,所以如果需要在頁面載入時就呼叫相關接口,則須把相關接口放在ready函數中調用來確保正確執行。
ready裡面的引入參數(注意資料類型,和後端同事好好配合- -)
wx.chooseWXPay({timestamp: 0, // 支付簽名時間戳,注意微信jssdk中的所有使用timestamp字段均為小寫。但最新版的支付後台生成簽名使用的timeStamp字段名需大寫其中的S字符nonceStr: '', // 支付簽章隨機串,不長於32 位元package: '', //統一支付介面傳回的prepay_id參數值,提交格式如:prepay_id=/*/*/*)signType: '', // 簽章方式,預設為'SHA1',使用新版付款需傳入'MD5'paySign: ' ', // 支付簽章success: function (res) {// 支付成功後的回呼函數}});附上本人的demo
在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端時才會列印。 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_S.sign.Type this.wechat_code.paySign, success: function () { // 支付成功後的回呼函數alert(支付成功); window.location.href = /hd/becomevip; }, cancel: function() { alert(支付失敗); } }); }.bind( this)); },總結:
踩坑總是難免的,總結,還有不要因為怕麻煩而不去做正確的事~
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。