先说解决方法:使用官方SDK,同时一定要访问host(mch.weixin.qq.com),官网sdk会判断,如果是此host,会自动帮做签名,然后就成功了。
再说一下踩的坑:
我们使用了官方的sdk,官方sdk会先自动去下载平台证书,注意注意!平台证书不是你自己的证书!然后根据host签名后发送请求。
我们直接用nginx转发了微信退款的请求,结果从下载证书就一直提示验签失败,发现header里authorization为空,于是乎决定自己按规则自己做签名。
根据签名生成 - WechatPay-API-v3的指引,单元测试一跑,下载证书成功,但是退款请求迟迟不能验签通过,仔细比对官方指引,完全没有问题。搜索各处论坛没有答案。
最后仔细看代码,发现sdk里对apache的httpClient的封装,sdk判断访问host(mch.weixin.qq.com)时,会自动帮做签名。直接改成访问host,而非nginx的ip。成功!
比对了自己的签名和官方sdk签名的方式,一模一样,可是就是通不过,至今不明。不过能解决就好,网上还没看到此类文章,在此提出我自己的解决方法。