微信小程序踩坑之獲取手機號


最近在開發小程序遇到這樣一個問題, 在用戶點擊授權后去解密手機號時會出現第一次失敗,第二次成功的情況。研究了一段時間,終於找到比較合理的解決方案,在此記錄並總結一下,希望可以幫助到大家。

需求描述

獲取電話

在用戶點擊獲取電話按鈕后, 將用戶在微信內設置的電話解密顯示在聯系電話輸入框內

具體代碼

      <view class="cu-form-group">
            <view class="title text-black">聯系電話</view>
            <input class="radius"  name="mobile"   placeholder="請輸入聯系電話" value="{{detail.mobile}}" bindinput="onInputMobile"></input>
            <button bindgetphonenumber="getPhoneNumber" class="cu-btn line-blue sm" openType="getPhoneNumber">獲取電話</button>
        </view>

首先需要小程序button組件並設置 openType="getPhoneNumber"

    onLoad: async function () {
        this.getSessionKey()
    },
    async getSessionKey() {
        const { code } = await wx.login()
        const res = await Index.getSessionKey({
            code
        })
        if (res.code == 1) {
            this.setData({
                session_key: res.data
            })
        }
    },
    getPhoneNumber: async function (e) {
        if (e.detail.errMsg === "getPhoneNumber:ok") {
            const res = await Index.getPhone({
                iv: e.detail.iv,
                encryptedData: e.detail.encryptedData,
                session_key: this.data.session_key
            })
            if (res.err == 0) {
                wx.showToast({
                    title: '網絡有點兒小波動,請點擊重試',
                    icon: 'none'
                })
                return
            }
            const detail = this.data.detail
            detail.mobile = res.err.phoneNumber
            this.setData({
                detail
            })
        } else if (e.detail.errMsg === "getPhoneNumber:fail user deny") {
            wx.showModal({
                title: '提示',
                content: '你已拒絕授權,請重新點擊並授權',
                showCancel: false,
                confirmText: "知道了"
            })
        }
    },

onLoad生命周期內獲取登錄code, 並將code碼發送給服務端獲取session_key

服務端獲取session_key請參考小程序官方文檔

在用戶點擊獲取電話按鈕后, 將session_key以及獲取到的iv,encryptedData發送給服務端進行解密。

這樣就可以獲取到用戶的手機號了。

之前我們的方案是, 在用戶點擊獲取電話按鈕后, 直接在getPhoneNumber函數內調用wx.logon(),將code,iv,encryptedData發送給服務端, 服務端先拿code獲取session_key, 然后和iv,encryptedData結合進行解密,這樣做的話就會出現第一次解密失敗,然后再次點擊按鈕調用該解密接口就能成功。 而且隔5-6分鍾就又會出現該情況。

當調用wx.checkSession(Object object)檢查登錄態是否過期也是一直成功的。

猜測

后來想了一下,為什么在getPhoneNumber函數內調用wx.login, 然后服務端拿codesession_key,並結合iv,encryptedData解密不行呢?而把wx.login放進onLoad內獲取session_key就可以呢?

我想應該是在wx.login調用時會刷新微信服務器的session_key,直接在getPhoneNumber調wx.login,或許微信服務器還沒來得及刷新,服務端就拿着進行解密, 解密時用的還是上次過期的session_key,所以只有第二次以后才能成功。而wx.login放到onload內,就能來的及session_key了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM