wechatpay-apiv3 / wechatpay-guzzle-middleware

微信支付 APIv3 Guzzle HTTP Client中间件(middleware)
Apache License 2.0
209 stars 46 forks source link

应答的微信支付签名验证失败 #40

Closed c88667220 closed 3 years ago

c88667220 commented 3 years ago

应答的微信支付签名验证失败 但是有显示:prepay_id

c88667220 commented 3 years ago

呼叫大神

TheNorthMemory commented 3 years ago

需要先下载平台证书,源码包内有个工具用来下载平台证书

c88667220 commented 3 years ago

要用工具下载?这个不怎么人性化吧 我做三方平台的,那些用户不见得会下载这些东西,那意味着我得来个用户就要搞一遍这个?

xy-peng commented 3 years ago

是可以简化一点,java库实现了sdk内自动下载平台证书的

f2h2h1 commented 3 years ago

可以运行这样一条命令来下载证书

php vendor/wechatpay/wechatpay-guzzle-middleware/tool/CertificateDownloader.php -k APIv3密钥 -m 商户号 -f 私钥路径 -s 商户API证书序列号 -o 下载平台证书的保存目录
TheNorthMemory commented 3 years ago

是可以简化一点,java库实现了sdk内自动下载平台证书的

在单体应用上,可以把下载平台证书做进类库逻辑里;不过,不建议这么做,分布式、多点负载的时候,这个下载逻辑其实就显得冗余了。建议是把下载证书单独做成服务,其他负载都只读使用,这样扩缩容就简单得多了(如容器及k8s scale replicas就可以用无状态deployment做了)

xy-peng commented 3 years ago

在单体应用上,可以把下载平台证书做进类库逻辑里;不过,不建议这么做,分布式、多点负载的时候,这个下载逻辑其实就显得冗余了。建议是把下载证书单独做成服务,其他负载都只读使用,这样扩缩容就简单得多了(如容器及k8s scale replicas就可以用无状态deployment做了)

说得没错。更建议把签名/验签/加密/解密的能力做成服务独立部署保护起来(注意不要单点保证可用性),不要把敏感的信息扩散到业务服务器上去了。

从实现上来说,java版的validator是初始化client时注册进去的,默认是本地证书版的😊 也可以选择自动获取证书的validator。甚至可以参考接口写一个新的validator做进去。

zhimma commented 3 years ago

我是用这个方法解决的 https://developers.weixin.qq.com/community/pay/doc/0006c092f10418281c5998b9256400