uniapp或微信小程序前后端点击按钮获取用户手机号的方法

执行过程:前端获取code,通过接口将所需值传给后端,后端处理后将手机号在成功回调返回。 后台处理要一气呵成,不要打断点,断点会获取失败,有时正常也会失败,失败就从新走一遍,以下代码完全...
  1. 执行过程:前端获取code,通过接口将所需值传给后端,后端处理后将手机号在成功回调返回。 后台处理要一气呵成,不要打断点,断点会获取失败,有时正常也会失败,失败就从新走一遍,以下代码完全没问题。
  1. 小程序wxml文件中增加授权标签 
  2.   # 授权按钮,绑定用户点击后的方法 getPhoneNumber()
  1.  原生写法:
  1. <button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">点击获取手机号</button>
  1. uniapp写法:
  1. <button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">{{>点击获取手机号}}</button>
  1. 在小程序js文件中增加getPhoneNumber方法
  1.  getPhoneNumber: function (e) {
  1.   // 参数e是绑定的授权方法自动传入过来的, 主要是为了拿到vi和encryptedData值从后台换取用户联系方式
  1.   if ("getPhoneNumber:ok" != e.detail.errMsg){
  1.     wx.showToast({
  1.       icon:'none',
  1.       title: '快捷登陆失败'
  1.     })
  1.     return;
  1.   }
  1.   var iv = e.detail.iv;
  1.   var encryptedData = e.detail.encryptedData;
  1.  // this.data.wxCode, 定义wxCode变量,并在onShow()方法中调用小程序login方法获取code值赋予this.data.wxCode
  1.   var code = this.data.wxCode;
  1.   var _this = this;
  1.   //调用后台接口获取用户手机号码
  1.   api.sendPost({
  1.     url: api.decode_phone,
  1.     params:{
  1.       encrypted: encryptedData,
  1.       iv:iv,
  1.       code:code
  1.     },
  1.     success:function(data){
  1.      // 获取到的手机号码
  1.       var phone = data.phone;
  1.     },
  1.     fail:function(msg){
  1.    })
  1. }
  1. 在后台增加接口
  1.   @RequestMapping(value = "decode/wxapp/phone", method = RequestMethod.POST)
  1.   @Override
  1.   public Result<JSONObject> decodeWxAppPhone(
  1.           @RequestParam(value = "encrypted") String encrypted,
  1.           @RequestParam(value = "iv") String iv,
  1.           @RequestParam(value = "code") String code) {
  1.       return Result.success(userService.decodeWxAppPhone(encrypted, iv, code));
  1.   }
  1. userService.decodeWxAppPhone 内部实现逻辑
  1.   // 定义微信解密获取手机号码的接口地址,固定的
  1.   String wxAppHost = "https://api.weixin.qq.com";
  1.   String wxAppPath =  "/sns/jscode2session"
  1.   String wxAppId = "自己的appid"
  1.   String wxAppSecret = "自己的wxAppSecret"
  1.   
  1.   public JSONObject decodeWxAppPhone(String encrypted, String iv, String code) {
  1.       String path =
  1.               wxAppPath
  1.                       + "?appid="
  1.                       + wxAppId
  1.                       + "&secret="
  1.                       + wxAppSecret
  1.                       + "&js_code="
  1.                       + code
  1.                       + "&grant_type=authorization_code";
  1.       try {
  1.           // 向微信服务器发送get请求获取加密了的内容
  1.           HttpResponse response = HttpUtils.doGet(wxAppHost, path, "GET", null, null);
  1.           String jsonStr = EntityUtils.toString(response.getEntity());     
  1.           JSONObject jsonObject = JSON.parseObject(jsonStr);
  1.           String sessionkey = jsonObject.getString("session_key");

  1.           // 解密
  1.           byte[] encrypData = Base64Utils.decodeFromString(encrypted);
  1.           byte[] ivData = Base64Utils.decodeFromString(iv);
  1.           byte[] sessionKey = Base64Utils.decodeFromString(sessionkey);
  1.           AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivData);
  1.           Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
  1.           SecretKeySpec keySpec = new SecretKeySpec(sessionKey, "AES");
  1.           cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
  1.           
  1.           String resultString = new String(cipher.doFinal(encrypData), "UTF-8");
  1.           JSONObject object = JSONObject.parseObject(resultString);
  1.          // 拿到手机号码
  1.           String phone = object.getString("phoneNumber");
  1.           // 返回手机号码
  1.           JSONObject returnObject = new JSONObject();
  1.           returnObject.put("phone", phone);
  1.           return returnObject;
  1.       } catch (Exception e) {
  1.           log.error("微信小程序手机号码解密异常,信息如下:", e);
  1.       }
  1.   }

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
admin
admin

651 篇文章

作家榜 »

  1. admin 651 文章
  2. 粪斗 185 文章
  3. 王凯 92 文章
  4. 廖雪 78 文章
  5. 牟雪峰 12 文章
  6. 李沁雪 9 文章
  7. 全易 2 文章
  8. bngvitmrbj 0 文章