微信小程式獲取微信繫結授權手機號getPhoneNumber 全流程及出現手機號帶*號問題詳解

大國的部落格發表於2018-03-10

微信小程式文件中給出如下示例

獲取微信使用者繫結的手機號,需先呼叫login介面。

因為需要使用者主動觸發才能發起獲取手機號介面,所以該功能不由 API 來呼叫,需用 <button> 元件的點選來觸發。

注意:目前該介面針對非個人開發者,且完成了認證的小程式開放。需謹慎使用,若使用者舉報較多或被發現在不必要場景下使用,微信有權永久回收該小程式的該介面許可權。

使用方法

需要將 <button> 元件 open-type 的值設定為 getPhoneNumber,當使用者點選並同意之後,可以通過 bindgetphonenumber 事件回撥獲取到微信伺服器返回的加密資料, 然後在第三方服務端結合 session_key 以及 app_id 進行解密獲取手機號。

注意

在回撥中呼叫 wx.login 登入,可能會重新整理登入態。此時伺服器使用 code 換取的 sessionKey 不是加密時使用的 sessionKey,導致解密失敗。建議開發者提前進行 login;或者在回撥中先使用 checkSession 進行登入態檢查,避免 login 重新整理登入態。

例子

<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"> </button>
Page({ 
    getPhoneNumber: function(e) { 
        console.log(e.detail.errMsg) 
        console.log(e.detail.iv) 
        console.log(e.detail.encryptedData) 
    } 
})

返回引數說明

引數型別說明
encryptedDataString包括敏感資料在內的完整使用者資訊的加密資料,詳細見加密資料解密演算法
ivString加密演算法的初始向量,詳細見加密資料解密演算法

encryptedData 解密後為以下 json 結構,詳見加密資料解密演算法

{
    "phoneNumber": "13580006666",  
    "purePhoneNumber": "13580006666", 
    "countryCode": "86",
    "watermark":
    {
        "appid":"APPID",
        "timestamp":TIMESTAMP
    }
}
但是到這裡你會發現其實根本不詳盡尤其是解密和錯誤程式碼方面


首先如手冊所述,解析加密資料包不太明白我給大家貼個示例


getPhoneNumber: function (e) {
console.log(e.detail.iv);
console.log(e.detail.encryptedData);
wx.login({
success: res => {
console.log(res.code);
wx.request({
url: 'https://你的解密地址',
data: {
'encryptedData': encodeURIComponent(e.detail.encryptedData),
'iv': e.detail.iv,
'code': res.code
},
method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
header: {
'content-type':'application/json'
}, // 設定請求的 header
success: function (res) {
if (res.status ==1) {//我後臺設定的返回值為1是正確
//存入快取即可
wx.setStorageSync('phone', res.phone);
}
},
fail: function (err) {
console.log(err);
}
})
}
})
}

後臺解析程式碼就是利用傳過去的三個值,來進行解析每個語言解析方式不同請下載樣例

微信官方提供了多種程式語言的示例程式碼(點選下載)。每種語言型別的介面名字均一致。呼叫方式可以參照示例。


注意解析方式跟解析使用者資訊是一個解析方式!!!!


在這裡小編遇到了一個問題解析回的形式雖然跟文件相同但是!

卻是這個樣子的資料:



這樣的情況其實是因為開發的基礎庫版庫過低造成的

配置地點在這裡:



小編修改為v1.9.1之後呈現形式就如同官網手冊 一樣了

{
    "phoneNumber": "13580006666",  
    "purePhoneNumber": "13580006666", 
    "countryCode": "86",
    "watermark":
    {
        "appid":"APPID",
        "timestamp":TIMESTAMP
    }
}

至此獲取微信繫結的使用者手機號完成!


還有一點要注意你的開發版本上去了,但是使用者不一定更新了

所以微信後臺有這樣一個配置~


剩下的問題歡迎在下面評論,第一次寫部落格希望對大家有幫助!!!


我在網上已經看到幾篇轉載的,個人之作轉載請註明出處!

csdn部落格-大國的部落格

原文地址:https://blog.csdn.net/weixin_41818665/article/details/79509792

相關文章