小程序授權(quán)獲取微信用戶手機(jī)號碼

搞事情
  1. 小程序wxml文件中增加授權(quán)標(biāo)簽
  # 授權(quán)按鈕,綁定用戶點(diǎn)擊后的方法 getPhoneNumber()
  <button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">{{quickLoginTitle}}</button>
  1. 在小程序js文件中增加getPhoneNumber方法
 getPhoneNumber: function (e) {
  // 參數(shù)e是綁定的授權(quán)方法自動(dòng)傳入過來的, 主要是為了拿到vi和encryptedData值從后臺(tái)換取用戶聯(lián)系方式
  if ("getPhoneNumber:ok" != e.detail.errMsg){
    wx.showToast({
      icon:'none',
      title: '快捷登陸失敗'
    })
    return;
  }
  var iv = e.detail.iv;
  var encryptedData = e.detail.encryptedData;
 // this.data.wxCode, 定義wxCode變量,并在onShow()方法中調(diào)用小程序login方法獲取code值賦予this.data.wxCode
  var code = this.data.wxCode;
  var _this = this;
  //調(diào)用后臺(tái)接口獲取用戶手機(jī)號碼
  api.sendPost({
    url: api.decode_phone,
    params:{
      encrypted: encryptedData,
      iv:iv,
      code:code
    },
    success:function(data){
     // 獲取到的手機(jī)號碼
      var phone = data.phone;
    },
    fail:function(msg){
   })
}
  1. 在后臺(tái)增加接口
  @RequestMapping(value = "decode/wxapp/phone", method = RequestMethod.POST)
  @Override
  public Result<JSONObject> decodeWxAppPhone(
          @RequestParam(value = "encrypted") String encrypted,
          @RequestParam(value = "iv") String iv,
          @RequestParam(value = "code") String code) {
      return Result.success(userService.decodeWxAppPhone(encrypted, iv, code));
  }
  1. userService.decodeWxAppPhone 內(nèi)部實(shí)現(xiàn)邏輯
  // 定義微信解密獲取手機(jī)號碼的接口地址,固定的
  String wxAppHost = "https://api.weixin.qq.com";
  String wxAppPath =  "/sns/jscode2session"
  String wxAppId = "自己的appid"
  String wxAppSecret = "自己的wxAppSecret"
  
  public JSONObject decodeWxAppPhone(String encrypted, String iv, String code) {
      String path =
              wxAppPath
                      + "?appid="
                      + wxAppId
                      + "&secret="
                      + wxAppSecret
                      + "&js_code="
                      + code
                      + "&grant_type=authorization_code";
      try {
          // 向微信服務(wù)器發(fā)送get請求獲取加密了的內(nèi)容
          HttpResponse response = HttpUtils.doGet(wxAppHost, path, "GET", null, null);
          String jsonStr = EntityUtils.toString(response.getEntity());     
          JSONObject jsonObject = JSON.parseObject(jsonStr);
          String sessionkey = jsonObject.getString("session_key");

          // 解密
          byte[] encrypData = Base64Utils.decodeFromString(encrypted);
          byte[] ivData = Base64Utils.decodeFromString(iv);
          byte[] sessionKey = Base64Utils.decodeFromString(sessionkey);
          AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivData);
          Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
          SecretKeySpec keySpec = new SecretKeySpec(sessionKey, "AES");
          cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
          
          String resultString = new String(cipher.doFinal(encrypData), "UTF-8");
          JSONObject object = JSONObject.parseObject(resultString);
         // 拿到手機(jī)號碼
          String phone = object.getString("phoneNumber");
          // 返回手機(jī)號碼
          JSONObject returnObject = new JSONObject();
          returnObject.put("phone", phone);
          return returnObject;
      } catch (Exception e) {
          log.error("微信小程序手機(jī)號碼解密異常,信息如下:", e);
      }
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容