收藏
回答

商家转账到零钱API的问题?

您好,请问一下商家转账到零钱是先通过接口/v3/certificates

取获取平台证书 ,然后用返回的证书签名吗? 返回的证书是-----BEGIN CERTIFICATE-----

不是私钥? 用这个证书签名提示Warning: openssl_sign(): supplied key param cannot be coerced into a private key



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

3 个回答

  • Memory
    Memory
    01-17

    平台证书是用于回调支付通知签名验证和敏感信息加密使用,不是用于支付接口请求签名计算,V3接口签名使用的是商户API证书https://kf.qq.com/faq/161222NneAJf161222U7fARv.html

    01-17
    有用 2
    回复 6
    • Toddy
      Toddy
      01-17
      Wechatpay-Serial 必填string 这个是发送加密以后的序列号吧。 不知道为什么签名一直提示错误的签名,验签失败.
      Array
      (
          [0] => Authorization: WECHATPAY2-SHA256-RSA2048 mchid="160***754",serial_no="750EAA77981D2**********CBD2AD9C",nonce_str="dE8pl8yxX***********aChrC7A=="
          [1] => Content-Type:application/json
          [2] => Accept:application/json
          [3] => User-Agent:*/*
          [4] => Wechatpay-Serial:RJmztJT*********V1/fQvlJriLdAa9HQ==
      )
      Array
      (
          [code] => SIGN_ERROR
          [detail] => Array
              (
                  [detail] => Array
                      (
                          [issue] => sign not match
                      )
                  [field] => signature
                  [location] => authorization
                  [sign_information] => Array
                      (
                          [method] => POST
                          [sign_message_length] => 882
                          [truncated_sign_message] => POST
      /v3/transfer/batches
      1705461388
      dE8pl8******NjbcBHQsSU2M
      --------
                          [url] => /v3/transfer/batches
                      )
              )
          [message] => 错误的签名,验签失败
      )
      01-17
      回复
    • Memory
      Memory
      01-17回复Toddy
      请求头序列号不加密
      01-17
      回复
    • Toddy
      Toddy
      01-17回复Memory
      非常感谢您的回复,

      Wechatpay-Serial
      必填
      string
      【微信支付平台证书序列号】 请求参数中的敏感字段,需要使用微信支付平台证书公钥加密。请设置为该证书的证书序列号。详见敏感信息加解密

      看文档是要求加密,不过加不加密都提示验签失败。Body参数也是要一起参与签名吧,像这样
             $pushdata = [
                  "appid" => $this->appid,
                  "out_batch_no" => $out_batch_no,
                  "batch_name" => $batch_name,
                  "batch_remark" => $batch_remark,
                  "total_amount" => $total_amount * 100,
                  "total_num" => $total_num,
                  "transfer_detail_list" => $transfer_detail_list
              ];

      $message = "GET\n$url\n$time\n$randstr\n$pushdata \n\n"
      01-17
      回复
    • Memory
      Memory
      发表于移动端
      01-17回复Toddy
      body一定要参与签名的,加密只是部分字段需要
      01-17
      回复
    • Toddy
      Toddy
      01-17
      我通过接口  /v3/certificates 获取证书,只获取到1个。 里面的证书序列号和商户支付的序列号不一至。有没有可能是这个问题导致验证不通过?
      01-17
      回复
    查看更多(1)
  • 北望沣渭
    北望沣渭
    01-17

    私钥是 apiclient_key.pem 那个文件

    01-17
    有用
    回复 3
    • Toddy
      Toddy
      01-17
      您好,
      $token = sprintf('mchid="%s",serial_no="%s",timestamp="%d",nonce_str="%s",signature="%s"', MCHID, SERIAL_NO, $timestamp, $nonce_str, $key);   

      $token 里面 SERIAL_NO证书是否和  'Wechatpay-Serial:' . SERIAL_NO 是同一个序列号? 还是 Wechatpay-Serial的序列号需要通过/v3/certificates 获取。
      01-17
      回复
    • 北望沣渭
      北望沣渭
      发表于移动端
      01-17回复Toddy
      请求签名头上的serialno来自商户证书文件apiclient_cert.pem
      01-17
      回复
    • Toddy
      Toddy
      01-17回复北望沣渭
      ":884,"truncated_sign_message":"POST\n/v3/transfer/batches\n1701494480\nBwHfTB26u9CdOAulkLiXZA5C11t1FndDS\n--------\n","url":"/  加调报的参数body是--------\n 这个body应该怎么传,序列化后再传也是这样显示,直接传BODY也是
      01-17
      回复
  • peng
    peng
    01-17

    签名使用到商户的证书在商户后台下载工具生成的。

    https://kf.qq.com/faq/161222NneAJf161222U7fARv.html

    https://pay.weixin.qq.com/docs/merchant/development/interface-rules/certificate-faqs.html

    01-17
    有用
    回复 2
    • Toddy
      Toddy
      01-17
      {
      "code": "SIGN_ERROR",
      -"detail": {
      -"detail": {
      "issue": "sign not match"
      },
      "field": "signature",
      "location": "authorization",
      -"sign_information": {
      "method": "POST",
      "sign_message_length": 542,
      "truncated_sign_message": "POST\n/v3/transfer/batches\n1705495397\nPdbGGB8HESlhfHovBSyOHMSPMsMpStYR\nappid=&o\n",
      "url": "/v3/transfer/batches"
      }
      },
      "message": "错误的签名,验签失败"
      }

      这个是什么 原因
      01-17
      回复
    • peng
      peng
      01-18回复Toddy
      我猜是这里,post数据格式是json,content-type设置成application/json
      01-18
      回复
登录 后发表内容