网联清算签名和验签

网联清算签名和验签

if(StringUtils.isBlank(epccGwMsg)) 
{
log.info("请求的签约信息epccGwMsg不能为空!");
throw new Exception("请求的签约信息epccGwMsg不能为空!");
}
log.info("支付宝绑卡请求参数:{}",epccGwMsg);
// 对epccGwMsg进行urlDecode解码
// String urlDecode = URLDecoder.decode(epccGwMsg, "UTF-8");
// 对epccGwMsg进行Base64解码,得到xml节点字符串
String base64Decode = new String(Base64.decodeBase64(epccGwMsg.getBytes("UTF-8")), "UTF-8");
log.info("base64解码后的xml为:{}", base64Decode);

// 以split("\\{S:")截取xml字符串 [0]为<root>部分,[1]为数字签名域
String xmlMsg = base64Decode.split("\\{S:")[0];
log.info("root部分:{}", xmlMsg);
String sign = base64Decode.split("\\{S:")[1].split("}")[0];
log.info("支付宝传递sign:{}", sign);

// 获取签名证书序列号
String signSN = SysInfoUtil.parseXmlItemValue("SignSN", xmlMsg);
log.info("签名证书序列号:{}", signSN);
// 获取加密证书序列号
String ncrptnSN = SysInfoUtil.parseXmlItemValue("NcrptnSN", xmlMsg);
log.info("加密证书序列号:{}", ncrptnSN);
// 去掉头只保留<root>及其子节点的xmlMsg
String rootXmlMsg = xmlMsg.split("encoding=\"UTF-8\"\\?>")[1];
log.info("去掉头只保留<root>及其子节点:{}", rootXmlMsg);


/*// 根据支付机构公钥对签名数据验签
String hexString = Hex.encodeHexString(rootXmlMsg.getBytes(CharEncoding.UTF_8)).toUpperCase();
UnionMessage servEA12 = unionEssc.servEA12(signSN, hexString, 1, sign);

String responseremark = servEA12.getHeadField("responseremark");
log.info("加密机验签responseremark:{}", responseremark);
boolean verifyResult = "成功".equals(responseremark);
if (!verifyResult) {
log.info("支付宝绑卡验签失败!");
throw new Exception("支付宝绑卡验签失败");
}
log.info("支付宝绑卡验签成功!");*/


// 解析xml节点转换为对象
InstgRequest instgRequest = (InstgRequest) XMLUtil.fromXmlNoNameSpace(xmlMsg, InstgRequest.class);

// 获取数字信封
String dgtlEnvlp = SysInfoUtil.parseXmlItemValue("DgtlEnvlp", xmlMsg);
// 对dgtlEnvlp进行Base64解码
byte[] dgtlEnvlpByte = Base64.decodeBase64(dgtlEnvlp.getBytes("UTF-8"));

String encodeHexString = Hex.encodeHexString(dgtlEnvlpByte).toUpperCase();
// 用私钥对base64解码后的数字信封解密
UnionMessage unionMessage = unionEssc.servEA14(ncrptnSN, encodeHexString);

String keyValue = unionMessage.getBodyField("keyvalue");
log.info("解密数字信封keyValue:{}",keyValue);
String keyType = unionMessage.getBodyField("keytype");
log.info("解密数字信封keyType:{}",keyType);

// 获取<Sec>节点中的加密信息
String secMsg = SysInfoUtil.parseXmlItemValue("Sec", xmlMsg);

//根据对称密钥和算法类型解密secMsg
// ?keyType 1A 密钥算法类型 R:AES256-zek S:SM4-zek
// ?paddingFlag 1N 填充标识 可选,默认为1, 0:不填充 1:PKCS5填充
// ?exportFlag 1N 输出明文数据标识 可选,默认为0, 0:ASC 字符(默认) 1:十六进制数
// ?algorithmID 1N 算法标识 可选,默认为0 , 0:ECB 1:CBC
// ?iv 32H iv向量 algorithmID为1时存在,可选,默认为0x00 0x00 …

byte[] secMsgBytes = Base64.decodeBase64(secMsg.getBytes(CharEncoding.UTF_8));
String hexSec = Hex.encodeHexString(secMsgBytes).toUpperCase();
UnionMessage decryptSec = unionEssc.servEA16(keyValue, keyType, 1, hexSec, 0, 0, "");
String secXml = decryptSec.getBodyField("data");
log.info("调用servEA16解密后:{}",secXml);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值