在開發微信公衆號活動中,因爲以前沒有接觸過與微信相關的開發,因此致使掉坑,爬坑,不過也讓我對微信公衆和微信官方文檔的熟悉大大增長。
這個我已經單獨作總結: https://segmentfault.com/a/11...
在微信的官方文檔中: 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
在須要引入的頁面引入模塊php
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驗證成功以後,把接口放在裏面確保執行。ios
wx.ready(function(){ // config信息驗證後會執行ready方法,全部接口調用都必須在config接口得到結果以後,config是一個客戶端的異步操做,因此若是須要在頁面加載時就調用相關接口,則須把相關接口放在ready函數中調用來確保正確執行。對於用戶觸發時才調用的接口,則能夠直接調用,不須要放在ready函數中。 });
ready裏面的引入參數(注意數據類型,和後端同事好好配合- -)npm
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)); },
踩坑老是不免的,總結,還有不要由於怕麻煩而不去作正確的事~