收藏
回答

php 微信添加分账接收方-验证签名失败

调用微信添加分账接收方接口-https://api.mch.weixin.qq.com/pay/profitsharingaddreceiver

该接口根据开发文档提示(https://pay.weixin.qq.com/wiki/doc/api/allocation_sl.php?chapter=25_3&index=4)需要使用HMAC-SHA256来签名。故使用<2>的方式来签名,但是调用接口后一直报以下错误

     "err_code": "SIGN_ERROR",

     "err_code_des": "验证签名失败"

想问下有可能是哪里的错误。

PS.调用统一下带接口时,用<1>MD5方式签名,统一支付接口调用正常,没有验证签名失败错误。所以使用的key等参数是和MD5时一样的。


     $url = "https://api.mch.weixin.qq.com/pay/profitsharingaddreceiver";

     $onoce_str = $this->getRandChar(32);

     $receiver  = '{"type":"MERCHANT_ID", "account":"XXXXXX", "name":"XXXX", "relation_type":"STORE_OWNER"}';


     $data["mch_id"]     = "1502888888";    //服务商号

    $data["sub_mch_id"] = "1536888888"; // 特约商户

    $data["appid"]      = $config_value['appid'];

    $data["nonce_str"]  = $onoce_str;

     $s = $this->getSignSha256($data, false); //  签名部分参考<2>

     $data["sign"] = $s;

//$data["sign_type"]  = "HMAC-SHA256"; // 这一行加或不加结构都一样,还是"验证签名失败"

    $data["receiver"]   = $receiver;  // 这个参数放到$s = $this->getSignSha256($data, false);这一行前面的话结果也是一样,还是"验证签名失败"


    $xml = $this->arrayToXml($data);

    $response = $this->postXmlCurl($xml, $url);


<1>getSign【MD5加密签名获取代码】

     foreach ($Obj as $k => $v) {

    $Parameters[strtolower($k)] = $v;

    }

    // 签名步骤一:按字典序排序参数

    ksort($Parameters);

    $String = $this->formatBizQueryParaMap($Parameters, false);

     $key = $config_value['key'];

     // 签名步骤二:在string后加入KEY

      $String = $String . "&key=" .  $key;

     // 签名步骤三:MD5加密

    $result_ = strtoupper(md5($String));


<2>getSignSha256 【HMAC-SHA256加密签名获取代码】

     foreach ($Obj as $k => $v) {

    $Parameters[strtolower($k)] = $v;

    }

    // 签名步骤一:按字典序排序参数

    ksort($Parameters);

    $String = $this->formatBizQueryParaMap($Parameters, false);

     $key = $config_value['key'];

     // 签名步骤二:在string后加入KEY

      $String = $String . "&key=" .  $key;

     // 签名步骤三:sha256加密

$result_ = strtoupper(hash_hmac("sha256", $String, $key));


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

2 个回答

  • 微信支付技术助手4
    微信支付技术助手4
    2019-05-30

    1) 使用微信的在线签名工具检查签名是否和程序生成的一致

    https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=20_1 签名工具用谷歌打开。

    选择MD5,XML,然后把请求参数xml放进去,就能校验签名

    2)如果和微信的在线签名工具一致,说明程序没有错误,确定是API密钥错误(被别人改动或者记错了)

    在商户平台的账户信息中更改API密钥(账户设置-安全设置-API安全), 15分钟后生效

    2.1)统一下单用的是A商户号,也必须是A商户号登陆商户平台设置key才对。

    2.2)要注意统一下单请求参数中total_fee参数的类型是int类型。

    3) 如果和微信的在线签名工具不一致,说明程序有错误,常见的错误可能是:

    3.1) 编码问题,确保所有的都是utf-8的. 如果有中文, 可以先把中文改成英文重新签名,看是否签名错误,如果英文不会错中文才会错,基本肯定是编码问题

    3.2:)消息中字段大小写和文档中完全一致

    4 统一下单和调起支付签名类型需要一致。

    5)参数的类型和格式,长度限制需要完全符合文档的要求

    2019-05-30
    赞同
    回复
  • 💪T^T℡
    💪T^T℡
    2019-08-14

    分账的难道就没有程序例子可以参考吗?

    2019-08-14
    赞同
    回复
登录 后发表内容