手记

小程序授权获取微信用户手机号码

搞事情

  1. 小程序wxml文件中增加授权标签

  # 授权按钮,绑定用户点击后的方法 getPhoneNumber()  <button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">{{quickLoginTitle}}</button>
  1. 在小程序js文件中增加getPhoneNumber方法

 getPhoneNumber: function (e) {  // 参数e是绑定的授权方法自动传入过来的, 主要是为了拿到vi和encryptedData值从后台换取用户联系方式
  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()方法中调用小程序login方法获取code值赋予this.data.wxCode
  var code = this.data.wxCode;  var _this = this;  //调用后台接口获取用户手机号码
  api.sendPost({    url: api.decode_phone,    params:{      encrypted: encryptedData,      iv:iv,      code:code
    },    success:function(data){     // 获取到的手机号码
      var phone = data.phone;
    },    fail:function(msg){
   })
}
  1. 在后台增加接口

  @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 内部实现逻辑

  // 定义微信解密获取手机号码的接口地址,固定的
  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 {          // 向微信服务器发送get请求获取加密了的内容
          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);         // 拿到手机号码
          String phone = object.getString("phoneNumber");          // 返回手机号码
          JSONObject returnObject = new JSONObject();
          returnObject.put("phone", phone);          return returnObject;
      } catch (Exception e) {
          log.error("微信小程序手机号码解密异常,信息如下:", e);
      }
  }



作者:Monster_鼎辉
链接:https://www.jianshu.com/p/2853b21fb42e


0人推荐
随时随地看视频
慕课网APP

热门评论

前端传过来的参数对了的  有时候解析手机号码错误  是什么原因呢

查看全部评论