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

前言

小程序内可以直接通过授权获取用户微信号绑定的手机号码或用户添加的其他手机号码,这样可以使得小程序在进行账户的身份可控上又提高了一步,那么应该如何来获取手机号码呢?这篇文章就和大家一起来研究一下。
微信小程序+Java获取用户授权手机号码

前提

值得注意的是,如果您要获取手机号码首先要满足如下要求:

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

正文

获取授权信息

首先,我们需要使用button组件,其open-type的值要设置为getPhoneNumber,可参考button · 小程序,然后绑定bindgetphonenumber的回调函数,在用户点击按钮,弹起的授权框允许授权之后回调函数内会返回一个event的对象,在其对象的detail下分别存在两个值(可参考《获取手机号 · 小程序》):

参数类型说明
encryptedDataString包括敏感数据在内的完整用户信息的加密数据
ivString加密算法的初始向量

接下来我们要模拟一次登录,调用wx.login,然后再授权成功的回调中获取授权code值,接着将上述的encryptedDataiv一并传送至服务端,接下来就开始进行服务端解密过程。

服务端解密

服务端接收到encryptedDataivcode值之后,进行微信授权登录一次,接口可参考:《code2Session · 小程序》,然后我们需要获取返回值中的session_key字段,即为会话秘钥。

在微信《开放数据校验与解密 · 小程序》中提供了多种编程语言的示例代码,但是就是没有Java的,不知道是不是微信团队从来不写Java :evil: ,于是我们就自己实现了一个WXBizDataCrypt,具体实现如下:

上述代码中并没有实现签名效验的相关业务,可自行实现

首先我们需要创建WXBizDataCrypt的实体,传入小程序的appid与我们获取的session_key,然后再调用decryptData方法传入encryptedDataiv即可进行解密,如果返回的值为NULL或抛出异常则为解密失败,解密成功之后可以获取返回对象的countryCode以及purePhoneNumber组成完整的含区号的手机号码。

后记

在微信开放的相关开放接口中,对于用户的隐私数据这一块处理都是需要效验解密的,当然这一点也是为了数据安全,不过不得不吐槽有时候官方的文档真的是写的让人摸不着头脑,比如微信支付中的timestamptimeStamp :arrow:

    A+
所属分类:Java  小程序

发表评论

请在下方填写评论信息

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen:

表情 粗体 斜体 图片 引用 链接 删除线 下划线 插代码 签到

目前评论:10   其中:访客  6   博主  4

  1. avatar 梵高先生 0  来自天朝的朋友 谷歌浏览器 Windows 10 北京市 Elink-space(北京)技术有限公司(马连道街广外红莲南路欧园北欧印象4-2215号)

    前台小程序给我 sessionKey encryptedData iv 为什么不能解析一直报null

  2. avatar 小小太阳 0  来自天朝的朋友 谷歌浏览器 Windows 7 北京市 联通

    把全部代码附在里面多好呀!

    • avatar 憧憬Licoy 博主  来自天朝的朋友 谷歌浏览器 Mac OS X 10_14_4 四川省成都市成华区 电信

      @小小太阳 哈哈哈 因为有部分是业务代码 所以不方便贴出来

  3. avatar 奶爸de笔记 1  来自天朝的朋友 谷歌浏览器 Windows 10 重庆市 电信

    这个号码数据小程序运营的人能看到吗?如果能看到那我得换一个手机号码绑定微信了。

  4. avatar 头条 1  来自天朝的朋友 谷歌浏览器 Windows 7 广西河池市 联通

    文章不错非常喜欢,支持

  5. avatar 今日新闻 1  来自天朝的朋友 谷歌浏览器 Windows 7 广西贺州市 联通

    文章不错非常喜欢

  6. avatar 文娱帝国 1  来自天朝的朋友 火狐浏览器 Windows 7 江西省九江市 电信

    写的很好,很喜欢