跳至主要内容

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("签名验证失败");
    }
    // 业务处理逻辑
}