导入依赖
org.bouncycastle bcprov-jdk15on 1.56
解密代码
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.io.UnsupportedEncodingException;import java.security.*;import java.security.spec.InvalidParameterSpecException;public class WxAesUtil { static { Security.addProvider(new BouncyCastleProvider()); } /** * AES解密 * @param data 密文 * @param key 秘钥 * @param iv 偏移量 * @param encodingFormat 解密后需要进行的编码 * @return */ public static String decrypt(String data, String key, String iv, String encodingFormat){ //被加密的数据 byte[] dataByte = Base64.decodeBase64(data); //加密秘钥 byte[] keyByte = Base64.decodeBase64(key); //偏移量 byte[] ivByte = Base64.decodeBase64(iv); try { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); SecretKeySpec spec = new SecretKeySpec(keyByte, "AES"); AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES"); parameters.init(new IvParameterSpec(ivByte)); cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化 byte[] resultByte = cipher.doFinal(dataByte); if (null != resultByte && resultByte.length > 0) { String result = new String(resultByte, encodingFormat); return result; } return null; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidParameterSpecException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; }}
上述就是解密微信加密信息的全部代码了。Java获取小程序手机号码以及解密用户信息请参考如下说明:
data为前端传入的encryptedData参数iv为前端传入的iv参数key则是通过https://api.weixin.qq.com/sns/jscode2session接口获取的session_key。
若出现解密报错,可以排查以下几点:
1、解密用户信息时一定要缓存每次登录(jscode2session)的session_key,然后用于解密,否则将解密不成功2、jscode2session接口一定在前面,其他API接口在后使用3、获取session_key不成功时查看code是否已被使用
【更多精彩】
脚本搭建Nginx、Redis、MySql、Maven
Java获取小程序手机号码
Java微信小程序支付