获取用户手机号码包含了”获取用户的昵称、头像授权”、”获取用户的手机号授权”和”解密手机号”3个部分。在小程序获取了的手机号码是加密的密文,还需要经过解密才能获取明文手机号,解密的操作放在了服务器上。

1、获取用户的昵称、头像授权。
(1)小程序前端页面代码。

Open-type:微信开发能力,值为getUserInfo时获取用户信息,可以从bindgetuserinfo回调中获取到用户信息。

(2)弹出获取昵称、头像授权窗口。
用户点击登录,弹出微信授权窗口:

点击允许,调用onGetUserInfo方法,获取用户信息:

// 通过按钮让微信用户授权以获取其信息onGetUserInfo: function (e) {var that = this;wx.getUserInfo({success(res) {console.log(res);if (res.errMsg == 'getUserInfo:ok') {//将信息放入缓存util.writeStorage(storage.WX_USER_Info, res.userInfo);that.setData({encrypted_UnionID: res.encryptedData,iv_UnionID: res.iv});// that.obtainAuthorizationInformation();that.setData({ showModal: true });  //显示授权手机号弹窗} else {wx.showToast({title: '授权用户信息失败,请重试',icon: 'none'})}// that.setData({//   encrypted_UnionID: res.encryptedData,//   iv_UnionID: res.iv// });},fail(res) {wx.showToast({title: '获取用户基本信息失败',icon: 'none'})console.log('获取用户基本信息失败!');util.writeStorage(storage.AUTHORISED, 0);}});}

2、获取用户手机号授权。
(1)获取用户信息之后,显示准备获取授权手机号弹窗 。

if (res.errMsg == 'getUserInfo:ok') {//将信息放入缓存util.writeStorage(storage.WX_USER_Info, res.userInfo);that.setData({encrypted_UnionID: res.encryptedData,iv_UnionID: res.iv});// that.obtainAuthorizationInformation();that.setData({ showModal: true });  //显示授权手机号弹窗}

(2)获取手机号的前端页面代码。

<view class="toGetPhoneNumberShade" wx:if="{{ showModal }}" catchtap="closeModal"></view><view class="toGetPhoneNumber" wx:if="{{ showModal }}"><view><image src="../../images/points.png"></image><text wx:if="{{ showShopName }}">商家名称</text><button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">微信用户快捷登录</button></view></view>

getPhoneNumber:
获取用户手机号,可以从bindgetphonenumber回调中获取到用户信息,具体说明 (小程序插件中不能使用)。
bindgetphonenumber: 获取用户手机号回调,open-type=getPhoneNumber时有效。
点击”微信用户快捷登录”,弹出获取手机号授权窗口:

(3)获取手机号的js代码
点击允许,调用getPhoneNumber函数:

// 绑定手机号getPhoneNumber: function (e) {console.log("xxxxxxxxxxxxxxxx");var that = this;that.setData({ showModal: false });  //隐藏获取手机号弹窗;wx.checkSession({success: function (res) { // session_key没有过期console.log(res);var loginParams = {'decryptSessionCode': that.data.decryptSessionCode, // 解密需要的参数'encryptedUnionID': that.data.encrypted_UnionID, // 加密的unionID'ivUnionID': that.data.iv_UnionID, // 解密需要的参数'encryptedPhone': e.detail.encryptedData, // 加密的手机号'ivPhone': e.detail.iv, // 解密需要的参数'mobile': "",'companySN': that.data.companySN};that.login(loginParams);},fail: function (res) { // session_key已过期,重新获取console.log(res);wx.login({success(res) {that.setData({ decryptSessionCode: res.code });},fail(res) { // 这里需要处理调用接口失败的情况console.log('调用wx.login失败');}});wx.showToast({title: '授权手机号失败,请重试',icon: 'none'})}});},

设置请求登录变量loginParams,然后调用login函数。
(此时获取的手机号还是加密的手机号encryptedPhone,解密的操作放在了服务器端,需要把decryptSessionCode、encryptedPhone、ivPhone几个参数传到服务器端。)
3、解密用户的手机号。
解密手机号的操作在服务器端进行。
(1)请求服务器解密手机号码的js代码。

// 第一次登录,非自动登录login: function (loginParams) {// let header = wx.getStorageSync('storageHeader'); // TODO 需要处理nbr会话失效的情况let that = this;wx.showLoading({title: '登录中,请稍等',mask: true})wx.request({url: api.login,method: api.POST,header: app.globalData.header,data: loginParams,success(res) {console.log(res);console.log(res.data.objectList2);util.writeStorage(storage.Company_Address, res.data.objectList2);that.onRequestSuccess(res)},fail(res) { // 这里需要处理调用接口失败的情况console.log(res);wx.hideLoading();wx.showToast({title: '登录失败,请重试',icon: 'none'})return null;}});},

(2)后端服务器解密手机号。
(2.1)向微信服务器获取sessionKey。
根据SessionAndOpenid_URL、appid、secret、decryptSessionCode向微信服务器发送请求,获取sessionKey(需要sessionKey才能解密手机号):

// 向微信请求sessionKeyString sessionAndOpenidURL = String.format(SessionAndOpenid_URL, MP_APPID, MP_SECRET, vip.getDecryptSessionCode());JSONObject jsonObject = WxUtils.getDataFromWxServer(sessionAndOpenidURL);if (jsonObject == null) {logger.error("获取openid和session_key失败!!!");params.put(JSON_ERROR_KEY, EnumErrorCode.EC_OtherError.toString());params.put(KEY_HTMLTable_Parameter_msg, "获取微信session_key失败!");return false;}String sessionKey = jsonObject.getString("session_key"); // ...if (StringUtils.isEmpty(sessionKey)) {logger.error("获取session_key失败!");params.put(KEY_HTMLTable_Parameter_msg, "获取session_key失败!");params.put(JSON_ERROR_KEY, EnumErrorCode.EC_OtherError.toString());return false;} else {logger.debug("获取的sessionKey:" + sessionKey);}

getDataFromWxServer方法代码:

/** 通用函数。 向微信服务器发送Get请求,返回JSON数据。 */public static JSONObject getDataFromWxServer(String url) {HttpClient httpClient = HttpClientBuilder.create().build();try {HttpGet httpGet = new HttpGet(url);HttpResponse response = httpClient.execute(httpGet);// 接收client执行的结果HttpEntity entity = response.getEntity();if (entity != null) {String result = EntityUtils.toString(entity, "UTF-8");return JSONObject.fromObject(result);} else {logger.error("向微信服务器发送Get请求发生错误!");return null;}} catch (Exception e) {logger.error("向微信服务器发送Get请求发生错误:" + e.getMessage());return null;}}

(2.2)解密手机号。
根据sessionKey还有小程序传过来的密文手机号encryptedPhone、ivPhone进行解密:

String mobile = decryptData(vip.getEncryptedPhone(), vip.getIvPhone(), sessionKey).getString("phoneNumber");if (StringUtils.isEmpty(mobile) || mobile.length() != FieldFormat.LENGTH_Mobile) {logger.error("解密手机号失败!");params.put(KEY_HTMLTable_Parameter_msg, "网络异常,请稍后再试!");params.put(JSON_ERROR_KEY, EnumErrorCode.EC_OtherError.toString());return false;}

这样就可以得到明文的手机号码 mobile 了。

decryptData方法代码:

private JSONObject decryptData(String encryptedData, String ivData, String session_key) {byte[] encrypted = Base64.decodeBase64(encryptedData);byte[] iv = Base64.decodeBase64(ivData);byte[] key = Base64.decodeBase64(session_key);AESUtil aesUtil = new AESUtil(key, iv);return JSONObject.fromObject(aesUtil.decrypt(encrypted));}

Java实现在小程序获取用户手机号码的功能相关推荐

  1. 微信小程序获取用户手机号码,Java后台servlet解密(微信小程序调用微信支付也是大致的流程)

    本篇记录说明 微信小程序获取用户手机号码,Java后台servlet解密(微信小程序调用微信支付也是大致的流程,详细内容可私信交流) (第一次写博客,写得不好的地方见谅,面向新手,大佬请无视,不喜勿喷 ...

  2. Uniapp实现小程序获取用户微信信息功能

    Uniapp实现小程序获取用户微信信息功能 实现后发现其实这个功能实现起来非常简单,但是,在实现这个功能的过程中真的好多坑啊,可能是我菜吧. 1.获取uniapp的appid和微信小程序的appid, ...

  3. Java微信授权小程序获取用户手机号信息

    注意:目前该接口针对非个人开发者,且完成了认证的小程序开放(不包含海外主体).需谨慎使用,若用户举报较多或被发现在不必要场景下使用,微信有权永久回收该小程序的该接口权限. 官网地址如下: https: ...

  4. uniapp实现小程序获取用户头像等功能

    使用uni.getUserProfile 获取用户信息.每次请求都会弹出授权窗口,用户同意后返回 userInfo,userInfo为用户的信息 // 获取用户信息uni.getUserProfile ...

  5. 微信小程序-获取用户手机号码

    1.在获取手机号码之前,要先进行登陆. 使用wx.login进行登录,登录成功会返回一个code,将code传给后台,获取登录密钥session_key等信息.将这些信息存入data. 2.使用typ ...

  6. 钉钉小程序获取用户信息

    钉钉小程序获取用户信息 1.钉钉小程序只允许开发办公类的程序,不能开发娱乐型的程序. 2.钉钉小程序审核需要产品说明书,最大大小不能超过30M(文档). 3.貌似可以用IP,暂时没有看到有关https ...

  7. 微信小程序获取用户手机号--官方示例

    微信小程序获取用户手机号–官方示例 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNu ...

  8. 微信小程序python解析获取用户手机号_微信小程序获取用户手机号

    获取微信用户绑定的手机号,需先调用wx.login接口. 小程序获取code. 后台得到session_key,openid. 组件触发getPhoneNumber 因为需要用户主动触发才能发起获取手 ...

  9. Java版微信小程序获取手机号

    项目场景: 提示:通过小程序获取用户微信绑定手机号 这里附上微信官方文档说明:微信官方文档 获取用户手机号步骤说明: 1.小程序客户端先调用wx.login(),获取到js_code: 2.将js_c ...

最新文章

  1. 安卓 静态文件读取 staticFile
  2. C/C++面试题:什么是COM和ActiveX,简述DCOM。
  3. linux网络编程(一)网络基础传输知识
  4. java jsp 传递参数的方法,jsp传参方法小结
  5. 数据库:MySQL和MariaDB的JDBC连接
  6. python 案例串接_Python基础系例--字典串操作
  7. c 数组上限_高级I/O复用技术:Epoll的使用及一个完整的C实例含代码
  8. JavaScript—获取参数(23)
  9. 为什么用preparedStatement 而不是statement
  10. 浅谈大学综合能源服务
  11. ASF文件格式详解(1)
  12. padavan mysql_newifi3 用Padavan(老毛子)固件 搭建web 尝试
  13. Android之实现手写电子签名
  14. Redis 集群可用性测试
  15. 安装Rstudio Desktop和Rstudio Server免费版本
  16. 笑话--老外与山东妞(爆笑)
  17. SourceInsight | source insight使用技巧
  18. android中tabview去掉下划线,TabWidget去除底部下划线
  19. 淘宝店铺怎么靠前排名?有哪些技巧?
  20. linux批量修改文件名字

热门文章

  1. nuxt添加.html,Nuxt.js 路由
  2. 显微血管减压术看似简单却很考验医生,不应让患者受手术失败之苦
  3. MySQL查询一周前/三个月前/一年前,及昨天、今天、明天、前一个小时和后一个小时的时间
  4. PPTV聚力传媒之Mesos集群性能测试
  5. Android ANR 问题第二弹------Input超时实战问题解析上
  6. 软件衰减的最重要因素
  7. python表示后面部分是注释_Python 注释(Python Comments)用法详解
  8. 点击a标签在新页面播放视频
  9. 特征融合与灰色回归的滚动轴承性能退化评估
  10. cm13编译中的local manifest写法