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、日誌裡不要記錄完整的請求內容。