遭遇到的問題
uniApp生成h5項目,引入wxjsAPI,調用微信掃一掃。安卓(Android)機下正常調用,蘋果(ios)機上首次進入調用成功,之后就調不起來掃一掃(invalid signature)。
js相關代碼如下:
const wxJSAPI = require("common/javascript/wxJSAPI.js")
// 微信jsdk掃碼
wxSdk(res) {
let _this = this
wxJSAPI.config({
debug: BASE_CONFIG.wxConfig.debug, // 開啟調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會通過log打出,僅在pc端時才會打印。
appId: res.appId,// 必填,公眾號的唯一標識
timestamp: res.timestamp, // 必填,生成簽名的時間戳
nonceStr: res.nonceStr, // 必填,生成簽名的隨機串
signature: res.signature,// 必填,簽名
jsApiList: ['scanQRCode'], // 必填,需要使用的JS接口列表
});
wxJSAPI.ready(function () { //需在用戶可能點擊分享按鈕前就先調用
wxJSAPI.scanQRCode({
needResult: 1, // 默認為0,掃描結果由微信處理,1則直接返回掃描結果,
scanType: ["qrCode","barCode"], // 可以指定掃二維碼還是一維碼,默認二者都有
success: function (res) {
// let qrInfo = {toPageUrl:res.resultStr}
window.open(res.resultStr)
}
});
});
wxJSAPI.error(function(res){
console.log(res,'wxJSAPI.error')
});
},
問題原因及解決方案
原因
在全網(wǎng)搜索加細細察看微信jsAPI文檔后發(fā)現(xiàn)如下一段話:
(同一個url僅需調用一次,對于變化url的SPA的web app可在每次url變化時進行調用,目前Android微信客戶端不支持pushState的H5新特性,所以使用pushState來實現(xiàn)web app的頁面會導致簽名失敗,此問題會在Android6.2中修復)。
這段話講的是Android不支持pushState的h5特性,然而Android上是沒問題的,有問題的是ios。但是這句話無疑提供了解題思路:會不會是ios上的微信客戶端因為不支持pushState的特性而造成的簽名失敗導致scanQRCode只在首次調用生效呢
過程
1,檢測傳入獲取簽名url與當時頁面url是否一致
/**
*
* 由于只有這個頁面調用scanQRCode,一開始傳參給后端的url寫死在配置里面。后來與后端配合檢測是否因ios
*
* 下傳參url與當時頁面url不一致而造成的簽名失敗
*
*/
getWxConfigApi(successFn) { // 獲取微信config信息
let currtentUrl
// #ifdef H5
currtentUrl = location.href
// #endif
$http({
apiUrl: GET_WXCONFIG,
params: {url:currtentUrl?currtentUrl:BASE_CONFIG.wxConfig.paramUrl},
success:(res)=>{
typeof successFn == "function" && successFn(res)
},
fail:(err)=>{
console.log(err,'getWxConfigApi--fail')
}
})
}
/**
*
* 結果:
* 后端小伙伴在日志中發(fā)現(xiàn)傳入的參數(shù)與當前url一致是匹配的
*
*/
2,驗證沒得到想要的結果,一時再次進入窘境。卻忽然間想到在做分享功能時遇到的一個問題。
比如在,https://XXX.XXX.com/selfInfo/index 進行分享(分享未作任何配置),在Android中分享出去的路徑為 https://XXX.XXX.com/selfInfo/index 而在ios下分享出去的確是 https://XXX.XXX.com/
嗯嗯。。。(好像想到點什么?)
會不會時ios只認第一次進入項目的路徑呢?(小聲逼逼。。。)
于是有了下面的嘗試(在需要跳轉至該頁面的地方棄用框架的uni.navgateto接口進行跳轉采用window.open進行跳轉)
goPointPage(item) {
// #ifdef H5
window.open(BASE_CONFIG.wxConfig.paramUrl)
// #endif
// uni.reLaunch({
// url:'/pages/home/index'
// })
},
/**
*
* 結果:
* 大功告成,調用一次成功一次。(心情變得美美的)
*
*/
總結
問題最終解決了,過程卻沒有當下寫的這么輕松。文檔還是得細細的品,搜索還是得好好的用,技術還是不夠用!前端路漫漫,吾將上下而求索。