wechatpay-apiv3 / wechatpay-apache-httpclient

微信支付 APIv3 Apache HttpClient装饰器(decorator)
https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pages/index.shtml
Apache License 2.0
660 stars 249 forks source link

接入APIV3获取证书 #203

Open jeff1ry opened 6 months ago

jeff1ry commented 6 months ago

报错 我第一次已经获取完了并且支付了 但是当我改回CloseableHttpClient httpClient = builder.build();后就报错 0 请问是两个/n的问题吗?但是定时更新平台证书的代码完全copy的 没有改过呢

xy-peng commented 6 months ago

你是 copy 的代码,而不是直接使用这个库吗?

jeff1ry commented 6 months ago

肯定是这个库啊 这是我的pom文件

com.github.wechatpay-apiv3 wechatpay-apache-httpclient 0.4.2
jeff1ry commented 6 months ago

我的意思是 这个定时更新平台证书号的功能代码 我是从你这github上copy的 那么第一次获取平台证书并且支付结束了,第二次更改为 CloseableHttpClient httpClient = builder.build(); build方法后为什么401 ?

jeff1ry commented 6 months ago

image 这个是报错原因

jeff1ry commented 6 months ago

hello?还有人吗 ?这bug还是什么 很紧急的啊

xy-peng commented 6 months ago

请求签名不过,签名串看起来是对的,会不会是你传入的私钥不对?

建议你先参考示例,不用自动下载证书,用配置文件加载微信支付的平台证书,看看用这个库能否成功发送业务请求。

jeff1ry commented 6 months ago

emmmm...私钥不对?可是我调用 CloseableHttpClient httpClient = WechatPayHttpClientBuilder.create() .withMerchant(mchId, mchSerialNo, merchantPrivateKey) .withValidator(response -> true).build();这个方法已经返回给我二维码并且成功支付了 应该不会是什么参数不对啊

jeff1ry commented 6 months ago

我这边重新请求了一下又正常了???? 而且是什么配置或者代码都没有动的情况下好的!!!!我不知道是什么原因导致的 这会是网络原因吗?而且我看issue好像有个人跟我报了差不多的报错.........这也太奇怪了

xy-peng commented 6 months ago

是比较奇怪。从日志看,你有多个商户 API 证书,配置文件和程序中是只有一张证书吗?

jeff1ry commented 6 months ago

是的 我敢肯定只有一个apiclient_key文件

jeff1ry commented 6 months ago

请问方便排查问题吗?我这里接入apiv3Native支付 现在时常出现这个问题,时好时坏的,有的时候二维码响应出来了,但是回调方法又拿不到证书序列号,导致有的客户充了钱 而我们平台没有给他充对应的钱 这个问题的影响对我们来说很大 期待回复

xy-peng commented 6 months ago

但是回调方法又拿不到证书序列号

请说得更具体一些。应答是正常的,这次是回调?拿不到证书序列号,是指报文中没有证书序列号,还是跟自动下载的证书对应不上?

最好还是把收到的回调的 HTTP 头和报文贴一下吧

jeff1ry commented 6 months ago

回调方法里我用到了.getSerialNumber去比对 image 但是遇到了401 下载平台证书序列号异常 image 而且 现在最离谱的是 当我401的时候 代码里所有的log.都打印不出来日志,但是当正常返回二维码链接的时候 log日志又正常 @slf4j和 LoggerFactory.getLogger都用了一样的

jeff1ry commented 6 months ago

image image 日志搜不到log的

xy-peng commented 6 months ago

这很难看出所以然。你是回调会出 401,还是应答也遇到了 401

你只需要往 certificateManager 添加一次商户的信息,而不用每次都 putMerchant。你可以试试。

我更建议你使用我们新的 Java SDK wechatpay-java ,文档会更完善。

jeff1ry commented 6 months ago

...现在请求二维码都不行了 在第一步生成httpclient都是401了 我改造一下新版的吧

xy-peng commented 6 months ago

另外,建议先检查下本地的商户 API 私钥,验证下它是不是跟商户 API 证书匹配的。验证两个点:

  1. 参考这里,检查商户 API 证书(apiclient_cert.pem)的证书序列号是不是跟在 serial_no 上送的一致
  2. 参考这里,检查商户 API 证书和私钥是匹配的
jeff1ry commented 6 months ago

image 还是不对 image 太奇葩了 我用openssl测试了 都是对的 两个点都验证成功了

xy-peng commented 6 months ago

必现还是偶发的?

你在商户平台上看看对应的商户 API 证书是否启用了,或者是否过期了

jeff1ry commented 6 months ago

偶发占多数 我请求10次可能有一两次能返回二维码可以正常扫码 但是剩下8次全是401

jeff1ry commented 6 months ago

image 这一句我不是很理解 那如果我把这个方法抽出来 回调NotificationConfig config这个对象也需要build 会重复报错吗?

jeff1ry commented 6 months ago

我大概找到问题了 好像是我的apiclient_key.pem文件 最后一行多了一句 空行 当我把空行删除后 没有出现了 现在正常了 image 第29行就是多的那一行

xy-peng commented 6 months ago

这一句我不是很理解 那如果我把这个方法抽出来 回调NotificationConfig config这个对象也需要build 会重复报错吗?

是在哪里看到的这句话?

jeff1ry commented 6 months ago

image 你们demo里这样写的

xy-peng commented 6 months ago

我大概找到问题了 好像是我的apiclient_key.pem文件 最后一行多了一句 空行 当我把空行删除后 没有出现了 现在正常了 !

在加载证书的时候,会去掉空格空行,怀疑是不是有不可见字符?你试试加回一个空行,看看是不是还是正常的。

jeff1ry commented 6 months ago

好的我测试一下 但是我从商户平台配合那个exe软件下载证书的时候 证书文件就自带了空格 我是直接复制的文件而不是字母

xy-peng commented 6 months ago

请问获取商户 API 证书拿到的原始压缩文件还在吗?

jeff1ry commented 6 months ago

还在的

jeff1ry commented 6 months ago

这边我测了一下 就是不行 当我最后+了空行后就会是401 我在想如果把证书里面的字母变成一个静态常量去读 而不是通过文件流去读 +不+空格会有影响吗?我想我可以去测试一下

xy-peng commented 6 months ago

还在的

原始文件就存在这个问题吗?你使用的 JDK 版本是?使用的是 windows 系统?感觉不大可能出现这种情况呀。

jeff1ry commented 6 months ago

对 原始文件就会出现 image 我先把原始文件放在config目录下 然后通过getPrivateKey方法复制给了new RSAAutoCertificateConfig.Builder().privateKey JDK是1.8的,我没有在windows上做测试,我用的是云服务器测试环境去测的,应该是centos7

jeff1ry commented 6 months ago

我这边测试了 当我把apiclient_key,pem 写成静态常量后也是正常的

xy-peng commented 6 months ago

我这边测试了 当我把apiclient_key,pem 写成静态常量后也是正常的

你把字符串的 privateKey 输出看看,是否各种情况下是一致?