收藏
回答

android支付验证验证签名失败

多个项目用的同一套支付逻辑,PayReq的sign参数统一用后台的,而当前的项目却提示验证签名失败;当我改成sign=“MD5”,却可以调起微信支付并成功,是SDK已经改逻辑了吗

回答关注问题邀请回答
收藏

21 个回答

  • 阿伟
    阿伟
    2021-02-18

    这微信支付文档真的是垃圾中的战斗机 ,如楼主所言,将sign改成MD5,居然能支付成功,你敢信?服了,折腾了好几个小时。原来是腾讯内部的bug。支付这么谨慎的事,居然还有这么大的问题。真的服了。

    2021-02-18
    有用 10
    回复
  • 宁金鹏
    宁金鹏
    2020-10-16

    确实改成 sign=“MD5” 支付成功

    2020-10-16
    有用 10
    回复 8
    • Cʜᴀɴɢᴇᴸᴼᵛᵉ
      Cʜᴀɴɢᴇᴸᴼᵛᵉ
      2020-11-17
      看下你调起支付的参数值,noncestr和timestamp这两个值也要用后台二次加签返回的,不要自己随机,还有让后台开发看下他两次加签参数值都传对了吗,认真核对,只要两次签名校验都通过就是参数值传错了,我们后台就是商户id值错了,就依旧提示签名错误,你的问题应该就解决了。
      2020-11-17
      1
      回复
    • 阿伟
      阿伟
      2021-02-18
      没用,就是本楼说的,改成md5就行了。签名都不要了。
      2021-02-18
      1
      回复
    • 懒猫的狮子倒影
      懒猫的狮子倒影
      2021-03-03
      调试了两天死活报“支付验证签名失败”,来来回回检查一点没问题,ios都可以调成功,直到看到楼主说的sign=“MD5”,直接成功,简直坑爹啊
      2021-03-03
      1
      回复
    • 杰灵
      杰灵
      2021-07-20
      太坑 了啊
      2021-07-20
      回复
    • Luck
      Luck
      2021-10-14
      在哪里改,我也是这个报错,始终找不到原因
      2021-10-14
      回复
    查看更多(3)
  • free
    free
    2021-06-01

    辛亏在网上搜了一下,看到了楼主的解决方案。如果相信微信的官方文档一个一个调试的话,就是傻X了。。。

    2021-06-01
    有用 4
    回复
  • gg
    gg
    2021-01-28

    确实解决了问题,不得不说官方文档和服务太差

    2021-01-28
    有用 4
    回复
  • Wang
    Wang
    2020-12-10

    微信就是国内开发者的毒瘤

    我就没见过错误日志报的这么屎的

    2020-12-10
    有用 4
    回复
  • Sunset
    Sunset
    2021-04-09

    sign这个参数写123都行,这是神马操作?

    

    2021-04-09
    有用 3
    回复 4
    • 🙈 🙉 🙊
      🙈 🙉 🙊
      2021-06-09
      惊了,还真是
      2021-06-09
      回复
    • 子非鱼
      子非鱼
      2021-06-10
      都是字符串,瞎写都可以,就是签名不行,什么鬼啊
      2021-06-10
      2
      回复
    • Hello World
      Hello World
      2021-07-07
      还真的可以,NB plus
      2021-07-07
      回复
    • 撸码客
      撸码客
      2021-07-23
      他们怕是把if条件写反了……
      2021-07-23
      回复
  • 微信支付技术助手8
    微信支付技术助手8
    2020-09-21

    请按照以下几点进行排查:

    1、使用签名检查工具(https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=20_1)校验签名算法是否有误

    2、确认秘钥是否有误(服务商模式使用服务商商户号秘钥,秘钥是在商户平台配置,如果同一商户号调用其它接口成功可排除是秘钥问题)

    3、确认接口实际的请求参数与生成签名原串的参数一致,不能增加或缺少参数(可通过打印签名原串进行排查)

    4、确认参数的大小写,参数名与接口文档一致

    5、签名原串的参数值使用原始值,不需要encode

    6、接口需要使用UTF-8编码

    2020-09-21
    有用 3
    回复 12
    • 吖吖
      吖吖
      2020-09-21
      那为什么改成sign=“MD5”就可以成功
      2020-09-21
      3
      回复
    • féng kǎi
      féng kǎi
      2021-03-29回复吖吖
      不要问为什么,我和后台同事调了一整天,最后改成MD5就可以了,我们一致认为,微信的SDK都涉及到玄学问题。
      2021-03-29
      2
      回复
    • 谢亮
      谢亮
      2021-07-27
      还真的是,只要不是正确的签名就可以,错误的反而支付成功,希望微信关注这个BUG,现在都2021年7月27了,这个BUG还在
      2021-07-27
      回复
    • 箜篌
      箜篌
      2021-07-29
      不二次签名吗?直接固定sign:MD5就可以了?弄了半天真服了,什么狗屎
      2021-07-29
      回复
    • Tooler
      Tooler
      2021-09-03回复箜篌
      2021.09.03这个改成md5就行了这个bug还在
      2021-09-03
      2
      回复
    查看更多(7)
  • 󠀀
    󠀀
    2021-12-23

    根据楼主的提示解决了这个问题

    服务器返回的数据(示例所用假数据,仅为参考):

    {
     "package": "Sign=WXPay",
     "appid": "wx73875835749357527389472",
     "sign": "ba333378493jrsekay8934y4hffdsajkgjsalf",
     "partinerid": "16237873492",
     "prepayid": "wx232328427952243ewi8979fsafsadgs",
     "return_code": "SUCCESS",
     "noncestr": "U2VQOIYFKb7jJGKF",
     "timestamp": "16400252100"
    }
    


    前端可将sign的值改为md5

    如下:

    {
     "package": "Sign=WXPay",
     "appid": "wx73875835749357527389472",
     "sign": "md5",
     "partinerid": "16237873492",
     "prepayid": "wx232328427952243ewi8979fsafsadgs",
     "return_code": "SUCCESS",
     "noncestr": "U2VQOIYFKb7jJGKF",
     "timestamp": "16400252100"
    }
    


    不建议后端改,因为iOS端需要用到这个正确的签名

    做过如下尝试:

    wechatpay.sign = "我们爱你我的中国多么美丽"; // 不可行
    wechatpay.sign = "我们爱你我的"; // 可行
    wechatpay.sign = "我们爱你我的中国多"; // 可行
    wechatpay.sign = "我们爱你我的中国多么美"; // 不可行
    wechatpay.sign = "我们爱你我的中国多么"; // 可行
    wechatpay.sign = "我们爱你我的中国多么a"; // 可行
    wechatpay.sign = ""; // 不可行,APP内报错
    wechatpay.sign = "a"; // 可行
    wechatpay.sign = "abcdefghijklmnopqestuvwxyz12345"; // 可行
    wechatpay.sign = "abcdefghijklmnopqestuvwxyz123456"; // 不可行
    


    可以看出一些端倪,只要sign的值所占字节数小于32即可,一个汉字在utf-8编码下,所占正是3个字节,而一个字母,所占字节数为1。

    正确的sign值为什么不能通过,因为正确的sign值字节刚刚好是32

    微信不修复此bug的原因,可能是因为,一旦修复,会导致大量的用户的支付功能出现异常,搞不好会出个大事。比较困惑的是,文档居然也不说这个事情。

    玄之又玄,众妙之门

    以上仅为个人猜测。


    2021-12-23
    有用 2
    回复 2
    • 八九🐈
      八九🐈
      2021-12-24
      人才
      2021-12-24
      回复
    • 󠀀
      󠀀
      01-13
      上面说iOS端需要用到正确的签名,对不起,我说错了。iOS端也一样,这个sign值随便填,只要不大于32就好。
      01-13
      回复
  • 假装一个桌子💺
    假装一个桌子💺
    2021-06-06

    sign = ”MD5“

    真是无语+1


    简直了……

    2021-06-06
    有用 2
    回复
  • 撸码客
    撸码客
    2021-07-23

    简直是救命一般的帖子 谁能想到费心费力的算出签名就不行 随便写点啥就能支付 你们怕是把if条件写反了吧……

    2021-07-23
    有用 1
    回复

正在加载...

登录 后发表内容
问题标签