java支付宝回调证书验签

文章讲述了如何在支付宝官方SDK不支持的情况下,通过解析公钥证书内容,使用X.509和Base64编码,自行实现对POST请求参数的RSA2验签过程。
摘要由CSDN通过智能技术生成
//获取支付宝POST过来反馈信息
Map<String, String> params = new HashMap<>(16);
Map<String, String[]> requestParams = request.getParameterMap();
for (String name : requestParams.keySet()) {
    String[] values = requestParams.get(name);
    String valueStr = "";
    for (int i = 0; i < values.length; i++) {
        valueStr = (i == values.length - 1) ? valueStr + values[i]
                : valueStr + values[i] + ",";
    }
    params.put(name, valueStr);
}
//直接用txt打开公钥证书的内容
String alipayCertContent = "公钥证书内容";
String publicKey = getPublicKey(alipayCertContent);
//证书模式验签
boolean signVerified = AlipaySignature.rsaCheckV1(params,
        publicKey,
        cn.hutool.core.util.CharsetUtil.UTF_8,
        AlipayConstants.SIGN_TYPE_RSA2);
public static String getPublicKey(String s) throws AlipayApiException {
    InputStream inputStream = null;
    try {
        inputStream = new ByteArrayInputStream(s.getBytes());
        CertificateFactory cf = CertificateFactory.getInstance("X.509", "BC");
        X509Certificate cert = (X509Certificate) cf.generateCertificate(inputStream);
        PublicKey publicKey = cert.getPublicKey();
        return com.alipay.api.internal.util.codec.Base64.encodeBase64String(publicKey.getEncoded());
    } catch (NoSuchProviderException e) {
        throw new AlipayApiException(e);
    } catch (CertificateException e) {
        throw new AlipayApiException(e);
    } finally {
        try {
            if (inputStream != null) {
                inputStream.close();
            }
        } catch (IOException e) {
            throw new AlipayApiException(e);
        }
    }
}

由于支付宝提供的官方sdk没有根据证书内容来验签的,需要自己翻sdk的底层代码拷贝出来,用getPublicKey方法解析支付宝公钥,然后在用公钥进行验签

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值