获取并解析平台证书以及平台证书验签以及微信支付插入信息添加用户id

This commit is contained in:
童丽然 2024-12-27 15:48:18 +08:00
parent 641d59467c
commit 3197e29b87
7 changed files with 224 additions and 18 deletions

View File

@ -1,16 +1,19 @@
package com.fastbee.common.utils.pay; package com.fastbee.common.utils.pay;
import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.security.KeyFactory; import java.security.KeyFactory;
import java.security.PublicKey; import java.security.PublicKey;
import java.security.Signature; import java.security.Signature;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.spec.X509EncodedKeySpec; import java.security.spec.X509EncodedKeySpec;
import java.util.Base64; import java.util.Base64;
public class RSAUtil { public class RSAUtil {
/** /**
* 验签方法 * 验签方法---微信公钥
* @param wechatpaySignature Wechatpay-Signature 响应头中的签名 * @param wechatpaySignature Wechatpay-Signature 响应头中的签名
* @param wechatpayTimestamp Wechatpay-Timestamp 响应头中的时间戳 * @param wechatpayTimestamp Wechatpay-Timestamp 响应头中的时间戳
* @param wechatpayNonce Wechatpay-Nonce 响应头中的随机串 * @param wechatpayNonce Wechatpay-Nonce 响应头中的随机串
@ -48,4 +51,43 @@ public class RSAUtil {
} }
/**
* 验签方法---平台证书
* @param wechatpaySignature Wechatpay-Signature 响应头中的签名
* @param wechatpayTimestamp Wechatpay-Timestamp 响应头中的时间戳
* @param wechatpayNonce Wechatpay-Nonce 响应头中的随机串
* @param responseBody 应答报文主体
* @param publicKey 微信支付公钥PEM 格式去掉头尾并解码为二进制
* @return 是否验签成功
* @throws Exception
*/
public static boolean verifySignatureByCertificate(String wechatpaySignature,
String wechatpayTimestamp,
String wechatpayNonce,
String responseBody,
String publicKey) throws Exception {
// 构造验签名串应答时间戳\n应答随机串\n应答报文主体\n
String message = wechatpayTimestamp + "\n" +
wechatpayNonce + "\n" +
responseBody + "\n";
// 解码微信支付公钥Base64 格式
byte[] certBytes = Base64.getDecoder().decode(publicKey);
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
X509Certificate certificate = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(certBytes));
PublicKey rsaPublicKey = certificate.getPublicKey();
// 初始化 Signature 对象指定算法为 SHA256withRSA
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initVerify(rsaPublicKey);
// 更新验签名串
signature.update(message.getBytes(StandardCharsets.UTF_8));
// 验证签名
byte[] signatureBytes = Base64.getDecoder().decode(wechatpaySignature);
return signature.verify(signatureBytes);
}
} }

View File

@ -0,0 +1,23 @@
-----BEGIN CERTIFICATE-----
MIID3DCCAsSgAwIBAgIUWlvfWWX+OjBk6Z+u8PgNGNCJyHIwDQYJKoZIhvcNAQEL
BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
Q0EwHhcNMjIxMTI1MDcxNzQ5WhcNMjcxMTI0MDcxNzQ5WjBuMRgwFgYDVQQDDA9U
ZW5wYXkuY29tIHNpZ24xEzARBgNVBAoMClRlbnBheS5jb20xHTAbBgNVBAsMFFRl
bnBheS5jb20gQ0EgQ2VudGVyMQswCQYDVQQGDAJDTjERMA8GA1UEBwwIU2hlblpo
ZW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4JVj9olHA76puWcKC
BLkkFKN4+NxexbtD/vw3A/1Lwh5uEGkekmIUgcJd6/gC7Bb4Ixx5wjJS3+gpjNjL
bET9KVgCR2KwPmpDIcnHh6ruJ7SeUMseizEVx3DLuQJDJJAojbgQUdddFzP48O1q
8Hd4qG45axB5dw9UUHJzM4kqqLTuqMs5eeKzGUMCCq8i5vpAg52IicTCG4AJXoIg
WK65c5d3QM/tZPgUHrj2sscZS09dP5oPeQKRZ4tWvOkHuh0+WMLdz6PEuZDBBgKz
vDk8a+JwsKh7O2TKDXgQTIswTM0coi3/gr82AxNjsKzou5GDAcFaGaAouq1BwkRj
ct/VAgMBAAGjgYEwfzAJBgNVHRMEAjAAMAsGA1UdDwQEAwID+DBlBgNVHR8EXjBc
MFqgWKBWhlRodHRwOi8vZXZjYS5pdHJ1cy5jb20uY24vcHVibGljL2l0cnVzY3Js
P0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFEMzk3NTQ5ODQ2QzAxQzNFOEVCRDIwDQYJ
KoZIhvcNAQELBQADggEBAHnekspTjNB66Vu7sL6nk9bPIYHIiQeCGz7BQbc1Gbfu
VrawOgubR1ahRJ06fVcsifdhbHvc0+TLmbQXvld1+SgAblsf/jmwqePVkQgHbaYO
MEP0jAQIJAcKnv9jpIW3zuaQzvkCf4OR6T27EUZNojUis+sDn+/AY96cmAXJppYF
02e0kQPewXQZdL+fPjTHZyB2i0Z9V24csQKmbb8KCslGsd/L3mh2BGx05K4Bt05A
3UXxW+QuhmDTzBMZkNNQIaPrKigTFX13KH4sbnK9LLkE/pTIO96twp23KG0otUPR
0nfdJpGhyyUO88JotIAWjTRShUtnIssfcUpjuF5BjMw=
-----END CERTIFICATE-----

View File

@ -4,11 +4,37 @@ import java.io.*;
import java.security.KeyFactory; import java.security.KeyFactory;
import java.security.PrivateKey; import java.security.PrivateKey;
import java.security.PublicKey; import java.security.PublicKey;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64; import java.util.Base64;
public class wxPayConfig { public class wxPayConfig {
/**
* 获取平台证书公钥
* @param platformCertificatePath
* @return
*/
public static String getPublicKeyByCertificat(String platformCertificatePath)
{
try {
// 读取私钥文件内容
String platformCertificateContent = readFile(platformCertificatePath);
// 去除私钥文件中的头尾信息
platformCertificateContent = platformCertificateContent.replace("-----BEGIN CERTIFICATE-----", "")
.replace("-----END CERTIFICATE-----", "")
.replaceAll("\\s+", "");
/*byte[] certBytes = Base64.getDecoder().decode(platformCertificateContent);
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
X509Certificate certificate = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(certBytes));
String publicKey = certificate.getPublicKey().toString();*/
return platformCertificateContent;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
// 获取微信支付公钥 // 获取微信支付公钥
public static String getPublicKey(String publicKeyPath) { public static String getPublicKey(String publicKeyPath) {

View File

@ -46,7 +46,8 @@ import com.fastbee.common.utils.pay.wxPayConfig;
import static cn.hutool.core.util.XmlUtil.xmlToMap; import static cn.hutool.core.util.XmlUtil.xmlToMap;
import static com.fastbee.common.constant.Constants.LANGUAGE; import static com.fastbee.common.constant.Constants.LANGUAGE;
import static com.fastbee.common.utils.pay.RSAUtil.verifySignature; import static com.fastbee.common.utils.pay.RSAUtil.verifySignature;
import static com.fastbee.rechargecard.service.impl.UserWechatPayServiceImpl.apiV3Key; import static com.fastbee.common.utils.pay.RSAUtil.verifySignatureByCertificate;
import static com.fastbee.rechargecard.service.impl.UserWechatPayServiceImpl.*;
/** /**
* @author mijiupro * @author mijiupro
@ -67,7 +68,14 @@ public class WeChatPayController extends BaseController {
@Autowired @Autowired
private IUserWechatPayService userWechatPayService; private IUserWechatPayService userWechatPayService;
/**
* 获取平台证书
* @return
*/
public AjaxResult getPlatformCertificat()
{
return success(userWechatPayService.getPlatformCertificat());
}
/** /**
* 获取openId * 获取openId
@ -158,6 +166,10 @@ public class WeChatPayController extends BaseController {
String wechatpaySerial = request.getHeader("Wechatpay-Serial");//序列号 String wechatpaySerial = request.getHeader("Wechatpay-Serial");//序列号
String wechatpayTimestamp = request.getHeader("Wechatpay-Timestamp");//时间戳 String wechatpayTimestamp = request.getHeader("Wechatpay-Timestamp");//时间戳
String wechatpayNonce = request.getHeader("Wechatpay-Nonce");//随机字符串 String wechatpayNonce = request.getHeader("Wechatpay-Nonce");//随机字符串
System.err.println("wechatpaySignature"+wechatpaySignature);
System.err.println("wechatpaySerial"+wechatpaySerial);
System.err.println("wechatpayTimestamp"+wechatpayTimestamp);
System.err.println("wechatpayNonce"+wechatpayNonce);
String json=jsonObject.toString(); String json=jsonObject.toString();
System.out.println("微信回调报文:{"+json+"}"); System.out.println("微信回调报文:{"+json+"}");
// 构建应答报文 // 构建应答报文
@ -184,10 +196,15 @@ public class WeChatPayController extends BaseController {
* responseBody 应答报文主体 * responseBody 应答报文主体
* publicKey 微信支付公钥PEM 格式去掉头尾并解码为二进制 * publicKey 微信支付公钥PEM 格式去掉头尾并解码为二进制
*/ */
//微信支付公钥验签
//String publicKey= wxPayConfig.getPublicKey(publicKeyPath);//读取并预处理后的微信支付公钥 //String publicKey= wxPayConfig.getPublicKey(publicKeyPath);//读取并预处理后的微信支付公钥
/*String Authorization= //boolean isVerified = verifySignature(wechatpaySignature, wechatpayTimestamp, wechatpayNonce, json, publicKey);//微信支付公钥验签方式
String publicKey=userWechatPayService.getPublicKeyByCertificat();
boolean isVerified = verifySignature(wechatpaySignature, wechatpayTimestamp, wechatpayNonce, json, publicKey); //平台证书验签
/*String publicKey=wxPayConfig.getPublicKeyByCertificat(platformCertificatePath);//读取预处理后的平台证书
System.err.println("publickey:"+publicKey);
boolean isVerified = verifySignatureByCertificate(wechatpaySignature, wechatpayTimestamp, wechatpayNonce, json, publicKey);
if (isVerified) { if (isVerified) {
System.out.println("签名验证成功"); System.out.println("签名验证成功");
} else { } else {

View File

@ -1,9 +1,13 @@
package com.fastbee.rechargecard.service.impl; package com.fastbee.rechargecard.service.impl;
import java.util.List; import java.util.List;
import com.fastbee.common.exception.ServiceException;
import com.fastbee.common.utils.DateUtils; import com.fastbee.common.utils.DateUtils;
import com.fastbee.rechargecard.domain.UserRechargeCards;
import com.fastbee.rechargecard.domain.dto.RechargecardUser; import com.fastbee.rechargecard.domain.dto.RechargecardUser;
import com.fastbee.rechargecard.domain.dto.WeChatRecharge; import com.fastbee.rechargecard.domain.dto.WeChatRecharge;
import com.fastbee.rechargecard.mapper.UserRechargeCardsMapper;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.fastbee.rechargecard.mapper.NgUserRechargeRecordsMapper; import com.fastbee.rechargecard.mapper.NgUserRechargeRecordsMapper;
@ -21,6 +25,8 @@ public class NgUserRechargeRecordsServiceImpl implements INgUserRechargeRecordsS
{ {
@Autowired @Autowired
private NgUserRechargeRecordsMapper ngUserRechargeRecordsMapper; private NgUserRechargeRecordsMapper ngUserRechargeRecordsMapper;
@Autowired
private UserRechargeCardsMapper userRechargeCardsMapper;
@Override @Override
public NgUserRechargeRecords SelectRechargeRecodeByRechargeCode(String rechargeCode) { public NgUserRechargeRecords SelectRechargeRecodeByRechargeCode(String rechargeCode) {
@ -29,7 +35,21 @@ public class NgUserRechargeRecordsServiceImpl implements INgUserRechargeRecordsS
@Override @Override
public int insertNgUserRechargeRecordsWeChat(WeChatRecharge rechargecardUser) { public int insertNgUserRechargeRecordsWeChat(WeChatRecharge rechargecardUser) {
// 根据id查询用户充值卡信息
UserRechargeCards info = userRechargeCardsMapper.selectUserRechargeCardsByCardnumber(String.valueOf(rechargecardUser.getCardnumber()));
if (info == null) {
// 如果没有找到对应的记录返回0或者一个错误码
throw new ServiceException("卡号不存在!");
}
NgUserRechargeRecords ngUserRechargeRecords=new NgUserRechargeRecords(); NgUserRechargeRecords ngUserRechargeRecords=new NgUserRechargeRecords();
if(info.getUserId()!=null)
{
ngUserRechargeRecords.setUserId(info.getUserId());
}
if(info.getUserName()!=null)
{
ngUserRechargeRecords.setUserName(info.getUserName());
}
ngUserRechargeRecords.setRechargeTime(DateUtils.getNowDate()); ngUserRechargeRecords.setRechargeTime(DateUtils.getNowDate());
ngUserRechargeRecords.setBalance(rechargecardUser.getAmount()); ngUserRechargeRecords.setBalance(rechargecardUser.getAmount());
ngUserRechargeRecords.setAmount(rechargecardUser.getAmount()); ngUserRechargeRecords.setAmount(rechargecardUser.getAmount());

View File

@ -121,6 +121,10 @@ public class UserRechargeCardsServiceImpl implements IUserRechargeCardsService
throw new Exception("订单信息不存在"); throw new Exception("订单信息不存在");
} }
ngUserRechargeRecords=userRechargeRecordsMapper.selectNgUserRechargeRecordsByRechargeCode(rechargeCode);//查询订单信息 ngUserRechargeRecords=userRechargeRecordsMapper.selectNgUserRechargeRecordsByRechargeCode(rechargeCode);//查询订单信息
if(ngUserRechargeRecords.getStatus().equals(1))
{
return 1;
}
ngUserRechargeRecords.setStatus(1);//状态更改为已支付 ngUserRechargeRecords.setStatus(1);//状态更改为已支付
userRechargeRecordsMapper.updateNgUserRechargeRecords(ngUserRechargeRecords); userRechargeRecordsMapper.updateNgUserRechargeRecords(ngUserRechargeRecords);

View File

@ -2,6 +2,7 @@ package com.fastbee.rechargecard.service.impl;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.fastbee.common.utils.pay.AesUtil;
import com.fastbee.common.utils.pay.wxPayConfig; import com.fastbee.common.utils.pay.wxPayConfig;
import com.fastbee.rechargecard.domain.dto.WeChatRecharge; import com.fastbee.rechargecard.domain.dto.WeChatRecharge;
import com.fastbee.rechargecard.service.INgUserRechargeRecordsService; import com.fastbee.rechargecard.service.INgUserRechargeRecordsService;
@ -17,10 +18,13 @@ import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils; import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.PrivateKey; import java.security.PrivateKey;
import java.security.Signature; import java.security.Signature;
import java.util.*; import java.util.*;
@ -34,9 +38,9 @@ public class UserWechatPayServiceImpl implements IUserWechatPayService {
public static String mchId = "1503198881"; public static String mchId = "1503198881";
/** 商户API私钥文件路径 */ /** 商户API私钥文件路径 */
//public static String privateKeyPath = "fastbee-common/src/main/java/com/fastbee/common/utils/pay/apiclient_key.pem"; //public static String privateKeyPath = "fastbee-common/src/main/java/com/fastbee/common/utils/pay/apiclient_key.pem";
// public static String privateKeyPath = "fastbee-common/src/main/java/com/fastbee/common/utils/pay/damogang_apiclient_key.pem"; public static String privateKeyPath = "fastbee-common/src/main/java/com/fastbee/common/utils/pay/damogang_apiclient_key.pem";
//TODO 生产环境私钥路径 //TODO 生产环境私钥路径
public static String privateKeyPath = "/home/soft/hzwmiot/fastbee-admin/target/damogang_apiclient_key.pem"; //public static String privateKeyPath = "/home/soft/hzwmiot/fastbee-admin/target/damogang_apiclient_key.pem";
/** 商户API证书序列号 */ /** 商户API证书序列号 */
@ -51,11 +55,13 @@ public class UserWechatPayServiceImpl implements IUserWechatPayService {
public static String appSecret="7f591f559929a3bf2dbea4e156b08ae9"; public static String appSecret="7f591f559929a3bf2dbea4e156b08ae9";
//微信支付公钥地址 //微信支付公钥地址
//public static String publicKeyPath="fastbee-common/src/main/java/com/fastbee/common/utils/pay/wechat_public_key.pem"; //public static String publicKeyPath="fastbee-common/src/main/java/com/fastbee/common/utils/pay/wechat_public_key.pem";
//public static String publicKeyPath="fastbee-common/src/main/java/com/fastbee/common/utils/pay/wechat_public_key.pem"; public static String publicKeyPath="fastbee-common/src/main/java/com/fastbee/common/utils/pay/wechat_public_key.pem";
//平台证书地址
public static String platformCertificatePath="fastbee-common/src/main/java/com/fastbee/common/utils/pay/damogang_platformCertificate.pem";
//支付结果回调地址 //支付结果回调地址
// public static String notify_url="https://5f655ed0.r3.cpolar.cn/pay/getresult";//https://5f655ed0.r3.cpolar.cn public static String notify_url="https://3ffb1c5f.r3.cpolar.cn/pay/getresult";//https://3ffb1c5f.r3.cpolar.cn
//TODO 生产环境支付结果异步通知地址 //TODO 生产环境支付结果异步通知地址
public static String notify_url="https://farmh5.hze2.com/prod-api/pay/getresult"; //public static String notify_url="https://farmh5.hze2.com/prod-api/pay/getresult";
//https://5f655ed0.r3.cpolar.cn //https://5f655ed0.r3.cpolar.cn
@Override @Override
/** /**
@ -86,7 +92,7 @@ public class UserWechatPayServiceImpl implements IUserWechatPayService {
reqdata.put("notify_url",notify_url);//"\t\n" + reqdata.put("notify_url",notify_url);//"\t\n" +
reqdata.put("payer",payer); reqdata.put("payer",payer);
//String Signature=getSign(reqdata); //String Signature=getSign(reqdata);
Map<String,String> info=getSign(reqdata); Map<String,String> info=getSign(reqdata,"POST","/v3/pay/transactions/jsapi");
String timeStamp=info.get("timeStamp"); String timeStamp=info.get("timeStamp");
String nonce_str=info.get("nonce_str"); String nonce_str=info.get("nonce_str");
@ -145,11 +151,11 @@ public class UserWechatPayServiceImpl implements IUserWechatPayService {
/** /**
* 生成签名 * 生成签名
*/ */
private Map<String,String> getSign(Map<String,Object> reqBody) throws Exception { private Map<String,String> getSign(Map<String,Object> reqBody,String reqMethod,String url) throws Exception {
//获取时间戳 //获取时间戳
String reqMethod="POST"; /* String reqMethod="POST";
String url="/v3/pay/transactions/jsapi"; String url="/v3/pay/transactions/jsapi";*/
/*String reqMethod="GET"; /*String reqMethod="GET";
String url="/v3/refund/domestic/refunds/123123123123";*/ String url="/v3/refund/domestic/refunds/123123123123";*/
String timeStamp = String.valueOf(System.currentTimeMillis() / 1000); String timeStamp = String.valueOf(System.currentTimeMillis() / 1000);
@ -157,6 +163,10 @@ public class UserWechatPayServiceImpl implements IUserWechatPayService {
String nonce_str= UUID.randomUUID().toString(); String nonce_str= UUID.randomUUID().toString();
//nonce_str="593BEC0C930BF1AFEB40B4A08C8FB242"; //nonce_str="593BEC0C930BF1AFEB40B4A08C8FB242";
String reqParam= JSONUtil.toJsonStr(reqBody); String reqParam= JSONUtil.toJsonStr(reqBody);
if(reqBody==null)
{
reqParam="";
}
/*HTTP请求方法\n /*HTTP请求方法\n
URL\n URL\n
@ -165,6 +175,7 @@ public class UserWechatPayServiceImpl implements IUserWechatPayService {
请求报文主体\n 请求报文主体\n
*/ */
String signStr=reqMethod+"\n"+url+"\n"+timeStamp+"\n"+nonce_str+"\n"+reqParam +"\n"; String signStr=reqMethod+"\n"+url+"\n"+timeStamp+"\n"+nonce_str+"\n"+reqParam +"\n";
System.err.println("signStr:"+signStr);
//String signStr=reqMethod+"\n"+url+"\n"+timeStamp+"\n"+nonce_str+"\n\n"; //String signStr=reqMethod+"\n"+url+"\n"+timeStamp+"\n"+nonce_str+"\n\n";
String sign=sign(signStr.getBytes("utf-8")); String sign=sign(signStr.getBytes("utf-8"));
Map<String,String> info=new HashMap<>(); Map<String,String> info=new HashMap<>();
@ -249,11 +260,74 @@ public class UserWechatPayServiceImpl implements IUserWechatPayService {
* 获取平台证书 * 获取平台证书
* @return * @return
*/ */
@Override /*@Override*/
public String getPlatformCertificat() public String getPlatformCertificat()
{ {
String url="https://api.mch.weixin.qq.com/v3/certificates"; String url="https://api.mch.weixin.qq.com/v3/certificates";
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
return null; HttpGet httpGet = new HttpGet(url);
//生成签名
Map<String,String> signResult=getSign(null,"GET","/v3/certificates");
Set<String> keySet2 = signResult.keySet();
// 遍历键集合
for (String key : keySet2) {
System.err.println(key + ": " + signResult.get(key));
} }
String sign=signResult.get("sign").toString();
String nonce_str=signResult.get("nonce_str").toString();
String timeStamp=signResult.get("timeStamp").toString();
String Authorization="WECHATPAY2-SHA256-RSA2048 mchid=\""+mchId+"\",nonce_str=\""+nonce_str+"\",signature=\""+sign+"\",timestamp=\""+timeStamp+"\",serial_no=\""+serial_no+"\"";
System.err.println(Authorization);
httpGet.setHeader("Accept", "application/json");
httpGet.setHeader("Authorization",Authorization);
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
String responseString = EntityUtils.toString(response.getEntity());
System.err.println(responseString);
Map<String, Object> responseMap = JSONUtil.toBean(responseString, Map.class);
// 使用Optional来避免null检查
Optional<?> optionalObj = Optional.ofNullable(responseMap.get("data"));
System.err.println(optionalObj);
// 链式调用map和flatMap方法来安全地转换和获取Map
Map<?, ?> map = optionalObj
.filter(List.class::isInstance) // 确保obj是List类型
.map(List.class::cast) // 将obj转换为List
.filter(list -> !list.isEmpty() && list.get(0) instanceof Map) // 确保List不为空并且第一个元素是Map类型
.map(list -> (Map<?, ?>) list.get(0)) // 将List中的第一个元素转换为Map
.orElse(null); // 如果任何检查失败则返回null
System.err.println(map);
//解密jsonObject对象
Map<String,Object> encrypt_certificate= (Map<String, Object>) map.get("encrypt_certificate");
System.err.println("111");
System.err.println(encrypt_certificate);
String associated_data=encrypt_certificate.get("associated_data").toString();//加密证书的附加数据固定为certificate"
String ciphertext=encrypt_certificate.get("ciphertext").toString();//加密证书的随机串
String nonce=encrypt_certificate.get("nonce").toString();//加密后的证书内容
System.err.println("ciphertext:"+ciphertext);
System.err.println("nonce:"+nonce);
System.err.println("associated_data:"+associated_data);
//使用apiv3key解密
String decryptData="";
try{
decryptData= new AesUtil(apiV3Key.getBytes(StandardCharsets.UTF_8)).decryptToString
(associated_data.getBytes(StandardCharsets.UTF_8),
nonce.getBytes(StandardCharsets.UTF_8),
ciphertext);
System.out.println("解密成功:\n"+decryptData);
}catch (Exception e)
{
System.out.println("解密失败");
}
// 解析responseString以获取openid
return responseMap.toString(); // 这里返回的是整个响应字符串需要自行解析出openid
}
} catch (IOException e) {
throw new RuntimeException(e);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
} }