小程序 获取手机号
?【參考小程序開發文檔:開發-指南-開放能力-用戶信息-獲取手機號】?
地理位置?wx.getLocation(Object object) | 微信開放文檔
手機號?獲取手機號 | 微信開放文檔
微信信息?小程序與小游戲獲取用戶信息接口調整,請開發者注意升級。 | 微信開放社區
目錄
1. 介紹
2. 使用方法:
?3. 手機號解密
3.1 解密需要的數據
3.2 準備解碼包
3.3?全部代碼
1. 介紹
?從基礎庫 2.21.2 開始,對獲取手機號的接口進行了安全升級,以下是新版本接口使用指南。(舊版本接口目前可以繼續使用,但建議開發者使用新版本接口,以增強小程序安全性)
因為需要用戶主動觸發才能發起獲取手機號接口,所以該功能不由 API 來調用,需用?button?組件的點擊來觸發。另外,新版本接口不再需要提前調用?wx.login?進行登錄。
注意:目前該接口針對非個人開發者,且完成了認證的小程序開放(不包含海外主體)。需謹慎使用,若用戶舉報較多或被發現在不必要場景下使用,微信有權永久回收該小程序的該接口權限。
即:?小程序需要認證,個人小程序無法獲取。
微信小程序獲取手機號提示appId沒有權限? | 微信開放社區
小程序微信認證認證審核問題匯總 | 微信開放社區https://developers.weixin.qq.com/community/develop/doc/000c06209dc0b0fff579159dd56c09
2. 使用方法:
需要將?button?組件?open-type?的值設置為?getPhoneNumber,當用戶點擊并同意之后,可以通過?bindgetphonenumber?事件回調獲取到動態令牌code,然后把code傳到開發者后臺,并在開發者后臺調用微信后臺提供的?phonenumber.getPhoneNumber?接口,消費code來換取用戶手機號。每個code有效期為5分鐘,且只能消費一次。
注:getPhoneNumber?返回的?code?與?wx.login?返回的?code?作用是不一樣的,不能混用。
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">讀取用戶手機號</button>Page({getPhoneNumber (e) {console.log(e)} })通過上面代碼,就可以彈出獲取手機號的對話框:
? 用戶點擊同意后,button 獲取到的返回值 e 打印結果?3. 手機號解密
微信小程序獲取手機號并解密詳解_a_115098的博客-CSDN博客_微信小程序獲取手機號解密微信小程序獲取手機號并解密1 獲取手機號2 解密2.1 獲取所需數據2.2 解密返回數據1 獲取手機號獲取手機號的過程官方文檔有詳細的介紹。參考官方鏈接要注意的是,此功能只對非個人且完成認證的開發者開發,個人開發者無法使用該功能。獲取微信用戶綁定的手機號,需先調用wx.login接口。//wxml文件使用button按鈕觸發獲取手機號事件,open-type="getPhoneNumber" 不能少<button open-type="getPhoneNumber" bindgetphonehttps://blog.csdn.net/a_115098/article/details/108491494微信小程序:40029錯誤(invalid code) - 簡書做小程序授權登錄獲取openid時遇到以下錯誤: {"errcode":40029,"errmsg":"invalid code, hints: [ req_id: m3yw...https://www.jianshu.com/p/a73c7afddb77
? ? ? ? 根據官方最新文檔描述,可以通過?bindgetphonenumber?事件回調獲取到動態令牌code,但是在上面打印結果中,并沒有返回 code ,所以我們仍然采用舊版接口指南。
1. 介紹
獲取微信用戶綁定的手機號,需先調用wx.login接口。
因為需要用戶主動觸發才能發起獲取手機號接口,所以該功能不由 API 來調用,需用?button?組件的點擊來觸發。
2. 使用方法
需要將?button?組件?open-type?的值設置為?getPhoneNumber,當用戶點擊并同意之后,可以通過?bindgetphonenumber?事件回調 獲取到微信服務器返回的加密數據, 然后在第三方服務端結合?session_key?以及?app_id?進行解密獲取手機號。
3. 注意事項
在回調中調用?wx.login?登錄,可能會刷新登錄態。此時服務器使用 code 換取的 sessionKey 不是加密時使用的 sessionKey,導致解密失敗。建議開發者提前進行?login;或者在回調中先使用?checkSession?進行登錄態檢查,避免?login?刷新登錄態。
3.1 解密所需數據
? ? ? ? ?了解了上面所說,手機號碼解密主要使用到的數據為:
- appId(AppID,微信公眾平臺官網-開發-開發管理-開發設置);
- session_key(?需要先通過?wx.login?接口獲得臨時登錄憑證 code,再用 wx.request 請求,這個過程還需要 appSecret【微信公眾平臺官網-開發-開發管理-開發設置】);
- encryptedData(上面獲取的e.detail.encryptedData);
- iv(上面獲取的e.detail.iv)。
獲取 session_key 整個過程的代碼:
//wx.login獲取 code, 再通過wx.request獲取 session_key wxLogin(callback){var that = this;wx.login({success (res) {wx.request({url: 'https://api.weixin.qq.com/sns/jscode2session?appid='+app.appId+'&secret='+app.appSecret+'&js_code=' + res.code + '&grant_type=authorization_code',method: 'POST',header: { 'content-type': 'application/json' },success: function (obj) {//獲取openid, session_keythat.setData({"sessionKey": obj.data.session_key});}})}}); //wx.login 結束 }????????該官方接口只推薦在測試過程中使用,使用該接口需開啟微信開發者工具-詳情-本地設置-不校驗合法域名…,投入使用時需在服務器端進行配置,具體方法可參考最下方文章鏈接。
3.2 準備解碼包
手機號碼解密主要使用的是 CryptoJS 包,點擊下載。微信官方提供了多種編程語言的示例代碼,(點擊下載)但是沒有js包,這里根據參考進行了稍微修改。
下面是一篇比較詳細的文章,值得一看。
https://www.jb51.net/article/186483.htmhttps://www.jb51.net/article/186483.htm
3.3?全部代碼
<button open-type="getPhoneNumber" bind:getphonenumber="getPhoneNumber">讀取用戶手機號</button> // pages/onePages/userInfo/userInfo.js const app = getApp(); var WXBizDataCrypt = require('../../../utils/WXBizDataCrypt'); Page({//頁面的初始數據data: {encryptedData: "", //手機號的加密數據iv: "",sessionKey: "", //wx.login,獲取session_keyphone: "",nick: "",},//生命周期函數--監聽頁面顯示onShow: function () { this.wxLogin();},//通過綁定手機號登錄getPhoneNumber: function (e) {var that = this;console.log("點擊按鈕獲取手機號",e); //獲取encryptedData、iv,encryptedData就是加密的數據if(e.detail.errMsg == 'getPhoneNumber:fail no permission'){app.utils.showToast("小程序未認證", "none", 1000);return false;} else if(e.detail.iv == undefined || !e.detail.iv){app.utils.showToast("授權失敗", "none", 1000);return false;} else if(e.detail.errMsg == 'getPhoneNumber:user deny'){//用戶拒絕授權,停留在當前頁} else { that.setData({ "encryptedData": e.detail.encryptedData, "iv": e.detail.iv });//檢查session_key 是否失效,失效會導致手機號獲取兩次的問題 wx.checkSession({success: (res) => { console.log("未失效", res)var pc = new WXBizDataCrypt(app.appId, that.data.sessionKey);var data = pc.decryptData(that.data.encryptedData, that.data.iv);console.log("解密后Data",data);wx.setStorageSync('phone', data.phoneNumber);wx.redirectTo({ url: '/pages/onePages/home/home' });},fail: (err)=>{ console.log("失效 重新wx.login")that.wxLogin(function(){var pc = new WXBizDataCrypt(app.appId, that.data.session_key);var data = pc.decryptData(that.data.encryptedData, that.data.iv);wx.setStorageSync('phone', data.phoneNumber); //將手機號存storagewx.redirectTo({ url: '/pages/onePages/home/home' });}) }})}}, //獲取手機號//手機號解碼:wx.login獲取 code, 再通過wx.request獲取 session_keywxLogin(callback){var that = this;wx.login({success (res) {// console.log("wx.login",res) //wx.login獲取 codewx.request({url: 'https://api.weixin.qq.com/sns/jscode2session?appid='+app.appId+'&secret='+app.appSecret+'&js_code=' + res.code + '&grant_type=authorization_code',method: 'POST',header: { 'content-type': 'application/json' },success: function (obj) {// console.log("解密",obj); //獲取openid, session_keythat.setData({"sessionKey": obj.data.session_key});if(callback) callback();}})}}); //wx.login 結束}})對小程序開發還不太熟悉, 有問題歡迎指出
總結
- 上一篇: mockJs文档(一)
- 下一篇: 微信小程序 监听位置信息