詳解IOS微信上Vue單頁(yè)面應(yīng)用JSSDK簽名失敗解決方案
背景
手機(jī)型號(hào):
型號(hào):iphone 7 / iphone xs max
版本:ios 10.3.1 / ios 12.1
微信版本:WeChat 6.7.3
問(wèn)題還原:
Vue應(yīng)用(vue-router)上使用history模式,在某個(gè)頁(yè)面內(nèi)調(diào)用微信JSSDK相關(guān)API,如掃碼、分享等,使用當(dāng)前頁(yè)面URL總會(huì)出現(xiàn)簽名錯(cuò)誤(invalid signature),導(dǎo)致API調(diào)用失敗。
問(wèn)題根源
Vue-Router進(jìn)行路由切換的時(shí)候,總是會(huì)操作瀏覽器的歷史記錄,從而響應(yīng)頁(yè)面URL變化。
在JSSDK文檔頁(yè)面有這么一句話:
同一個(gè)url僅需調(diào)用一次,對(duì)于變化url的SPA的web app可在每次url變化時(shí)進(jìn)行調(diào)用,目前Android微信客戶端不支持pushState的H5新特性,所以使用pushState來(lái)實(shí)現(xiàn)web app的頁(yè)面會(huì)導(dǎo)致簽名失敗,此問(wèn)題會(huì)在Android6.2中修復(fù)
但根據(jù)多次測(cè)試情況來(lái)看,情況恰好相反,在Android下直接使用 window.location.href 得出的URL進(jìn)行簽名是完全沒(méi)問(wèn)題(可能已升級(jí)至Android6.2以上版本),在IOS上就不行了。
這是因?yàn)樵贗OS上,無(wú)論路由切換到哪個(gè)頁(yè)面,實(shí)際真正有效的的簽名URL是【第一次進(jìn)入應(yīng)用時(shí)的URL】。
比如進(jìn)入應(yīng)用首頁(yè)是: https://m.app.com,需要使用JSSDK的頁(yè)面A是:https://m.app.com/product1/123,無(wú)論從首頁(yè)進(jìn)入到A頁(yè)面之前,中間跳轉(zhuǎn)過(guò)多少次路由,最終簽名有效的URL還是首頁(yè)URL。
解決方案
方案一
直接粗暴處理方式:
在進(jìn)入需要使用JSSDK頁(yè)面(B)的前一個(gè)頁(yè)面(A),即 A > B,直接使用 window.location.href 或 window.open 打開(kāi)B頁(yè)面,此時(shí)因?yàn)锽頁(yè)面是直接刷新方式進(jìn)入,所以當(dāng)前B頁(yè)面URL無(wú)論IOS或Android都是可以直接拿來(lái)簽名的。
這種方式處理缺點(diǎn)也很明顯,如頁(yè)面刷新抖動(dòng)太厲害不夠平滑過(guò)渡,再比如B頁(yè)面需要從vuex中取出緩存信息,如果這些緩存信息不是通過(guò)vuex保存在localstorage的話,取出來(lái)的肯定都是空的。
方案二
思路:既然IOS僅可使用第一次進(jìn)入應(yīng)用的URL來(lái)簽名,那么在vuex上緩存一個(gè)微信簽名URL,IOS保存第一次進(jìn)入應(yīng)用的URL,Android則緩存為每個(gè)頁(yè)面的URL。簽名時(shí),直接從緩存拿出簽名URL來(lái)處理。
// 全局判斷是否IOS方法 function isIos(){ const u = navigator.userAgent; return u.indexOf("iPhone") > -1 || u.indexOf("Mac OS") > -1; }
1. 定義vuex緩存
... { state: { wechatSignUrl: "" }, mutations: { setWechatSignUrl(state, wxSignUrl) { // 關(guān)鍵點(diǎn) // IOS僅記錄第一次進(jìn)入頁(yè)面時(shí)的URL // IOS微信切換路由實(shí)際URL不變,只能使用第一進(jìn)入頁(yè)面的URL進(jìn)行簽名 if (isIos() && state.wxSignUrl !== '') { return; } state.wxSignUrl = wxSignUrl; } }, getters: { getWechatSignUrl: (state) => state.wxSignUrl } } ...
關(guān)鍵點(diǎn)在于設(shè)置更新微信簽名URL判斷的地方:首次進(jìn)入應(yīng)用頁(yè)面的時(shí)候肯定會(huì)觸發(fā)更新,若是IOS且簽名URL已經(jīng)設(shè)置過(guò)了,那么就不需要更新設(shè)置了,只要不退出或刷新應(yīng)用,緩存永遠(yuǎn)都會(huì)是首次進(jìn)入頁(yè)面URL。
2. 路由守衛(wèi)內(nèi)觸發(fā)更新簽名URL
import store form "@/stores" // 獲取真實(shí)有效微信簽名URL function getWechatSignUrl(to){ if(isIos()) { return window.location.href; } else { // 此處$appHost需要自行處理 return $appHost + to.fullPath } } ... $router.beforeEach((to, from, next) => { store.commit("setWechatSignUrl", getWechatSignUrl(to)); }) ...
在路由守衛(wèi)內(nèi)更新簽名URL,保證IOS是使用當(dāng)前頁(yè)面URL,Android是使用目標(biāo)路由完整地址再加上域名
3. 使用簽名URL調(diào)用JSSDK API
在使用JSSDK API的頁(yè)面通過(guò)vuex取出緩存的微信簽名URL,然后進(jìn)行簽名。
比如:
import store form "@/stores" ... { methods: { initWechatShareConfig() { const that = this; const wxSignUrl = store.getters['getWechatSignUrl']; const wxShareConfigs = { // 微信分享配置 } // 初始化微信分享 $wechat.share(wxSignUrl, wxShareConfigs); } } } ...
$wechat.share 是根據(jù)JSSDK文檔二次封裝的分享方法,內(nèi)部是根據(jù)wxSignUrl先進(jìn)行簽名,然后再調(diào)用分享API
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- vue?vue-touch移動(dòng)端手勢(shì)詳解
- atom-design(Vue.js移動(dòng)端組件庫(kù))手勢(shì)組件使用教程
- vue+element加入簽名效果(移動(dòng)端可用)
- 使用vue實(shí)現(xiàn)手寫(xiě)簽名功能
- vue 使用 canvas 實(shí)現(xiàn)手寫(xiě)電子簽名
- vue移動(dòng)端使用canvas簽名的實(shí)現(xiàn)
- VUE解決微信簽名及SPA微信invalid signature問(wèn)題(完美處理)
- 使用vue實(shí)現(xiàn)一個(gè)電子簽名組件的示例代碼
- 詳解Vue開(kāi)發(fā)微信H5微信分享簽名失敗問(wèn)題解決方案
- 基于Vue實(shí)現(xiàn)手勢(shì)簽名
相關(guān)文章
Vue中的ref作用詳解(實(shí)現(xiàn)DOM的聯(lián)動(dòng)操作)
這篇文章主要介紹了Vue中的ref作用詳解(實(shí)現(xiàn)DOM的聯(lián)動(dòng)操作),需要的朋友可以參考下2017-08-08vue基于viewer實(shí)現(xiàn)的圖片查看器功能
這篇文章主要介紹了vue基于viewer實(shí)現(xiàn)的圖片查看器的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04vue實(shí)現(xiàn)消息列表向上無(wú)縫滾動(dòng)效果
本文主要實(shí)現(xiàn)vue項(xiàng)目中,消息列表逐條向上無(wú)縫滾動(dòng),每條消息展示10秒后再滾動(dòng),為了保證用戶能看清消息主題,未使用第三方插件,本文實(shí)現(xiàn)方法比較簡(jiǎn)約,需要的朋友可以參考下2024-06-06Vue利用draggable實(shí)現(xiàn)多選拖拽效果
這篇文章主要為大家詳細(xì)介紹了如何利用vue中的draggable插件實(shí)現(xiàn)多選拖拽效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05在vue中v-bind使用三目運(yùn)算符綁定class的實(shí)例
今天小編就為大家分享一篇在vue中v-bind使用三目運(yùn)算符綁定class的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09Vue3實(shí)現(xiàn)地圖選點(diǎn)組件的示例代碼
這篇文章主要為大家詳細(xì)介紹了Vue3實(shí)現(xiàn)地圖選點(diǎn)組件的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01