【Java】Apache HttpClient调用微信支付API v3报错:找不到证书序列号对应的证书

本文详细介绍了如何正确配置微信支付APIv3版本,包括商户API证书与APIv3秘钥的设置,并解决了“找不到证书序列号对应的证书”的常见问题。文章还解释了如何区分并正确使用商户API证书与微信支付平台证书。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      在使用微信支付API v3版本时,需要在【API安全】中设置商户API证书、API v3秘钥,如下: 

 
      下载下来的文件夹如下,包含p12格式、pem格式的商户API证书,和pem格式的商户API私钥:

       如题,“找不到证书序列号对应的证书”,是因为在使用 wechatpay-apache-httpclient 调用微信支付时,使用的 wechatPayCertificates 参数为 微信支付平台证书,而不是商户API证书

WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
        .withMerchant(merchantId, merchantSerialNumber, merchantPrivateKey)
        .withWechatPay(wechatPayCertificates); //微信支付平台证书

      “平台证书”需要调用 “获取平台证书接口“ 进行获取,可以使用微信官方提供的Postman脚本进行获取,如下获取到的结果:

       还需要通过其中的associated_data、nonce、ciphertext参数 和 APIv3秘钥,解密出平台证书,参考代码

import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class AesUtil {

    static final int KEY_LENGTH_BYTE = 32;
    static final int TAG_LENGTH_BIT = 128;
    static final byte[] aesKey = "5BAkGA1UdE3CQCMAAw3uiPA9375JXNYN".getBytes();

    public static String decryptToString(byte[] associatedData, byte[] nonce, String ciphertext)
            throws GeneralSecurityException, IOException {
        try {
            Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");

            SecretKeySpec key = new SecretKeySpec(aesKey, "AES");
            GCMParameterSpec spec = new GCMParameterSpec(TAG_LENGTH_BIT, nonce);

            cipher.init(Cipher.DECRYPT_MODE, key, spec);
            cipher.updateAAD(associatedData);

            return new String(cipher.doFinal(Base64.getDecoder().decode(ciphertext)), "utf-8");
        } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
            throw new IllegalStateException(e);
        } catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
            throw new IllegalArgumentException(e);
        }
    }
}

      将获得平台证书字符串,去掉换行符\n,写入.pem格式证书文件即可:

      另外官方建议定期去更新平台证书,见平台证书更新指引

### 微信支付 APIKey 和 Apiv3Key 的区别及使用方法 #### 一、APIKey 和 Apiv3Key 的定义与作用 APIKey 是用于微信支付 V2 版本的身份验证密钥,主要用于 HMAC-SHA256 签名算法中的签名计算。而 Apiv3Key 则是在微信支付 APIv3 中引入的一种新的身份验证机制的一部分。 Apiv3Key 主要应用于微信支付 APIv3 接口中,作为对称加密密钥来保护通信的安全性。它被用来生成和校验请求体摘要以及 MAC 值,从而确保数据传输过程中不被篡改并保持机密性[^1]。 #### 二、具体应用场景下的差异 对于旧版的 API (V2),开发者通常会通过设置 `mch_key` 参数来进行签名操作;而在新版 API (V3) 下,则不再直接暴露此参数给开发者,而是由平台自动生成唯一的 Apiv3Key 并分配给每一个接入的应用程序实例。这意味着每次调用微信支付服务时都需要携带正确的 Apiv3Key 来完成必要的认证流程。 #### 三、如何获取与管理这两种 Key? - **APIKey**: 商户可以在微信公众平台上自行配置和修改该值; - **Apiv3Key**: 需要在申请开通 APIv3 功能之后才能获得,并且建议定期更换以增强安全性。需要注意的是,一旦更新了 Apiv3Key 后端系统也需要同步调整相应的逻辑处理部分以便适配新 key。 #### 四、代码示例:基于 Java 实现 Apiv3 请求头构建 以下是利用 WeChat Pay 提供的官方 Java SDK (`wechatpay-java`) 构建带有有效授权信息 HTTP 头部的一个简单例子: ```java import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; // ... 导入其他必要包 ... public class Example { public static void main(String[] args)throws Exception{ String mchId = "your-mch-id"; // 替换成自己的商户号 String serialNo = "your-certificate-sn"; // 替换成自己证书序列号 File certFile = new File("/path/to/cert.p12"); // 替换成实际路径 try(CloseableHttpClient client = WechatPayHttpClientBuilder.create() .withMerchant(mchId, serialNo, certFile) .build()){ HttpGet get = new HttpGet("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/{out_trade_no}"); try(CloseableHttpResponse response = client.execute(get)){ System.out.println(response.getStatusLine().getStatusCode()); // 进一步解析响应... } } } } ``` 这段代码展示了怎样创建一个支持 Apiv3 认证方式的 HttpClient 对象,并发起 GET 请求访问交易查询接口。注意这里并没有显式指定 Apiv3Key ,因为这个值已经被集成到了客户端内部自动处理之中[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李维山

帮到你就行 不差钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值