回调验签

支付成功后的异步通知字段、两种签名算法与响应约定。

触发时机

支付成功后,平台会向建单时传入的 callback_url 发送 POST 异步通知。

回调字段

字段说明
reference商户订单号(客户交易 id)
transaction_id平台交易号
amount订单金额(法币)
token支付代币
network支付网络
amount_due实际到账数量
transaction_hash链上交易哈希
status2 = 支付成功
signature签名(Alsopay 用 HMAC-SHA256,EPay 用 MD5)

验签

  1. 取出除 signature(EPay 为 sign)外的全部参数
  2. 按键名 ASCII 升序排序,拼接为 key1=value1&key2=value2...
  3. Alsopay 通知:hex(HMAC-SHA256(拼接串, secret_key)),小写
  4. 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 可能收到重复通知,业务侧请做幂等处理