Heim  >  Artikel  >  WeChat-Applet  >  Das WeChat-Applet Java implementiert die AES-Entschlüsselung und erhält die UnionId

Das WeChat-Applet Java implementiert die AES-Entschlüsselung und erhält die UnionId

高洛峰
高洛峰Original
2017-02-20 15:26:411919Durchsuche

Wenn Sie das Miniprogramm verwenden und auch das offizielle Konto verwenden, können Sie die UnionId-Funktion verwenden. Aufgrund der Geschäftsanforderungen des Unternehmens müssen wir UnionId verwenden. Informationen zu spezifischen Verwendungsmethoden finden Sie in den Anweisungen von WeChat Plattform, aber in der WeChat-Applet-Dokumentation wird nur der Quellcode für einige Sprachimplementierungen bereitgestellt, und es gibt kein Java. Wie faul sind die Entwickler des Applets? Benutzt nicht jeder Java, um das Backend zu schreiben? ? ?


Was zum Teufel, und dann begannen verschiedene AES-Fallstricke. Tatsächlich habe ich auf viele Online-Tutorials verwiesen, und ich kann sie wiederum nicht alle für alle auflisten. (Denn als ich diesen Artikel schrieb, war es bereits eine Woche her, dass das Problem gelöst wurde.) Ich werde auch noch einmal einen Beitrag schreiben, um es allen zurückzugeben. Hier liste ich nur die Entschlüsselung auf Methoden von UnionId Wenn Sie Fragen haben, wenden Sie sich bitte an Ich kann antworten oder antworten.


Noch ein Kommentar,

https Verwenden Sie nicht das kostenlose Zertifikat von startcom!

https Verwenden Sie nicht das kostenlose Zertifikat von startcom !

https Verwenden Sie nicht das kostenlose Zertifikat von startcom


Sagen Sie wichtige Dinge dreimal! ! ! !


AES.java

import org.apache.commons.codec.binary.Base64;import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.NoSuchPaddingException;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import java.security.*;public class AES {    public static boolean initialized = false;    /**
     * AES解密
     * @param content 密文
     * @return
     * @throws InvalidAlgorithmParameterException
     * @throws NoSuchProviderException
     */
    public byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte) throws InvalidAlgorithmParameterException {
        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);            return result;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (NoSuchProviderException e) {            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {            // TODO Auto-generated catch block
            e.printStackTrace();
        }        return null;
    }    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;
    }
}

WxPKCS7Encoder.java

import java.nio.charset.Charset;import java.util.Arrays;/**
* Created by Kevin Dong on 2017/1/5.
*/public class WxPKCS7Encoder {    private static final Charset CHARSET = Charset.forName("utf-8");    private static final int BLOCK_SIZE = 32;    /**
     * 获得对明文进行补位填充的字节.
     *
     * @param count 需要进行填充补位操作的明文字节个数
     * @return 补齐用的字节数组
     */
    public static byte[] encode(int count) {        // 计算需要填充的位数
        int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE);        if (amountToPad == 0) {
            amountToPad = BLOCK_SIZE;
        }        // 获得补位所用的字符
        char padChr = chr(amountToPad);
        String tmp = new String();        for (int index = 0; index < amountToPad; index++) {
            tmp += padChr;
        }        return tmp.getBytes(CHARSET);
    }    /**
     * 删除解密后明文的补位字符
     *
     * @param decrypted 解密后的明文
     * @return 删除补位字符后的明文
     */
    public static byte[] decode(byte[] decrypted) {        int pad = decrypted[decrypted.length - 1];        if (pad < 1 || pad > 32) {
            pad = 0;
        }        return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad);
    }    /**
     * 将数字转化成ASCII码对应的字符,用于对明文进行补码
     *
     * @param a 需要转化的数字
     * @return 转化得到的字符
     */
    public static char chr(int a) {        byte target = (byte) (a & 0xFF);        return (char) target;
    }
}

Rufen Sie die Methode zum Entschlüsseln wie folgt auf:

WechatOpenIdRes wechatInfo  = getWehatInfoByCode(code);        if(wechatInfo != null && wechatInfo.isOk()){            boolean isNew = true;            try {
                AES aes = new AES();                byte[] resultByte = aes.decrypt(Base64.decodeBase64(encryptedData), Base64.decodeBase64(wechatInfo.getSession_key()), Base64.decodeBase64(iv));                if(null != resultByte && resultByte.length > 0){
                    String userInfo = new String(WxPKCS7Encoder.decode(resultByte));
                    WxInfo wxInfo = GsonUtil.fromGson(userInfo, WxInfo.class);                    if(wxInfo != null) {
                        logger.debug("xxxxxunionid===="+wxInfo.getUnionId());
                    }
                }
            } catch (InvalidAlgorithmParameterException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }

Die Kompilierungsumgebung ist Java1.8

Außerdem ist das von mir eingeführte Supportpaket

bcprov-jdk16-139.jar. Dieses Paket wurde als Anhang hochgeladen.

Übrigens angehängt Der Code im Miniprogramm js, den ich ausprobiert habe,

var code ="";
wechat.login()
      .then(function(res){
        code = res.code;        
      })
      .then(function(){        return wechat.getUserInfo();
      })
      .then(function(res){var encryptedData = res.encryptedDatavar iv = res.iv;return userservice.getUserToken(code,encryptedData,iv);
      })

Der obige Code verwendet Versprechen, und der letzte Satz userservice.getUserToken ist die Methode zum Anfordern des Servers. und die Parameter sind der erhaltene Code + verschlüsselter Inhalt + Initialisierungsvektor

Weitere Artikel zum WeChat-Applet Java, das die AES-Entschlüsselung implementiert und die UnionId erhält, finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn