Skip to content

回调通知 ​

入金到账、出金处理完成(成功或拒绝)后,平台会向你的回调地址发一个 POST 请求。

回调地址 ​

订单用哪个地址
入金下单时传的 callbackUrl;没传就用商户后台的「入金回调地址」
出金下单时传的 callbackUrl;没传就用商户后台的「出金回调地址」

回调地址必须是公网可以访问的 https 地址。只有通过开放接口创建的出金订单才会回调;在商户后台手动提交的出金不回调。

请求格式 ​

http
POST /你的回调路径 HTTP/1.1
Content-Type: application/json

{"encryptedData":"Base64 字符串"}

encryptedData 是用你的公钥加密的 JSON(PKCS#1 v1.5),用你的私钥解密。

入金回调内容 ​

json
{
  "OrderNo": "PI1845290017342758912",
  "MerchantNo": "你的商户号",
  "MerchantOrderNo": "A20261013001",
  "PayTime": "2026-10-13T12:00:00",
  "OrderState": 6,
  "Quantity": 13.7,
  "FiatCurrency": 100.0
}
字段类型说明
OrderNostring平台订单号
MerchantNostring商户号
MerchantOrderNostring你的商户订单号
PayTimestring客户付款时间,UTC+8,格式 yyyy-MM-ddTHH:mm:ss
OrderStateint订单状态,回调时固定是 6(已释放:平台已确认收到钱,USDT 已记入你的余额)
Quantitynumber这笔订单折合的 USDT 数量(扣手续费前)
FiatCurrencynumber法币金额(就是下单金额)

出金回调内容 ​

json
{
  "OrderNo": "PO1845290017342758913",
  "MerchantNo": "你的商户号",
  "MerchantOrderNo": "PO20261013001",
  "PayTime": "2026-10-13T12:30:00",
  "state": 4
}
字段类型说明
OrderNostring平台出款单号
MerchantNostring商户号
MerchantOrderNostring你的商户订单号
PayTimestring | null处理完成时间,UTC+8
stateint4 处理成功;5 拒绝(冻结的 USDT 已退回)

字段名大小写

回调内容的字段名是大写开头(OrderNo),出金的状态字段是小写的 state,和接口返回的小驼峰不一样。建议解析时不区分大小写。回调内容里的数字没有四舍五入,以查询订单返回的为准。

你要返回什么 ​

处理成功后,返回 HTTP 2xx,内容为下面任意一种:

  • 纯文本 success(或 ok,不区分大小写,前后不能有空格或换行)
  • JSON {"code":200}

其他任何返回(包括超时、非 2xx、其他内容)都算失败,平台会重发。

重发规则 ​

第一次回调在订单完成后 30 秒内发出。失败后按下面的间隔重发,最多一共 5 次:

第几次距离上一次
1订单完成后 30 秒内
23 分钟
39 分钟
427 分钟
581 分钟

5 次都失败就不再回调,订单状态可以在商户后台查看,或用查询订单主动查。回调失败不代表付款失败。

必须做的核对 ​

回调没有签名

回调只是用你的公钥加密,没有签名。任何拿到你公钥的人都能伪造一条「已到账」的回调。所以不能只看回调内容就给客户入账。

收到回调后请按这个顺序处理(范例代码都已实现):

  1. 解密,解不开直接返回失败。
  2. 核对商户号是你自己的。
  3. 去重:同一个 OrderNo + 同一个状态只处理一次。平台会重发,你的处理也可能在返回 success 之前中断。建议在数据库里给「平台订单号 + 状态」建唯一索引,和入账放在同一个事务里。
  4. 复核:用 MerchantOrderNo 调查询订单,以接口返回为准:
    • 入金:状态必须是 6(已释放)或 3(成功),金额要等于回调里的 FiatCurrency,也要等于你自己系统里这笔订单的金额;
    • 出金:状态要和回调的 state 一样,金额要等于你自己系统里的出款金额。
  5. 都通过后再入账 / 更新订单,最后返回 success。

另外建议:回调接口限制请求体大小(几 KB 足够)、只接受 POST、日志里不要记录完整的请求内容。