V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
licoycn
V2EX  ›  程序员

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

  •  
  •   licoycn ·
    Licoy · Oct 29, 2018 · 12906 views
    This topic created in 2744 days ago, the information mentioned may be changed or developed.

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

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

    Supplement 1  ·  Oct 29, 2018
    已解决,前端拉起支付时候的 timeStamp 需要与后端返回的的 timeStamp 是同一个(注:我的签名那些信息都是在后端进行的,所以说所以需要与你最后一次签名的时间一致)
    Supplement 2  ·  Oct 29, 2018
    不得不说微信的文档真实让人看着头疼
    39 replies    2018-12-17 17:52:09 +08:00
    6IbA2bj5ip3tK49j
        1
    6IbA2bj5ip3tK49j  
       Oct 29, 2018 via iPhone
    ts 不是应该后端给吗?
    cnit
        2
    cnit  
       Oct 29, 2018
    时间戳 十位
    cnit
        3
    cnit  
       Oct 29, 2018
    断点看下是不是 ip 白名单的问题
    ETiV
        4
    ETiV  
       Oct 29, 2018 via iPhone
    碰到过的坑:
    单页应用,路由走的是 # Hash 锚点,会出问题
    测试偶现,上线必现

    换掉#,走 History API,然后签名拿当页完整 URL 签
    liKeYunKeji
        5
    liKeYunKeji  
       Oct 29, 2018
    看我写的吧,200 行代码实现微信支付-公众号支付,不再踩坑: https://segmentfault.com/a/1190000013051299
    licoycn
        6
    licoycn  
    OP
       Oct 29, 2018
    @xgfan 公众号的时间戳是"当前的时间,其他详见时间戳规则" https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6
    licoycn
        7
    licoycn  
    OP
       Oct 29, 2018
    @cnit 是 10 位的,IP 没有设置应该是没有限制
    licoycn
        8
    licoycn  
    OP
       Oct 29, 2018
    @ETiV 是走的 History API,没有#
    licoycn
        10
    licoycn  
    OP
       Oct 29, 2018
    @pytth 方法都是一样的,无异,主要是上周测试都是 Ok 的,这周就突然不行了,期间也没有改动代码
    licoycn
        11
    licoycn  
    OP
       Oct 29, 2018
    @cnit 这个在之前已经完全看过一遍并检测了一遍,这里面所提到的都是没有问题的,但是就是会出现“支付验证签名失败”,还有一点就是上周测试都是 Ok 的,这周就突然不行了,期间也没有改动代码
    lsongiu
        12
    lsongiu  
       Oct 29, 2018
    中文乱码?
    licoycn
        13
    licoycn  
    OP
       Oct 29, 2018
    @lsongiu 没有
    run2
        14
    run2  
       Oct 29, 2018
    "这周就突然不行了,期间也没有改动代码"
    假设有版本控制吧,是完全没有 commit 还是 commit 没涉及到?
    会不会是代码里控制符之类的被换过 crlf > cr 之类的
    或者返回的 res 里有其他看不见的控制符
    licoycn
        15
    licoycn  
    OP
       Oct 29, 2018
    @sobigfish 并没有,都是通过 SpringBoot 返回的 JavaBean 来自动映射的 JSON
    ByteRan
        16
    ByteRan  
       Oct 29, 2018
    检查一下支付验证签名失败 中哪个参数失败了?
    licoycn
        17
    licoycn  
    OP
       Oct 29, 2018
    @tanranran 毫无疑问 肯定是 paySign 这个参数和他们官方加密出来不同
    liuzhedash
        18
    liuzhedash  
       Oct 29, 2018
    感觉是 timestamp 的问题,应当使用后端生成 paysign 时使用的 timestamp
    WildCat
        19
    WildCat  
       Oct 29, 2018
    timeStamp 是后端你 sign 的时候的,不是你前端生成的。
    licoycn
        20
    licoycn  
    OP
       Oct 29, 2018
    @liuzhedash
    @WildCat 是的 已解决
    WildCat
        21
    WildCat  
       Oct 29, 2018
    我觉得微信支付这块的坑,我都可以写一篇文章总结了,微信的文档狗屎都不如。
    liuzhedash
        22
    liuzhedash  
       Oct 29, 2018   ❤️ 1
    @WildCat #21
    是的,微信的开发文档非常傲慢
    zhangwugui
        23
    zhangwugui  
       Oct 29, 2018
    微信支付的接口经常会调整,但也不通知开发者,文档这块很坑。
    zhangwugui
        24
    zhangwugui  
       Oct 29, 2018
    完全不像大公司应有的模样。
    WildCat
        25
    WildCat  
       Oct 29, 2018
    @liuzhedash 不仅仅是傲慢,而且不完整,感觉微信的前端是初中毕业水平。

    1. 支付接口有 2 个,一个是你用的 JSBridge,一个是微信网页 js sdk,这块对比没有说
    2. js sdk 的返回值只有 success 的回调,坑死了
    3. 两个接口的 timestamp 拼写不一致
    4. sandbox 无法用来调试,只能线上肉测
    licoycn
        26
    licoycn  
    OP
       Oct 29, 2018
    @WildCat 对的
    landi
        27
    landi  
       Oct 29, 2018
    想问下支付功能用的是企业账号吗,还是个体户。
    licoycn
        28
    licoycn  
    OP
       Oct 29, 2018   ❤️ 1
    @landi 企业认证
    WildCat
        29
    WildCat  
       Oct 29, 2018
    Batmand
        30
    Batmand  
       Oct 29, 2018
    看到大家说微信的支付文档坑我就放心了,刚踩过坑的路过
    Batmand
        31
    Batmand  
       Oct 29, 2018
    @WildCat 我也是好奇微信支付两个不同的 JS 支付功能有什么区别
    licoycn
        32
    licoycn  
    OP
       Oct 29, 2018
    @Batmand 是不同的两个文件,一个是需要引入 js-sdk,另外一个就是微信浏览器的内置对象
    yyhuaisha
        33
    yyhuaisha  
       Dec 14, 2018
    @lico “ timeStamp 需要与后端返回的的 timeStamp 是同一个”
    但是现在的后端统一下单是不需要 timeStamp 的,请问一下你是怎么解决的?后端的 timeStamp 在统一下单的时候要传给微信吗还是在其他地方传?要传的话是传什么格式的? 10 位数字还是字符串?
    licoycn
        34
    licoycn  
    OP
       Dec 14, 2018
    @yyhuaisha 不要了吗
    yyhuaisha
        35
    yyhuaisha  
       Dec 14, 2018
    @licoycn 我看到文档是不需要的,我不知道你是在哪里传的哦,可以告知一下吗
    yyhuaisha
        36
    yyhuaisha  
       Dec 14, 2018
    因为我这里一直提示“支付验证签名失败”,排查了好多问题都没找到办法。
    yyhuaisha
        37
    yyhuaisha  
       Dec 14, 2018
    yyhuaisha
        38
    yyhuaisha  
       Dec 17, 2018
    查了两天资料终于看到了一点希望。
    这里的传到微信的签名不是统一下单获取的签名,而是 将 appId,timeStamp,nonceStr, package,signType 这五个参数 用签名方法去微信生成一个新的签名,然后再传给前端。所以 timeStamp 不是指的统一下单需要用到时间戳,而是 二次签名的时候要用到。这就解释了为何网上的例子 timeStamp 等参数都是后端传过来的,而不是前端自己生成的原因了。
    希望这个巨坑微信 api 可以备注一下。也希望这个回答对其他开发者有点帮助吧……
    licoycn
        39
    licoycn  
    OP
       Dec 17, 2018
    @yyhuaisha 是这样的,验签名的参数都要从后端传递过来
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   819 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 65ms · UTC 19:28 · PVG 03:28 · LAX 12:28 · JFK 15:28
    ♥ Do have faith in what you're doing.