If we need to resolve the unionId, wechat itself does not provide Java SDK, so we need to write our own decryption method, and because of the SECURITY mechanism of JDK, we also need some operations to avoid these pits.Copy the code
Pre set
Add the java.security file to the /opt/ JDK /jdk1.8.0_151/jre/lib/security directory Security. The provider. 10 = org. Bouncycastle.. Jce provider. BouncyCastleProvider/opt/JDK/jdk1.8.0 _151 / jre/lib/ext directory Add bcprov jdk15on - 1.57. The jarCopy the code
WechatUtil
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.Arrays;
import org.bouncycastle.util.encoders.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.security.Security;
public class WechatUtil {
public static void main(String[] args) {
/ / test
String result = decryptData(
"+6fr9M+bNeRk8LQOOuxqBLuzsydnIh7D2UvImuWicfzJsbrRFptPr7yXHubgTdRd6JHwvjDXD+Q9L0oeTjXlBZilfipjRZJSV7nOpaq++DB5wQr6hKAPsvL mUjOpTPocpVrRDbkXRQKAgl6uTXkR8SdUL3j0zihANr3ANaz2kgg8X+iCJKSxmCuxwPswFCrYaXih2Z7+s/EqWU0ACFgaoZMNkliYBy9mF/pwzCfzsDVx+eJ u1eG2UmU6e0e8rUOcEGv4KxfYntvLBN7LJEfOEfYcyemNYtVt3ALDE2sOxI4pb8XxUUO3zn+Yt7e5xWqmfqFj1YK3CCl0ILHle5JlZxGz178PsztDoCnOMoA 4NwEoGfqCsUH1pM7AsyfcOh27yqqk="."2gCRTCyEpjQTW5Fc89yg=="."XBzf8VMLBIsFBZvjOWNg=="
);
System.out.println("result = " + result);
}
public static String decryptData(String encryptDataB64, String sessionKeyB64, String ivB64) {
return new String(
decryptOfDiyIV(
Base64.decode(encryptDataB64),
Base64.decode(sessionKeyB64),
Base64.decode(ivB64)
)
);
}
private static final String KEY_ALGORITHM = "AES";
private static final String ALGORITHM_STR = "AES/CBC/PKCS7Padding";
private static Key key;
private static Cipher cipher;
private static void init(byte[] keyBytes) {
// If the key is less than 16 bits, make up the key. What's in this if is important
int base = 16;
if(keyBytes.length % base ! =0) {
intgroups = keyBytes.length / base + (keyBytes.length % base ! =0 ? 1 : 0);
byte[] temp = new byte[groups * base];
Arrays.fill(temp, (byte) 0);
System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);
keyBytes = temp;
}
/ / initialization
Security.addProvider(new BouncyCastleProvider());
// Convert to JAVA key format
key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
try {
// Initialize the cipher text
cipher = Cipher.getInstance(ALGORITHM_STR, "BC");
} catch(Exception e) { e.printStackTrace(); }}/** * decryption method **@paramEncryptedData The string * to decrypt@paramKeyBytes Decryption key *@paramIvs Custom symmetric decryption algorithm initial vector IV *@returnDecrypted byte array */
private static byte[] decryptOfDiyIV(byte[] encryptedData, byte[] keyBytes, byte[] ivs) {
byte[] encryptedText = null;
init(keyBytes);
try {
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(ivs));
encryptedText = cipher.doFinal(encryptedData);
} catch (Exception e) {
e.printStackTrace();
}
returnencryptedText; }}Copy the code