前言

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

/>

前提

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

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

正文

获取授权信息

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

参数

类型

说明

encryptedData

String

包括敏感数据在内的完整用户信息的加密数据

iv

String

加密算法的初始向量

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

服务端解密

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

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

public class WXBizDataCrypt {

private String appid;

private String sessionKey;

public WXBizDataCrypt(String appid, String sessionKey)

{

this.appid = appid;

this.sessionKey = sessionKey;

}

public JSONObject decryptData(String encryptedData, String iv) throws Exception{

byte[] dataByte = Base64.decodeBase64(encryptedData);

// 加密秘钥

byte[] keyByte = Base64.decodeBase64(this.sessionKey);

// 偏移量

byte[] ivByte = Base64.decodeBase64(iv);

try {

// 如果密钥不足16位,那么就补足. 这个if 中的内容很重要

int base = 16;

if (keyByte.length % base != 0) {

int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);

byte[] temp = new byte[groups * base];

Arrays.fill(temp, (byte) 0);

System.arraycopy(keyByte, 0, temp, 0, keyByte.length);

keyByte = temp;

}

// 初始化

// 初始化

Security.addProvider(new BouncyCastleProvider());

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");

AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");

parameters.init(new IvParameterSpec(ivByte));

cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化

byte[] resultByte = cipher.doFinal(dataByte);

if (null != resultByte && resultByte.length > 0) {

String result = new String(resultByte, "UTF-8");

return JSONObject.parseObject(result);

}

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

}

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

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

后记

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

java如何获取手机号码_微信小程序+Java获取用户授权手机号码相关推荐

  1. 微信小程序 访问ip服务器,微信小程序如何获取code?微信小程序如何获取用户ip?...

    微信小程序如何获取code?微信小程序如何获取用户ip?最近小编收到很多问题,其中一个就是下面小编为大家整理一下关于微信小程序如何获取code的步骤,希望这些方法能够帮助到大家. 首先,调用 wx.l ...

  2. php网页抓取浏览者手机号码_微信小程序开发之获取用户手机号码(php接口解密)...

    后边要做一个微信小程序,并要能获取用户微信绑定的手机号码.而小程序开发文档上边提供的获取手机号码的接口(getPhoneNumber())返回的是密文,需要服务器端进行解密,但是官方提供的开发文档一如 ...

  3. 微信小程序 java 传值_微信小程序传值获取值的实例方法

    微信小程序传值以及获取值方法的详解 微信小程序传值以及获取值方法,传值有两种方法,对应也有获取值得方法, 1.设置id的方法标识跳转后传递的参数值: 2.通过使用data - xxxx 的方法来标识要 ...

  4. 小程序向java后台发送图片_微信小程序在后台如何将二进制流转换成图片

    我在前端请求了小程序码返回的是一堆乱码, java不太熟网上找了一个方法可以将二进制流和图片互转,但是从微信小程序码接口获取的数据用这个方法无法获取正确的图片,不知道哪里有问题: 有没有只在前端就能获 ...

  5. java开发微信如何维护登录状态_微信小程序中做用户登录与登录态维护的实现详解...

    总结 大家都知道,在开发中提供用户登录以及维护用户的登录状态,是一个拥有用户系统的软件应用普遍需要做的事情.像微信这样的一个社交平台,如果做一个小程序应用,我们可能很少会去做一个完全脱离和舍弃连接用户 ...

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

    最近在做一款微信小程序,需要获取用户手机号,具体步骤如下: 流程图: 1.首先,客户端调用wx.login,回调数据了包含jscode,用于获取openid(用户唯一标识)和sessionkey(会话 ...

  7. 微信小程序跳过第三方的_微信小程序怎么解除第三方授权?

    平时我们用使用一个新的小程序时,通常都会弹出一些第三方授权的窗口,要授权成功才能正常使用小程序.而其中或多或少会涉及一些个人隐私信息,如果我们不需要再使用这些小程序,想要取消授权应该怎么做呢? 一.在 ...

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

    简单说:(直接撸步骤...) 1.用户需要调用wx.login()方法,来拿到用户登录凭证code.wx.login({ success:function(res){ console.log('log ...

  9. vue获取麦克风_微信小程序实现录音时的麦克风动画效果实例

    前言 这个简单的麦克风demo的创意是来源于"包你说"中的录音效果,实现的方式其实也并不难,但对于小程序中的简易动画的使用的确很实用. 效果 先来看个demo,gif帧数比较低,实 ...

最新文章

  1. 桌面虚拟化之iPad客户端大比拼
  2. 项目学生:带有Jersey的Web服务客户端
  3. css中分区显示php,CSS中7个你必须知道属性
  4. 大学生计算机基础第一章试题,2017年大学生计算机基础试题及答案
  5. 机器学习和深度学习资源汇总(陆续更新)
  6. 如何打造数字原生企业?易捷行云EasyStack有话要说
  7. Java中变量与常量
  8. 如何将扫描PDF文件转换成word,两个超简单的方法一看就会
  9. 概率论的基本概念、样本空间、随机事件(二)
  10. 刘强东割袍弃兄弟,马爸爸醉心 996
  11. 中山大学数据科学与计算机学院复试分数线,2019中山大学数据科学与计算机学院考研复试分数线...
  12. 积分竟然比微分早了1300年!一文讲清积分的历史
  13. 主键,唯一索引 聚集索引的关系
  14. 你真的知道什么是项目吗?项目的基本概念
  15. 最能拉出同行差距的细节,99%的零售店老板都错过了
  16. UnityStandardAsset工程、源码分析_7_第三人称场景[玩家控制]_人物逻辑
  17. 太懒了,所以用小爱开楼下的门禁
  18. 我该怎么救救我弟弟???
  19. Tina R16开发说明
  20. linux下循环显示图片,Linux快速显示图片

热门文章

  1. 木块问题(Uva101)
  2. psnbsp;盖印图层
  3. 北京大学 计算机 排名2015年,北京大学计算机专业怎么样(最新北京大学计算机专业排名)...
  4. mysql的increment详情
  5. blink不能发,这里记录下
  6. webpack 在js中引入静态图片
  7. 易宝支付声明称遭遇大规模黑客攻击
  8. Vue基础入门(下)
  9. 计算机硬盘被配置成动态磁盘,Win7系统分区提示会把选定的基本磁盘转化为动态磁盘怎么办...
  10. Spring Data Commons主要梳理