一文解決wx.config沒響應、configfail沒具體原因

我們的前端系統(tǒng) cat 是被 animal 系統(tǒng)以 iframe 嵌套的,animal 系統(tǒng) 是政務微信里的一個應用,這事壞就壞在 iframe 上。

微信開放社區(qū)帖子絕大多數(shù)沒人回答,又因為牽扯到多方,主要是我自己方向沒搞對,花了不少時間。

解決辦法就是調(diào)用 wx 的方法都在 window.parent.wx 上進行,鑒權(quán)的 url 也要是 window.parent.location.href

關(guān)鍵代碼

import CryptoJS from 'crypto-js'
import wxApi from '@/api/wxApi'
import { showFailToast } from 'vant'
export default function () {
    return {
        startWxConfig(callback = () => {}) {
            let signature = ref(null)
            let noncestr = ref('')
            let timestamp = ref('')
            let queryParams = ref('')
            let jsapi_ticket
            function randomString(len) {
                len = len || 32
                var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
                var maxPos = $chars.length
                var pwd = ''
                for (let i = 0; i < len; i++) {
                    pwd += $chars.charAt(Math.floor(Math.random() * maxPos))
                }
                return pwd
            }

            // 生成簽名
            function createSignature() {
                noncestr.value = randomString(16)
                timestamp.value = Date.now()
                queryParams.value = randomString(32).toLowerCase()

                let str = `jsapi_ticket=${jsapi_ticket}&noncestr=${noncestr.value}&timestamp=${timestamp.value}&url=${window.parent.location.href}`

                signature.value = CryptoJS.SHA1(str).toString()
            }
            wxApi.getJsapiTicket().then((rsp) => {
                if (rsp.success) {
                    jsapi_ticket = rsp.result
                    createSignature()
                    window.parent.wx.ready(function () {
                        console.info('微信鑒權(quán)成功')
                        callback(true)
                    })
                    window.parent.wx.error(function (res) {
                        showFailToast('微信鑒權(quán)失敗')
                        console.info('微信鑒權(quán)失敗', res)
                        callback(false)
                    })

                    let configParams = {
                        beta: true,
                        debug: true,
                        appId: '',
                        timestamp: timestamp.value,
                        nonceStr: noncestr.value,
                        signature: signature.value,
                        jsApiList: ['getLocation'],
                    }

                    window.parent.wx.config(configParams)
                }
            })
        },
    }
}

wx.config 沒反應

wx.config 調(diào)用了,不觸發(fā) read 也不觸發(fā) error,而我通過手機微信掃碼是有響應的,突破點是同事提點政務微信有掃一掃的功能,可以判定問題是因為 iframe 嵌套導致的。

線上會議后,animal 系統(tǒng)的人同意將https://res.wx.qq.com/open/js/jweixin-1.6.0.js
放在他們的系統(tǒng)引入

config:fail 但是沒說什么原因

這是因為我鑒權(quán)的 url 不是 window.parent.location.href,而是 window.location.href

這回我直接用政務微信掃描生產(chǎn)環(huán)境的二維碼是行的通的,之前為什么不這么做?是因為報登錄失敗,我問 animal 系統(tǒng)的對接人說我們是不能直接登生產(chǎn)環(huán)境,后來我們這邊的同事說是可以的,并提供了生產(chǎn)環(huán)境的用戶名密碼。

基于此就要考慮由 animal 系統(tǒng)的人來提供鑒權(quán),我們傳一些動態(tài)參數(shù)。線上會議討論,提到我們的代碼他們哪些要改的時候,animal 系統(tǒng)的前端提到鑒權(quán) url 的問題,我修改后試了一下可以了。

總結(jié)

有時候解決問題是需要多個角度,問題也具備一定的隨機性,比如換一個人來做,他可能首先想到的就是 iframe,animal 系統(tǒng)和我們都有一個測試環(huán)境,在里面雖然不同域,但是調(diào)用 wx.config 的現(xiàn)象是相同的。除非有明確的經(jīng)驗,否則經(jīng)驗也極有可能限制住思路。

我看網(wǎng)上挺多 wx.config 的問題但沒有明確答案,其中 jsapi_ticket 是 animal 系統(tǒng)提供的,剩下的有我自己完成,這也一度是我懷疑的。中間還拉了幾次政務微信的人開會,結(jié)論是可能簽名算法不對,雖然我認為不是這個問題,但也想借著這個由子讓他們完整的提供參數(shù),從代碼設計的角度來看也是合理的。

每當遇到這種問題,都會想起很早之前結(jié)論,問題的解決最終還是要靠自己,一定是某些沒注意到的點,到了后面我的心態(tài)也很不好了,失誤很多,尤其是沒注意到 iframe 這個問題上,總覺得是別人的問題,總想著讓人家配合,這都要反思。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容