Maison > Article > Applet WeChat > L'applet WeChat Java implémente le décryptage AES et obtient unionId
Si vous utilisez le mini programme et utilisez également le compte officiel, vous pouvez utiliser la fonction unionId. En raison des besoins commerciaux de l'entreprise, nous devons utiliser unionId. Pour les méthodes d'utilisation spécifiques, veuillez vous référer aux instructions de l'ouverture WeChat. plate-forme, mais dans La documentation de l'applet WeChat ne fournit que le code source de certaines implémentations de langage, et il n'y a pas de java. À quel point les développeurs de l'applet sont-ils paresseux ? Tout le monde n’utilise-t-il pas Java pour écrire le backend ? ? ?
Qu'est-ce que c'est, et puis j'ai commencé divers pièges AES. En fait, j'ai fait référence à beaucoup de tutoriels en ligne, et encore une fois, je ne peux pas tous les énumérer pour tout le monde, (car lorsque j'ai écrit cet article, c'était déjà une semaine après que le problème ait été résolu), et j'ai également reçu beaucoup d'aide de la part de l'administrateur. J'écrirai à nouveau un article pour rendre à tout le monde la liste ici uniquement du décryptage. méthodes de unionId Si vous avez des questions, veuillez contacter Je peux répondre ou répondre.
Un autre commentaire,
https N'utilisez pas le certificat gratuit fourni par startcom
https N'utilisez pas le certificat gratuit fourni par startcom ! startcom !
https N'utilisez pas le certificat gratuit fourni par startcom
Dites trois fois les choses importantes ! ! ! !
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; } }
Appelez la méthode à décrypter comme suit :
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(); }
L'environnement de compilation est java1.8
De plus, le package de support que j'ai présenté est
bcprov-jdk16-139.jar Ce package a été téléchargé en pièce jointe,
Ci-joint au passage Le code dans le mini programme js que j'ai essayé,
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); })
Le code ci-dessus utilise une promesse, dans laquelle la dernière phrase userservice.getUserToken est la méthode de requête au serveur , et le paramètre est le vecteur d'initialisation du contenu crypté du code obtenu
Pour plus d'articles liés à l'applet WeChat Java implémentant le décryptage AES et obtenant unionId, veuillez faire attention au site Web PHP chinois !