调用微信添加分账接收方接口-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));
我这 “添加分账接收方” 添加后 返回 白屏 也不知道是成功了还是失败了?😅
分账的难道就没有程序例子可以参考吗?
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)参数的类型和格式,长度限制需要完全符合文档的要求