收藏
回答

商家转账验签问题?

在开发商家转账到零钱的功能时,使用免确认收款授权(/v3/fund-app/mch-transfer/user-confirm-authorization)请求时一直会返回401 SIGN_ERROR(错误的签名,验签失败)的提醒,但是通过提供的工具验签是正确的,现在也不知道到底错在哪里

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

2 个回答

  • 支付社区运营
    支付社区运营
    星期一 11:01

    **1. 确认使用了正确的商户API私钥**

    - 必须使用 `apiclient_key.pem`(商户API私钥),而非 `apiclient_cert.pem`(商户API证书)或 `wechatpay.pem`(平台证书公钥)

    - 如果是服务商模式,需使用服务商的商户API私钥,而非子商户的


    **2. 确认私钥、商户号、证书序列号三者一一对应**

    - 用 `openssl x509 -in apiclient_cert.pem -noout -serial` 查看证书序列号,确认与 Authorization 头中的 `serial_no` 一致

    - 用 `openssl x509 -in apiclient_cert.pem -noout -text | grep -o 'CN=[0-9]*' | sed 's/CN=//'` 查看证书对应的商户号,确认与 Authorization 头中的 `mchid` 一致


    **3. 确认 Authorization 头中的 nonce_str 和 timestamp 与签名计算时使用的值一致**

    - 计算签名时传入的时间戳和随机串,必须与 HTTP Authorization 头中传递的值完全相同


    **4. 检查签名串构造格式**

    - 签名串拼接规则:`HTTP方法\nURL路径\n时间戳\n随机串\n请求体\n`,每行以换行符 `\n` 结尾

    - HTTP 方法必须大写(`POST`,而非 `post`)

    - URL 路径不带域名,格式为 `/v3/fund-app/mch-transfer/user-confirm-authorization`,而非 `https://api.mch.weixin.qq.com/v3/...`

    - URL 路径中不要出现多余的 `/`(如 `//v3/...`)

    - `\n` 是换行符,不是两个字符;POST 请求第5行为请求体,GET 请求第5行为空行+换行符


    **5. 检查 Authorization 头格式**

    - 整个 Authorization 值必须在**一行**内,不能有换行

    - 认证类型为 `WECHATPAY2-SHA256-RSA2048`

    - 参数值用**双引号**包裹,不是单引号

    - 所有符号必须是英文符号,参数之间不要有空格


    **6. 检查系统时间**

    - Authorization 头中的 timestamp 与发起请求的时间不得超过 5 分钟,请确认服务器系统时间准确


    **7. 排除代码转义问题**

    - 如果以上均确认无误,可能是代码对签名串做了额外转义。可用官方文档中的示例密钥和请求计算签名,对比结果是否一致


    星期一 11:01
    有用
    回复
  • Memory (私信不回复)
    Memory (私信不回复)
    星期五 21:23

    贴代码

    星期五 21:23
    有用 1
    回复 3
    • Ethan
      Ethan
      星期日 22:46
      要哪一部分的  完整代码还挺多的
      星期日 22:46
      回复
    • Ethan
      Ethan
      星期日 22:54
      核心的代码如图  以及错误消息
      星期日 22:54
      回复
    • Ethan
      Ethan
      星期日 23:10
      再一次修改了签名  再最后加了\n 之后可以使用了
      星期日 23:10
      1
      回复
登录 后发表内容