Spring boot 有用 spring boot 使用 wechatpay-apache-httpclient 对接微信支付 报错 org.apache.http.HttpException: 应答的微信支付签名验证失败

· 会写bug的大佬 · 84阅读 · 2022-07-26

详细描述

spring boot 使用 wechatpay-apache-httpclient 对接微信支付 报错 org.apache.http.HttpException: 应答的微信支付签名验证失败,但是可以正常返回code_url

版本信息

wechatpay-apache-httpclient 0.4.7 spring boot 2.4.2

复现过程

微信支付官方SDK地址

官方的说明文档写的很含糊,差不多按照文档完成demo后首次运行出现问题,但是问题很奇怪

这里可以正常生成code_url,使用第三方工具转成二维码之后也可以正常支付,不知道对回调是否有影响,但是接下来的异常会导致程序异常终止,code_url的后续逻辑也无法执行。

解决方案

最后找了很久,在官方代码中找到了一丝端倪

private static final String merchantId = "1900009191"; // 商户号
private static final String merchantSerialNumber = "1DDE55AD98ED71D6EDD4A4A16996DE7B47773A8C"; // 商户证书序列号
private static final String requestBody = "{\n"
+ " \"stock_id\": \"9433645\",\n"
+ " \"stock_creator_mchid\": \"1900006511\",\n"
+ " \"out_request_no\": \"20190522_001中文11\",\n"
+ " \"appid\": \"wxab8acb865bb1637e\"\n"
+ "}";
// 你的商户私钥
private static final String privateKey = "-----BEGIN PRIVATE KEY-----\n"
+ "-----END PRIVATE KEY-----";
// 你的微信支付平台证书
private static final String certificate = "-----BEGIN CERTIFICATE-----\n"
+ "-----END CERTIFICATE-----";
private CloseableHttpClient httpClient;

这是微信官方的单元测试代码,certificate 的注释是微信支付平台证书,而我填写的证书是从微信支付后台下载的商户证书,问题应该就在这了。

按照官方的说法,需要下载官方jar包生成支付证书,下载地址

下载jar包之后执行命令

java -jar CertificateDownloader.jar -k ${apiV3key} -m ${mchId} -f ${mchPrivateKeyFilePath} -s ${mchSerialNo} -o ${outputFilePath} -c ${wechatpayCertificateFilePath}

这里,必需参数有:

  • 商户的私钥文件,即 -f
  • 证书解密的密钥,即 -k
  • 商户号,即 -m
  • 保存证书的路径,即 -o
  • 商户证书的序列号,即 -s

非必需参数有:

  • 微信支付证书,用于验签,即 -c

另外户证书的序列号估计很多人也不知道是啥,在代码中也需要填写这个参数,这个在微信支付后台可以查看,另外微信也提供了在线查看的方式,进去上传证书就可以看到序列号了

文章有用

已有 3人 推荐该文章,推荐越多越容易获得的官方扶持

微信扫码分享