微信小程序獲取手機(jī)號(hào)的踩坑記錄
前言
最近在開發(fā)小程序遇到這樣一個(gè)問題, 在用戶點(diǎn)擊授權(quán)后去解密手機(jī)號(hào)時(shí)會(huì)出現(xiàn)第一次失敗,第二次成功的情況。研究了一段時(shí)間,終于找到比較合理的解決方案,在此記錄并總結(jié)一下,希望可以幫助到大家。
需求描述
在用戶點(diǎn)擊獲取電話按鈕后, 將用戶在微信內(nèi)設(shè)置的電話解密顯示在聯(lián)系電話輸入框內(nèi)
具體代碼
<view class="cu-form-group"> <view class="title text-black">聯(lián)系電話</view> <input class="radius" name="mobile" placeholder="請(qǐng)輸入聯(lián)系電話" value="{{detail.mobile}}" bindinput="onInputMobile"></input> <button bindgetphonenumber="getPhoneNumber" class="cu-btn line-blue sm" openType="getPhoneNumber">獲取電話</button> </view>
首先需要小程序button組件并設(shè)置 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: '網(wǎng)絡(luò)有點(diǎn)兒小波動(dòng),請(qǐng)點(diǎn)擊重試', 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: '你已拒絕授權(quán),請(qǐng)重新點(diǎn)擊并授權(quán)', showCancel: false, confirmText: "知道了" }) } },
在 onLoad生命周期內(nèi)獲取登錄code, 并將code碼發(fā)送給服務(wù)端獲取session_key
服務(wù)端獲取session_key請(qǐng)參考小程序官方文檔。
在用戶點(diǎn)擊獲取電話按鈕后, 將session_key以及獲取到的iv,encryptedData發(fā)送給服務(wù)端進(jìn)行解密。
這樣就可以獲取到用戶的手機(jī)號(hào)了。
坑
之前我們的方案是, 在用戶點(diǎn)擊獲取電話按鈕后, 直接在getPhoneNumber函數(shù)內(nèi)調(diào)用wx.logon(),將code,iv,encryptedData發(fā)送給服務(wù)端, 服務(wù)端先拿code獲取session_key, 然后和iv,encryptedData結(jié)合進(jìn)行解密,這樣做的話就會(huì)出現(xiàn)第一次解密失敗,然后再次點(diǎn)擊按鈕調(diào)用該解密接口就能成功。 而且隔5-6分鐘就又會(huì)出現(xiàn)該情況。
當(dāng)調(diào)用wx.checkSession(Object object)檢查登錄態(tài)是否過期也是一直成功的。
猜測(cè)
后來想了一下,為什么在getPhoneNumber函數(shù)內(nèi)調(diào)用wx.login, 然后服務(wù)端拿code換session_key,并結(jié)合iv,encryptedData解密不行呢?而把wx.login放進(jìn)onLoad內(nèi)獲取session_key就可以呢?
我想應(yīng)該是在wx.login調(diào)用時(shí)會(huì)刷新微信服務(wù)器的session_key,直接在getPhoneNumber調(diào)wx.login,或許微信服務(wù)器還沒來得及刷新,服務(wù)端就拿著進(jìn)行解密, 解密時(shí)用的還是上次過期的session_key,所以只有第二次以后才能成功。而wx.login放到onload內(nèi),就能來的及session_key了。
總結(jié)
到此這篇關(guān)于微信小程序獲取手機(jī)號(hào)踩坑的文章就介紹到這了,更多相關(guān)微信小程序獲取手機(jī)號(hào)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 微信小程序中獲取用戶手機(jī)號(hào)授權(quán)登錄詳細(xì)步驟
- PHP配合微信小程序?qū)崿F(xiàn)獲取手機(jī)號(hào)碼詳解
- 微信小程序登錄方法之授權(quán)登陸及獲取微信用戶手機(jī)號(hào)
- 微信小程序獲取用戶手機(jī)號(hào)碼的詳細(xì)步驟
- 微信小程序如何同時(shí)獲取用戶信息和用戶手機(jī)號(hào)
- 微信小程序用戶授權(quán)獲取手機(jī)號(hào)(getPhoneNumber)
- 微信小程序如何通過用戶授權(quán)獲取手機(jī)號(hào)(getPhoneNumber)
- 微信小程序利用云函數(shù)獲取手機(jī)號(hào)碼
- 微信小程序綁定手機(jī)號(hào)獲取驗(yàn)證碼功能
- .NET6使用微信小程序授權(quán)登錄獲取手機(jī)號(hào)
相關(guān)文章
使用JavaScript 實(shí)現(xiàn)時(shí)間軸與動(dòng)畫效果的示例代碼(前端組件化)
這篇文章主要介紹了使用JavaScript 實(shí)現(xiàn)時(shí)間軸與動(dòng)畫效果的示例代碼(前端組件化),本文重點(diǎn)給大家介紹基礎(chǔ)的動(dòng)畫類實(shí)現(xiàn)時(shí)間軸,通過示例代碼給大家介紹的很詳細(xì),需要的朋友可以參考下2021-04-04js創(chuàng)建一個(gè)input數(shù)組并綁定click事件的方法
這篇文章主要介紹了js創(chuàng)建一個(gè)input數(shù)組并綁定click事件的方法,需要的朋友可以參考下2014-06-06JS實(shí)現(xiàn)京東首頁之頁面頂部、Logo和搜索框功能
這篇文章主要實(shí)現(xiàn)京東的頁面頂部,logo和搜索框功能,本文有效果展示,頁面布局詳細(xì)分析,具體實(shí)現(xiàn)代碼,介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-01-01javascript suggest效果 自動(dòng)完成實(shí)現(xiàn)代碼分享
像百度與google,當(dāng)我們往搜索框輸入東西時(shí)就會(huì)出現(xiàn)一排列表提示用戶有什么熱門或適合的候選詞,這種效果就叫suggest。本文將一步步教你如何設(shè)計(jì)它2012-02-02微信小程序時(shí)間軸實(shí)現(xiàn)方法示例
這篇文章主要介紹了微信小程序時(shí)間軸實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了微信小程序wx:for語句使用與時(shí)間軸縱向布局相關(guān)操作技巧,需要的朋友可以參考下2019-01-01javascript實(shí)現(xiàn)分欄顯示小技巧附圖
考試頁面可以實(shí)現(xiàn)隱藏左邊的考生信息部分,學(xué)了javascript后也能實(shí)現(xiàn)這個(gè)功能了,下面是實(shí)現(xiàn)思路、代碼及解效果截圖,喜歡的朋友們可以看看2014-10-10