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