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

本文介绍了如何在小程序中通过授权获取微信用户的手机号。在wxml文件中添加授权按钮,绑定getPhoneNumber方法。当用户授权成功后,使用encryptedData和iv调用后台接口,后台通过微信API解密获取手机号并返回。
摘要由CSDN通过智能技术生成

搞事情小程序wxml文件中增加授权标签# 授权按钮,绑定用户点击后的方法 getPhoneNumber()  {{quickLoginTitle}}在小程序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){

})

}在后台增加接口@RequestMapping(value = "decode/wxapp/phone", method = RequestMethod.POST)

@Override

public Result decodeWxAppPhone(

@RequestParam(value = "encrypted") String encrypted,

@RequestParam(value = "iv") String iv,

@RequestParam(value = "code") String code) {      return Result.success(userService.decodeWxAppPhone(encrypted, iv, code));

}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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值