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

26次阅读
没有评论

共计 2291 个字符,预计需要花费 6 分钟才能阅读完成。

前言

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

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

前提

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

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

正文

获取授权信息

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

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

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

服务端解密

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

在微信  《开放数据校验与解密 · 小程序》  中提供了  多种编程语言的示例代码,但是就是没有 Java 的,不知道是不是微信团队从来不写 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;    } }

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

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

后记

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

正文完
 0
litao2024
版权声明:本站原创文章,由 litao2024 于2024-06-06发表,共计2291字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码