回调验签
支付成功后的异步通知字段、两种签名算法与响应约定。
触发时机
支付成功后,平台会向建单时传入的 callback_url 发送 POST 异步通知。
回调字段
| 字段 | 说明 |
|---|---|
reference | 商户订单号(客户交易 id) |
transaction_id | 平台交易号 |
amount | 订单金额(法币) |
token | 支付代币 |
network | 支付网络 |
amount_due | 实际到账数量 |
transaction_hash | 链上交易哈希 |
status | 2 = 支付成功 |
signature | 签名(Alsopay 用 HMAC-SHA256,EPay 用 MD5) |
验签
- 取出除
signature(EPay 为sign)外的全部参数 - 按键名 ASCII 升序排序,拼接为
key1=value1&key2=value2... - Alsopay 通知:
hex(HMAC-SHA256(拼接串, secret_key)),小写 - EPay 通知:
md5(拼接串 + secret_key),小写
function verifyNotify(params, secretKey, useMd5 = false) {
const signature = params.signature ?? params.sign
const sorted = Object.keys(params)
.filter((k) => k !== 'signature' && k !== 'sign')
.sort()
.map((k) => k + '=' + params[k])
.join('&')
if (useMd5) {
return crypto.createHash('md5').update(sorted + secretKey).digest('hex') === signature
}
return crypto.createHmac('sha256', secretKey).update(sorted).digest('hex') === signature
}
响应约定
- 先验签,再修改订单状态;验签不通过直接忽略该请求
- 建议同步返回字符串
{"status":"success"}表示接收成功 - 未按约定响应时,平台会按配置重试;重试与人工处理记录可在平台运维视图中查看
注意事项
- 回调是服务端到服务端,不受浏览器跨域限制
secret_key只能保存在你的服务端,切勿下发到前端- 同一个
transaction_id可能收到重复通知,业务侧请做幂等处理
