跳至主要内容

3- 3、回調

當訂單處理完成後,系統會向商家配置的回呼位址發送通知訊息。

回呼位址配置

下單時可透過 notifyUrl 參數指定本次訂單專屬回呼位址,該位址將覆寫商家後台設定的預設回呼位址。


param.put("notifyUrl", "http://{域名}/callback/notifyUrl");

若下單時未傳入 notifyUrl,系統將回呼商家後台設定的預設回呼位址。 預設回呼位址由商家建立時提供,並可在營運管理後台進行維護。

回呼請求方式

HTTP Method

POST

Content-Type

application/json

回呼資料範例

{
"amount": "100",
"bizType": "WITHDRAW_ANY_DIGITAL_WALLET",
"blockchain": {
"network": "TRON",
"receiverAddress": "THcJ2FeNBkuzd4PZBpRans6tx9QGg9KHRt",
"senderAddress": "TE35TrUfHjbGEBsVS6zVXdHS8HxXCWwC2y",
"txIndex": "2",
"txId": "d848e4b62ec6925b8b3ff49dbc4d839f3f88508497c3af525f0c8293cb303ab3"
},
"currency": "CNY",
"localOrderId": "TestOTM0625ROB016",
"merchantActualAmount": "138.12",
"merchantCurrency": "CNY",
"merchantId": 302992856974,
"merchantPaidAmount": "100",
"notifyTime": 1772173006425,
"orderCreateTime": 1772172958082,
"orderId": "472515854147845",
"status": "SUCCESS",
"type": "WITHDRAW",
"userAmount": "14.971722",
"userCurrency": "USDT",
"userMinerFee": "0",
"isReissue": false,
"userReceivableAmount": "14.971722",
"rate": "6.71080951",
"rateExpression": "1USDT≈6.7108CNY",
"sign": "2c27c7e8184cc709a64ad502ee42eab7",
"key": "9yUreYgTRtit39Dy"
}

**為滿足業務發展需要,回呼參數未來可能新增欄位。新增欄位預設參與簽章計算(除簽章規則中特別說明的欄位外),因此商家系統應具備向前相容能力,避免因欄位擴充導致驗簽失敗。 **

回呼參數說明

參數名稱類型參與簽名參數意義參數說明
amountdecimal訂單金額
bizTypeenum訂單類型訂單類型說明如下
blockchainobject鏈交易信息鏈上交易信息,僅當 isBlockchain=true 時返回
└networkString主網
└receiverAddressString接收位址
└senderAddressdecimal傳送位址
└txIdString交易ID區塊鏈交易哈希
└txIndexString交易索引交易索引(批次轉帳場景)
currencyString幣種訂單幣種
keyString商家 key
localOrderIdString商家訂單號碼
merchantActualAmountdecimal商家實際收付金額
merchantCurrencyString商家結算幣種
merchantIdString商家號碼
merchantPaidAmountdecimal商家應收或應付金額
merchantUserIdString商家用戶 ID
notifyTimelong回呼時間回呼通知時間
orderCreateTimelong訂單建立時間
orderIdString訂單號碼平台訂單號碼(唯一)
statusString支付狀態SUCCESS 、 FAIL(說明如下)
typeString訂單類型PAYMENT 、WITHDRAW(說明如下)
userAmountdecimal用戶實收或實付金額
userCurrencyString用戶幣種
userMinerFeeString礦工費
userReceivableAmountString用戶應付或應收金額
isReissueBoolean是否補發是否補發回呼
ratestring匯率
rateExpressionstring匯率表達式
signString簽章值md5 簽章(詳見簽章演算法)

status 狀態說明

狀態值說明
SUCCESS已完成
FAIL已失敗

type 類型說明

類型值說明
PAYMENT付款
WITHDRAW提款

bizType 業務類型說明

bizType說明
PAYMENT_WALLET_SCANVPAY 皮夾掃碼付款
PAYMENT_TRANSFER數位貨幣綁定位址直充
PAYMENT_ANY_DIGITAL_SCAN數位貨幣任一金額掃碼付款
PAYMENT_FIXED_DIGITAL_SCAN數位貨幣固定金額掃碼支付
WITHDRAW_WALLET提現至 VPAY 皮夾
WITHDRAW_ANY_DIGITAL_WALLET提現至任意數位錢包
BATCH_PAY大量代付

回呼回應要求

商家成功處理回呼後,必須回傳以下內容:

success

系統收到字串 success 後,視為回呼處理成功,不再重複發送。

回呼重試機制

若出現以下情況:

  • 未收到回應
  • 回傳內容不是 success
  • HTTP 請求異常
  • 服務超時

系統將自動重試發送回呼通知。

最大重試次數

14次

重試間隔

15s
15s
30s
180s
600s
1200s
1800s
1800s
1800s
3600s
10800s
10800s
21600s
21600s

建議商家系統依照 orderId 實現冪等處理,避免因重複回呼導致業務資料重複處理。

簽名校驗

收到回調通知後,商家必須先進行簽章驗證,驗證通過後再執行業務邏輯。 簽章演算法與下單請求簽章規則完全一致,請參考《2. 如何簽章》。

驗簽流程

  1. 取得回呼參數中的 sign
  2. 從參數中移除 sign
  3. 將商家 key 放入參數
  4. 使用商家 secret 依簽章規則重新計算簽名
  5. 比較計算結果與回呼中的 sign 是否一致

只有驗簽成功後,才應處理訂單業務。

Java 驗簽範例

public void notify(JSONObject data) {

    log.info("收到回调通知:{}", data.toJSONString());

    String key = "your_key";
    String secret = "your_secret";
   
    String sign = data.getString("sign");

    data.put("key", key);
    data.remove("sign");
   
    String calculatedSign = SignUtils.getSign(data, secret);

    if (!calculatedSign.equals(sign)) {
        throw new DxBizException("签名验证失败");
    }
    // 业务处理逻辑
}