签名算法#
- 移除 pay_md5sign 与 sign。
- 对选定的字段名升序排序。
- 排除 PHP empty() 判定为空的值,包括字符串 "0"。
- 以 name=value& 拼接原始值,末尾追加 key=商户APIKEY。
- 计算 MD5,并将结果转为大写。
参与签名的字段范围#
| 接口 | 字段范围 |
|---|---|
Collection create | pay_memberid, pay_orderid, pay_amount, pay_applydate, pay_bankcode, pay_notifyurl, pay_callbackurl |
Collection query | pay_memberid, pay_orderid |
Payout create | 实际提交的非空表单字段,排除 pay_md5sign |
Payout query | mchid, out_trade_no |
Balance query | 通常为 mchid;巴西须签入实际发送的所有非空 POST 字段 |
Collection callback | memberid, orderid, transaction_id, amount, datetime, returncode |
Payout callback | 实际通知字段,排除 sign |
PHP 参考实现#
PHP · Source-defined algorithm
function makeSign($params, $apiKey) {
unset($params['pay_md5sign'], $params['sign']);
ksort($params);
$source = '';
foreach ($params as $name => $value) {
if (!empty($value)) {
$source .= $name . '=' . $value . '&';
}
}
return strtoupper(md5($source . 'key=' . $apiKey));
}避免常见不一致#
- 先用原始值签名,传输时再做表单编码。
- 保持金额原始字符串一致,100.00 和 100 的签名输入不同。
- 代收下单不要将 type、商品字段加入签名;代收通知的 attach 不参与验签。
- 响应验签时先移除 sign 字段。