配置信息
#微信appid
system.wx_app_id=wx260b17031280b16d
#微信secret
system.wx_secret=ce579730122e9257645394513f689e99
文件目录
文件具体内容
import com.alibaba.fastjson.JSON;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.AlgorithmParameters;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import java.security.spec.InvalidParameterSpecException;
import java.util.Base64;
public class AESForWeixinGetPhoneNumber {
//加密方式
private static String keyAlgorithm = "AES";
//避免重复new生成多个BouncyCastleProvider对象,因为GC回收不了,会造成内存溢出
//只在第一次调用decrypt()方法时才new 对象
private static boolean initialized = false;
//用于Base64解密
private Base64.Decoder decoder = Base64.getDecoder();
//待解密的数据
private String originalContent;
//会话密钥sessionKey
private String encryptKey;
//加密算法的初始向量
private String iv;
public AESForWeixinGetPhoneNumber(String originalContent,String encryptKey,String iv) {
this.originalContent = originalContent;
this.encryptKey = encryptKey;
this.iv = iv;
}
/**
* AES解密
* 填充模式AES/CBC/PKCS7Padding
* 解密模式128
*
* @return 解密后的信息对象
*/
public WeixinPhoneDecryptInfo decrypt() {
initialize();
try {
//数据填充方式
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
Key sKeySpec = new SecretKeySpec(decoder.decode(this.encryptKey), keyAlgorithm);
// 初始化
cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(decoder.decode(this.iv)));
byte[]data = cipher.doFinal(decoder.decode(this.originalContent));
String datastr = new String(data, StandardCharsets.UTF_8);
return JSON.toJavaObject(JSON.parseObject(datastr), WeixinPhoneDecryptInfo.class);
} catch (Exception e) {
System.out.println(e.getMessage());
System.out.println(222);
return null;
}
}
/**BouncyCastle作为安全提供,防止我们加密解密时候因为jdk内置的不支持改模式运行报错。**/
private static void initialize() {
if (initialized) {
return;
}
Security.addProvider(new BouncyCastleProvider());
initialized = true;
}
// 生成iv
private static AlgorithmParameters generateIV(byte[] iv) throws NoSuchAlgorithmException, InvalidParameterSpecException {
AlgorithmParameters params = AlgorithmParameters.getInstance(keyAlgorithm);
params.init(new IvParameterSpec(iv));
return params;
}
}
import lombok.Data;
@Data
public class WaterMark {
private Long timestamp;// 时间戳做转换的时候,记得先乘以1000,再通过simpledateformat完成date类型转换
private String appid;
}
@Data
public class WeixinPhoneDecryptInfo {
private String phoneNumber;
private String purePhoneNumber;
private int countryCode;
private String weixinWaterMark;
private WaterMark watermark;
}
import lombok.Data;
@Data
public class WxLoginInfo {
private String openid;
private String session_key;
}
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.zcsac.admin.common.configures.SystemConfig;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class WxUtil {
public static WeixinPhoneDecryptInfo getWeixinPhoneDecryptInfo(SystemConfig systemConfig,String encryptedData,String iv,String sessionKey){
log.info("加密的敏感数据:" + encryptedData);
log.info("初始向量:" + iv);
log.info("会话密钥:" + sessionKey);
String appId = systemConfig.getWxAppId();
AESForWeixinGetPhoneNumber aes = new AESForWeixinGetPhoneNumber(encryptedData,sessionKey,iv);
WeixinPhoneDecryptInfo info = aes.decrypt();
if (null==info){
System.out.println("error");
}else {
System.out.println(info.toString());
if (!info.getWatermark().getAppid().equals(appId)){
System.out.println("wrong appId");
}
}
return info;
}
public static WxLoginInfo getWxinfo(SystemConfig systemConfig,String js_code){
String url="https://api.weixin.qq.com/sns/jscode2session?appid="+systemConfig.getWxAppId();
url = url+"&secret="+systemConfig.getWxSecret();
url = url +"&js_code="+js_code;
url = url +"&grant_type=authorization_code";
HttpRequest httpRequest = HttpUtil.createGet(url);
String result = httpRequest.execute().body();
return JSON.toJavaObject(JSON.parseObject(result),WxLoginInfo.class);
}
}
pom文件添加配置
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.4</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk16</artifactId>
<version>1.46</version>
</dependency>
使用
WxLoginInfo wxInfo = WxUtil.getWxinfo(systemConfig, customerWxinfoBody.getJs_code());
WeixinDecryptInfo weixinDecryptInfo = WxUtil.getWeixinPhoneDecryptInfo(systemConfig, customerWxinfoBody.getEncryptedData(), customerWxinfoBody.getIv(),wxInfo.getSession_key());