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

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的大小写等

12335 次点击
所在节点    程序员
39 条回复
6IbA2bj5ip3tK49j
2018-10-29 13:05:21 +08:00
ts 不是应该后端给吗?
cnit
2018-10-29 13:08:39 +08:00
时间戳 十位
cnit
2018-10-29 13:10:43 +08:00
断点看下是不是 ip 白名单的问题
ETiV
2018-10-29 13:22:44 +08:00
碰到过的坑:
单页应用,路由走的是 # Hash 锚点,会出问题
测试偶现,上线必现

换掉#,走 History API,然后签名拿当页完整 URL 签
pytth
2018-10-29 13:27:22 +08:00
看我写的吧,200 行代码实现微信支付-公众号支付,不再踩坑: https://segmentfault.com/a/1190000013051299
licoycn
2018-10-29 13:32:59 +08:00
@xgfan 公众号的时间戳是"当前的时间,其他详见时间戳规则" https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6
licoycn
2018-10-29 13:34:04 +08:00
@cnit 是 10 位的,IP 没有设置应该是没有限制
licoycn
2018-10-29 13:34:41 +08:00
@ETiV 是走的 History API,没有#
cnit
2018-10-29 13:34:53 +08:00
licoycn
2018-10-29 13:35:40 +08:00
@pytth 方法都是一样的,无异,主要是上周测试都是 Ok 的,这周就突然不行了,期间也没有改动代码
licoycn
2018-10-29 13:36:49 +08:00
@cnit 这个在之前已经完全看过一遍并检测了一遍,这里面所提到的都是没有问题的,但是就是会出现“支付验证签名失败”,还有一点就是上周测试都是 Ok 的,这周就突然不行了,期间也没有改动代码
lsongiu
2018-10-29 13:57:54 +08:00
中文乱码?
licoycn
2018-10-29 14:03:11 +08:00
@lsongiu 没有
sobigfish
2018-10-29 14:11:46 +08:00
"这周就突然不行了,期间也没有改动代码"
假设有版本控制吧,是完全没有 commit 还是 commit 没涉及到?
会不会是代码里控制符之类的被换过 crlf > cr 之类的
或者返回的 res 里有其他看不见的控制符
licoycn
2018-10-29 14:14:02 +08:00
@sobigfish 并没有,都是通过 SpringBoot 返回的 JavaBean 来自动映射的 JSON
tanranran
2018-10-29 14:28:33 +08:00
检查一下支付验证签名失败 中哪个参数失败了?
licoycn
2018-10-29 14:35:23 +08:00
@tanranran 毫无疑问 肯定是 paySign 这个参数和他们官方加密出来不同
liuzhedash
2018-10-29 14:48:22 +08:00
感觉是 timestamp 的问题,应当使用后端生成 paysign 时使用的 timestamp
WildCat
2018-10-29 14:52:12 +08:00
timeStamp 是后端你 sign 的时候的,不是你前端生成的。
licoycn
2018-10-29 14:55:16 +08:00
@liuzhedash
@WildCat 是的 已解决

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

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

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

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

© 2021 V2EX