微信小程式如何獲取使用者手機號

startstudysmile發表於2018-11-05

一、原理步驟

  • 第一步:呼叫微信小程式login介面,得到一個code值
  • 第二步:拿到code值,將其傳送給服務端。
  • 獲取openid(使用者唯一標識)和sessionkey(會話金鑰)。
  • 第三步:利用得到的sessionKey呼叫getPhoneNumber介面
  • 通過引數【encryptedData】 、【iv】 、【sessionKey】 請求後臺解密獲取使用者手機號

二、getPhoneNumber返回引數說明

  • encryptedData:包括敏感資料在內的完整使用者資訊的加密資料
    • encryptedData 解密後為以下 json 結構
{
    "phoneNumber": "13580006666",  //使用者繫結的手機號(國外手機號會有區號)
    "purePhoneNumber": "13580006666", //沒有區號的手機號
    "countryCode": "86",//區號
    "watermark":
    {
        "appid":"APPID",
        "timestamp":TIMESTAMP
    }
}
複製程式碼
  • iv:加密演算法的初始向量

三、實踐程式碼

<button 
    open-type="getPhoneNumber" 
    bindgetphonenumber="getPhoneNumber"
> 
</button> 
複製程式碼
Page({

  /**
   * 頁面的初始資料
   */
  data: {
    sessionkey:"",
  },

  /**
   * 生命週期函式--監聽頁面載入
   */
  onLoad: function (options) {
    wx.login({
      success: res => {
        var that = this
        // 獲取session介面
        wx.request({
          url: '',
          data: {
            'code': res.code
          },
          method: 'POST',
          header: {
            'Content-Type': 'application/x-www-form-urlencoded'
          }, 
          success: function (res) {
            that.setData({
              sessionkey: res.data
            });
          },
          fail: function (err) {
            console.log(err);
          }
        })
      }
    })
  },
    getPhoneNumber: function(e) { //點選獲取手機號碼按鈕
      var that = this;
      wx.checkSession({
        success: function() {
          var ency = e.detail.encryptedData;
          var iv = e.detail.iv;
          var sessionk = that.data.sessionKey;
          if (e.detail.errMsg == 'getPhoneNumber:fail user deny') {
            that.setData({
              modalstatus: true
            });
          } else { //同意授權
            wx.request({
              method: "GET",
              url: '',
              data: {
                encrypdata: ency,
                ivdata: iv,
                sessionkey: sessionk
              },
              header: {
                'content-type': 'application/json' // 預設值  
              },
              success: (res) => {
                console.log("解密成功")
                console.log(res)
                let phone = res.data.phoneNumber
                console.log(phone);
              },
              fail: function(res) {
                console.log("解密失敗~~~~~~~~~~~~~");
                console.log(res);
              }
            });
          }
        },
        fail: function() {
          console.log("session_key 已經失效,需要重新執行登入流程");
          that.wxlogin(); //重新登入
        }
      });
    }
})
複製程式碼

相關文章