收藏
回答

Android app,微信支付签名验证失败

1, 我在服务端用python都wechatpy,pay.order.create()生成支付订单成功

2,我用下面代码,在服务端签名,然后把相关信息都发送到app

params = {
      "appId": my_env.WX_APP_ID,
      "timeStamp": str(int(time.time())),
      "nonceStr": str(uuid.uuid4()).replace("-", ""),
      "prepayId": order['prepay_id'], 
  }
  sign_str = f"{params['appId']}\n{params['timeStamp']}\n{params['nonceStr']}\n{params['prepayId']}\n"


  digest = SHA256.new(sign_str.encode('utf-8'))

  with open(str(my_env.WX_MCH_KEY), 'r') as ifile: # my_env.WX_MCH_KEY是我的私钥路径
      pkey = RSA.importKey(ifile.read())
  signer = pkcs1_15.new(pkey)

  sign_v = base64.b64encode(signer.sign(digest)).decode('utf-8')

3,我用签名工具,验证了签名是正确的

4,app端,在用下面的代码调起微信支付的时候,我核对了每一个参数,都是对的

val request = PayReq()
request.appId = appId
request.partnerId = partnerId
request.prepayId= prepayId
request.packageValue = "Sign=WXPay"
request.nonceStr = nonceStr
request.timeStamp= timeStamp
request.sign= sign

api.sendReq(request);

5,最后吊起了微信支付,但是提示签名验证失败。


备注: 我的app吊起微信登陆是OK的。


请帮忙看看是什么原因?

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

3 个回答

  • 支付社区运营
    支付社区运营
    06-30

    你好 请问问题是否已解决?若仍未解决 辛苦打印下调起参数用签名工具验下签名。调起时提示“支付签名验证失败”,是调起的签名有问题导致的。

    可以把调起的参数按文档参数规则以jsapi支付为例:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6,放到在线验签工具https://pay.weixin.qq.com/doc/v3/merchant/4012365352进行验签。验签通过的话,可以参数固定写死去前端调起。

    如果参数传递一致的话仍无法调起,检查下下单和调起的商户号对应apiclient_key.pem是否准确对应(如果是服务商模式调接口的话需要用服务商商户号的私钥apiclient_key.pem,不能用子商户的)

    06-30
    有用
    回复
  • mark
    mark
    06-19

    多谢回复!

    请问:你如何判断“调起支付参数和计算签名参数不一致”的?我的确是核对了这些参数值,是一致的。

    调起参数大小写和格式要求”,大小写,我也认真核对了。另外,如果大小写不对,编译会报错把。

    格式问题,除了packageValue = "Sign=WXPay",其他的都是具体值,有什么特殊格式要求吗?


    麻烦给些更详细的帮助,谢谢!

    06-19
    有用
    回复
  • Memory
    Memory
    06-19

    调起支付参数和计算签名参数不一致

    注意调起参数大小写和格式要求

    06-19
    有用
    回复 9
    • mark
      mark
      06-21
      多谢回复!
      请问:你如何判断“调起支付参数和计算签名参数不一致”的?我的确是核对了这些参数值,是一致的。
      “调起参数大小写和格式要求”,大小写,我也认真核对了。另外,如果大小写不对,编译会报错把。
      格式问题,除了packageValue = "Sign=WXPay",其他的都是具体值,有什么特殊格式要求吗?
      麻烦给些更详细的帮助,谢谢!
      06-21
      回复
    • Memory
      Memory
      06-22回复mark
      举个最简单的例子也是出错最多的,服务端计算时间戳和客户端调起使用的时间戳不一致,客户端没有直接使用服务端的数据
      06-22
      回复
    • Memory
      Memory
      06-22回复mark
      再举一个例子,客户端调起支付参数要求均为string,ios和安卓校验不一样,部分参数可能传了int在ios可行,但安卓通不过
      06-22
      回复
    • mark
      mark
      06-22
      我客户端使用的所有参数,都是服务端传过来的,并且都是string。
      06-22
      回复
    • Memory
      Memory
      发表于小程序端
      06-22回复mark

      如果全都对,也就不会报错了。。。最简单的验证方式就是前端写死参数去验证

      06-22
      回复
    查看更多(4)
登录 后发表内容