1、小程序开发者调用微信的方法,获取小程序code,微信用户加密信息encryptedData,偏移量iv
2、将code、encryptedData、iv这三个参数传给后端
3、java端通过code请求微信的接口获取到微信用户的认证信息
https://api.weixin.qq.com/sns/jscode2session?appid=小程序appId&secret=" + 小程序secret + "&js_code=" +小程序端传来的code + "&grant_type=authorization_code";
通过调用此接口,微信接口返回的信息如下:
{"session_key":"FdBRYW2SgLBRg==","openid":"oTrxW45rpcmBhQ","session_key":"CB26oXZa6mDTjQw=="}
4、调用getWechetEncryptedData方法,把encryptedData、iv、session_key传入,即可获取用户的微信信息。
public class AesUtil {
public static boolean initialized = false;
public static String getWechetEncryptedData(String encryptedData, String sessionKey, String iv) {
byte[] content = Base64.decodeBase64(encryptedData);
byte[] keyByte = Base64.decodeBase64(sessionKey);
byte[] ivByte = Base64.decodeBase64(iv);
String userInfo = null;
initialize();
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
Key sKeySpec = new SecretKeySpec(keyByte, "AES");
cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(ivByte));// 初始化
byte[] result = cipher.doFinal(content);
if (null != result && result.length > 0) {
userInfo = new String(result, StandardCharsets.UTF_8);
}
} catch (Exception e) {
e.printStackTrace();
}
return userInfo;
}
public static void initialize(){
if (initialized) {
return;
}
Security.addProvider(new BouncyCastleProvider());
initialized = true;
}
// 生成iv
public static AlgorithmParameters generateIV(byte[] iv) throws Exception {
AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
params.init(new IvParameterSpec(iv));
return params;
}
}