如果直接使用默认手机号是没有问题的,使用新的手机号会报错。有知道的同学帮忙解答一下,万分感谢!
这是解密的代码
public static String decryptData(String encryptedData, String sessionKey, String iv) throws Exception {
byte[] dataByte = Base64.getDecoder().decode(encryptedData);
byte[] keyByte = Base64.getDecoder().decode(sessionKey);
byte[] ivByte = Base64.getDecoder().decode(iv);
// 确保密钥长度为 16 字节
if (keyByte.length != 16) {
throw new IllegalArgumentException("Invalid sessionKey length");
}
SecretKeySpec secretKey = new SecretKeySpec(keyByte, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(ivByte));
byte[] resultByte = cipher.doFinal(dataByte);
if (resultByte != null && resultByte.length > 0) {
return new String(resultByte, "UTF-8");
}
return null;
}
这是入参,encryptedData和iv是前端返回的
encryptedData的值是COe6bhZmHpMvLT3LfYHJn3HF0m3AxuW341xLwdYFGjN/U3lmoIxgyJ1fp3MgYY3ky3t8ky6dbsYu+rWvxU2Ne/9EU3o7/7/SpxBgBXDjcw6kMnPjtpaZIvO1nNxvN7cyjB6gqtvpkdtwNBJ4W0OUTm6+Y1Rj098Ybwboa5rdc4L2HA/0iO6L8kTZUiGmTAimkTRhDnh9Uc9hwV6eL+nsHg==
iv的值是E0lUdSvkw7BZDCAglmJxPg==
sessionKey的值是4ADH3gCjFVBxkrRXe3Zk7Q==
下面是报错
javax.crypto.BadPaddingException: Given final block not properly padded at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:989) at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:845) at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446) at javax.crypto.Cipher.doFinal(Cipher.java:2165)
感谢回复!
现在是改成这个接口获取就好了 https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-info/phone-number/getPhoneNumber.html
一、不建议使用这个获取手机号码;
二、在回调中调用 wx.login 登录,可能会刷新登录态。此时服务器使用 code 换取的 sessionKey 不是加密时使用的 sessionKey,导致解密失败。建议开发者提前进行
login
;或者在回调中先使用checkSession
进行登录态检查,避免login
刷新登录态;三、只能获取用户微信绑定的手机号。