微信公众号支付一直“支付验证签名失败”

2018-10-29 12:16:08 +08:00
 licoycn

上周做了微信支付的公众号支付,在上周的测试的时候 10 次可能会出现一两次“支付验证签名失败”,但是这周来了测试每次都是“支付验证签名失败”,下方是调用微信的WeixinJSBridge传递的数据体 具体的前端调用代码是:

let wxPayData = {
    "appId":res.appId, 
    "timeStamp":Math.round(new Date().getTime()/1000).toString(),  
    "nonceStr":res.nonceStr,  
    "package":res.packageValue,     
    "signType":res.signType,
    "paySign":res.paySign
}
WeixinJSBridge.invoke('getBrandWCPayRequest',wxPayData ,(res)=>{
    if(res.err_msg == "get_brand_wcpay_request:ok" ){
        this.getPayStatus(data.id)
    }else if(res.err_msg == "get_brand_wcpay_request:cancel" ){
        this.$dialog.alert({
            message: "您取消了支付,请重新支付",
            className:"tc"
        }).then(() => {});
    }else if(res.err_msg == "get_brand_wcpay_request:fail" ){
        this.$dialog.alert({
            message: "支付失败,请重新支付",
            className:"tc"
        }).then(() => {});
    }else{
        this.getPayStatus(data.id)
    }
});

后端采用的是weixin-java-pay,其 dependency 是:

<dependency>
   <groupId>com.github.binarywang</groupId>
   <artifactId>weixin-java-pay</artifactId>
   <version>3.2.0</version>
</dependency>

而且后端调用微信统一下单接口一切都是正常,无任何异常抛出。

所以想问问有没有朋友遇到过或者有好的解决方案?已知坑timeStamp的大小写等

12368 次点击
所在节点    程序员
39 条回复
WildCat
2018-10-29 14:56:28 +08:00
我觉得微信支付这块的坑,我都可以写一篇文章总结了,微信的文档狗屎都不如。
liuzhedash
2018-10-29 15:00:12 +08:00
@WildCat #21
是的,微信的开发文档非常傲慢
zhangwugui
2018-10-29 15:01:27 +08:00
微信支付的接口经常会调整,但也不通知开发者,文档这块很坑。
zhangwugui
2018-10-29 15:01:46 +08:00
完全不像大公司应有的模样。
WildCat
2018-10-29 15:04:45 +08:00
@liuzhedash 不仅仅是傲慢,而且不完整,感觉微信的前端是初中毕业水平。

1. 支付接口有 2 个,一个是你用的 JSBridge,一个是微信网页 js sdk,这块对比没有说
2. js sdk 的返回值只有 success 的回调,坑死了
3. 两个接口的 timestamp 拼写不一致
4. sandbox 无法用来调试,只能线上肉测
licoycn
2018-10-29 16:22:35 +08:00
@WildCat 对的
landi
2018-10-29 16:25:30 +08:00
想问下支付功能用的是企业账号吗,还是个体户。
licoycn
2018-10-29 16:28:33 +08:00
@landi 企业认证
WildCat
2018-10-29 16:49:35 +08:00
Batmand
2018-10-29 17:02:06 +08:00
看到大家说微信的支付文档坑我就放心了,刚踩过坑的路过
Batmand
2018-10-29 17:03:06 +08:00
@WildCat 我也是好奇微信支付两个不同的 JS 支付功能有什么区别
licoycn
2018-10-29 17:06:36 +08:00
@Batmand 是不同的两个文件,一个是需要引入 js-sdk,另外一个就是微信浏览器的内置对象
yyhuaisha
2018-12-14 10:47:29 +08:00
@lico “ timeStamp 需要与后端返回的的 timeStamp 是同一个”
但是现在的后端统一下单是不需要 timeStamp 的,请问一下你是怎么解决的?后端的 timeStamp 在统一下单的时候要传给微信吗还是在其他地方传?要传的话是传什么格式的? 10 位数字还是字符串?
licoycn
2018-12-14 13:33:24 +08:00
@yyhuaisha 不要了吗
yyhuaisha
2018-12-14 14:23:04 +08:00
@licoycn 我看到文档是不需要的,我不知道你是在哪里传的哦,可以告知一下吗
yyhuaisha
2018-12-14 14:23:38 +08:00
因为我这里一直提示“支付验证签名失败”,排查了好多问题都没找到办法。
yyhuaisha
2018-12-14 14:24:26 +08:00
yyhuaisha
2018-12-17 15:59:27 +08:00
查了两天资料终于看到了一点希望。
这里的传到微信的签名不是统一下单获取的签名,而是 将 appId,timeStamp,nonceStr, package,signType 这五个参数 用签名方法去微信生成一个新的签名,然后再传给前端。所以 timeStamp 不是指的统一下单需要用到时间戳,而是 二次签名的时候要用到。这就解释了为何网上的例子 timeStamp 等参数都是后端传过来的,而不是前端自己生成的原因了。
希望这个巨坑微信 api 可以备注一下。也希望这个回答对其他开发者有点帮助吧……
licoycn
2018-12-17 17:52:09 +08:00
@yyhuaisha 是这样的,验签名的参数都要从后端传递过来

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/502125

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX