-
先通过wx.login 获取code(登录凭证)
然后后台调用https://api.weixin.qq.com/sns/jscode2sessionjs_code=code接口,huoq获取session_key -
bindGetUserInfo方法体内可以获得encryptedData和iv 即 加密数据和加密算法初始向量
-
將上面code ,encryptedData和iv 传入后台 后台通过code获取session_key 然后根据encryptedData和iv , session_key解密
主要的是后台的解密代码如下
public static JSONObject getUserInfo(String encryptedData, String sessionKey, String iv) {
// 被加密的数据
byte[] dataByte = Base64.decode(encryptedData);
// 加密秘钥
byte[] keyByte = Base64.decode(sessionKey);
// 偏移量
byte[] ivByte = Base64.decode(iv);
// 如果密钥不足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;
}
//导入支持AES/CBC/PKCS7Padding的Provider
Security.addProvider(new BouncyCastleProvider());
SecretKeySpec secretKeySpec= new SecretKeySpec(keyByte, "AES");
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, new IvParameterSpec(ivByte));// 初始化
byte[] resultByte = cipher.doFinal(dataByte);
if (null != resultByte && resultByte.length > 0) {
String result = new String(resultByte, "UTF-8");
System.out.println(result);
return JSONObject.parseObject(result);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
运行代码之前需要
① 导入jar 包 [bcprov-jdk16-1.46.jar][3]
② 在java下找到 jre/lib/security/java.security,添加一行代码:
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider//这里的11,次文件中用到了几就在几的基础上加一
③ 将bcprov-jdk16-1.46.jar 包copy到jre/lib/ext目录下
如果encryptedData 解密的数据中不包含unionid参数 很可能是因为小程序没有绑定微信开放平台