java解码小程序的获取的电话号码--绝对满足你

本文详细介绍了在Java中如何使用微信小程序API获取并解密用户手机号。主要涉及Base64编码问题,包括选择正确的Base64库、解码方法、处理空格以及确保解密时密钥长度正确。作者通过多次尝试和分析,最终成功解决了解密过程中的各种问题,提供了一个完整的示例代码。
摘要由CSDN通过智能技术生成

本最近在尝试小程序相关的功能,比如用微信信息登陆小程序,小程序支付(这个尝试不了要有营业执照)等,当本人人尝试获取用户手机号作为用户相关信息时,发现官网压根就没有例子。。。。但如php,python,甚至是go都有。。哈哈哈,网上很多例子但是大部分都有问题,他们的问题出在哪。

  1. 第一个依赖包,依赖包的选择很重要,本人尝试很多base64包。 本人用的java自身的工具包就是java.until.base64,很多人都认为这个包都用不了。当然如org.apache.tomcat.util.codec.binary.Base64也可以,
  2. 第二个 问题是在这个包,本人根据网上的例子结合官方文档api以及自己差不多十几次的尝试,找问题,终于发现原因,就是他们方法用错了应该用的是Base64.getEncoder().encode(),解出来字节数组长度为32,这个很多老铁郁闷吧,其实微信官方文档是有相关提示的如下,用的方法应该是Base64.getDecoder().decode(xxxx)
    在这里插入图片描述
  3. 第三个 就是关于空格问题,session_key, encryptedData, iv,有存在空格的问题,要把空格变成+
  4. 第四个 还是长度问题---- byte[] keyByte=Base64.getDecoder().decode(session_key1),这里的keyByte长度必须补到16,不足的补0
    例子如下
public Object getPhoneNumber(String session_key, String encryptedData, String iv) {
        String session_key1=session_key.replace(" ","+");
        String encryptedData1=encryptedData.replace(" ","+");
        String iv1=iv.replace(" ","+");
        byte[] encrypData =Base64.getDecoder().decode(encryptedData1);

        byte[] ivData =Base64.getDecoder().decode(iv1);

        byte[] keyByte=Base64.getDecoder().decode(session_key1);

        AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivData);
        String resultString = null;
        try {
            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;
            }
            System.out.println(keyByte.length);
            Security.addProvider(new BouncyCastleProvider());
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            SecretKeySpec keySpec = new SecretKeySpec(keyByte, "AES");

            // 设置为解密模式
            cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
            resultString = new String(cipher.doFinal(encrypData), "UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }
        JSONObject object = JSONObject.parseObject(resultString);
        return object.getString("purePhoneNumber");
    }


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值