商户回调签名规则
支付订单状态变更后,平台向下单时传入的 notify_url 发起 HTTP 回调请求。
请求格式
- 方法:
POST - 地址:订单的
notify_url - 超时:10 秒
请求头:
请求体:
| 字段 | 类型 | 说明 |
|---|---|---|
merchant_key |
string | 商户标识 |
data |
string | 回调业务参数 JSON 的小写十六进制编码 |
timestamp |
int64 | 平台发起回调时的 Unix 秒级时间戳 |
sign |
string | 回调签名,小写 MD5 字符串 |
{
"merchant_key": "YOUR_MERCHANT_KEY",
"data": "7b226f726465725f6e6f223a224d5049313233343536373839222c226d63685f6f726465725f6e6f223a225049323032363037303130303031222c22616d6f756e74223a223130302e3530222c2261637475616c5f616d6f756e74223a223130302e3530222c22666565223a22312e3530222c22737461747573223a327d",
"timestamp": 1782864000,
"sign": "SIGNATURE_LOWERCASE_MD5"
}
验证签名
- 按以下顺序直接拼接签名原文,不添加分隔符:
- 对签名原文计算 MD5,并将摘要转为小写十六进制字符串。
- 将计算结果与请求中的
sign进行比较。 - 签名通过后,将
data从十六进制解码为 UTF-8 JSON。
伪代码:
sign_text = data + timestamp + merchant_secret
expected_sign = lowercase_hex(md5(sign_text))
valid = expected_sign == sign
business_data = json_decode(utf8(hex_decode(data)))
注意:
- 回调签名不包含
version。 data使用小写十六进制;验签时必须使用请求中完全相同的data字符串。timestamp使用秒,不是毫秒。
接收方响应
处理成功后必须返回:
响应体必须是精确的纯文本 success,区分大小写,不能包含 JSON、引号、空格或换行。
以下任一情况都会被判定为回调失败:
- 请求超时或网络错误。
- HTTP 状态码不是
200。 - 响应体不是精确的
success。
回调失败后,平台按 5、10、30、60、120 分钟的间隔重试。达到重试次数上限后停止系统自动重试。