メインコンテンツまでスキップ

3-3. コールバック

注文が処理されると、システムは販売者が設定したコールバック アドレスに通知メッセージを送信します。

コールバック アドレスの構成​

注文を行う際、notifyUrl パラメータを通じてこの注文の専用コールバック アドレスを指定できます。このアドレスは、販売者のバックエンドで構成されたデフォルトのコールバック アドレスをオーバーライドします。


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

注文時に notifyUrl が入力されなかった場合、システムは販売者のバックエンドで構成されたデフォルトのコールバック アドレスをコールバックします。 デフォルトのコールバック アドレスは、作成時に販売者によって提供され、運用管理のバックグラウンドで維持できます。

コールバックリクエストメソッド​

HTTP メソッド

POST

コンテンツタイプ

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
└ネットワークStringはいメインネット
└受信者アドレスStringはい受信者のアドレス
└差出人住所decimalはい送付先住所
└txIdStringはいトランザクションIDブロックチェーントランザクションハッシュ
└txインデックスStringはいトランザクションインデックストランザクションインデックス (バッチ転送シナリオ)
currencyStringはい通貨注文通貨
keyStringはい販売者キー
localOrderIdStringはい販売者の注文番号
merchantActualAmountdecimalはい販売者の実際の支払い額
merchantCurrencyStringはい加盟店決済通貨
merchantIdStringはい販売者 ID
merchantPaidAmountdecimalはい販売者が受け取る金額または支払う金額
merchantUserIdStringはい販売者ユーザー ID
notifyTimelongはいコールバック時間コールバック通知時間
orderCreateTimelongはい注文作成時間
orderIdStringはい注文番号プラットフォーム注文番号 (一意)
statusStringはい支払い状況成功、失敗 (以下の説明)
typeStringはい注文タイプ支払い、出金(下記説明)
userAmountdecimalはいユーザーが実際に受け取ったまたは支払った金額
userCurrencyStringはいユーザー通貨
userMinerFeeStringはいマイニング料金
userReceivableAmountStringはいユーザーが支払うべき金額または受け取るべき金額
isReissueBooleanはい再発行するかどうかコールバックを再発行するかどうか
ratestringはい為替レート
rateExpressionstringはい為替レートの式
signStringいいえ署名値md5 署名 (詳細については署名アルゴリズムを参照)

ステータス ステータスの説明​

ステータス値説明
SUCCESS完了
FAIL失敗しました

タイプ タイプの説明​

タイプ値説明
PAYMENTお支払い
WITHDRAW出金

bizType ビジネス タイプの説明​

bizType説明
PAYMENT_WALLET_SCANVPAY ウォレットでコードをスキャンして支払う
PAYMENT_TRANSFERデジタル通貨バインディングアドレス直接入金
PAYMENT_ANY_DIGITAL_SCANQR コードをスキャンして、任意の金額のデジタル通貨を支払います
PAYMENT_FIXED_DIGITAL_SCANデジタル通貨定額スキャンコード決済
WITHDRAW_WALLETVPAY ウォレットへの出金
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を削除します
  2. パラメータに販売者 key を入力します
  3. マーチャント secret を使用して、署名ルールに従って署名を再計算します
  4. コールバック内で計算結果が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("签名验证失败");
    }
    // 业务处理逻辑
}