Skip to main content

3、回调

当下单成功后,会尝试发送消息通知发起方,在下单的时候指定 notifyUrl 参数覆盖默认回调地址。 当不传此参数时,会对商户的默认回调地址进行回调请求(创建商户时,默认回调地址由商户提供)。


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

回调的方式是:POST application/json

回调参数JSON化示例:

{
"amount": 100,
"bizType": "PAYMENT_FIXED_DIGITAL_SCAN",
"blockchain":{
"network":"TRON",
"receiverAddress":"TA1jptT16DssYWVGdVyFWxonku6hWK7En3",
"senderAddress":"TPutFhYUQnrRxHSmKVwjp55vgk9QY6r5nS",
"txId":"24d0d0e5d417bd2195c45d64724760ae47fc3b359ee31c5fedf25b40f3584b36"
},
"currency": "CNY",
"key": "h3cS7dBltRU4W1wD",
"localOrderId": "2820",
"merchantActualAmount": 8.86,
"merchantCurrency": "CNY",
"merchantId": 303122065665,
"merchantPaidAmount": 10.98,
"merchantUserId": "97",
"notifyTime": 1731572168370,
"orderCreateTime": 1731572133082,
"orderId": "273124814912907",
"sign": "699806308a9e055114c378671b0d2a15",
"status": "SUCCESS",
"type": "PAYMENT",
"userAmount": 1.55,
"userCurrency": "USDT"
}

回调参数说明:

参数名称类型参与签名参数含义参数说明
amountdecimal订单金额
bizTypeenum订单类型bizType 类型说明如下
blockchainobject链交易信息当下单请求参数isBlockchain为true,回调请求会携带此对象信息。(只涉及链上交易时,isBlockchain参数会生效)
└networkString主网
└receiverAddressString接收地址
└senderAddressdecimal发送地址
└txIdString交易ID
currencyString币种
keyString商户 key
localOrderIdString本地订单号
merchantActualAmountdecimal商户实际收款金额
merchantCurrencyString商户收款币种默认币种
merchantIdString商户号
merchantPaidAmountdecimal商户收款金额
merchantUserIdString用户 id
notifyTimelong回调时间
orderCreateTimelong订单创建时间
orderIdString订单号
statusString支付状态SUCCESS:已完成 | FAIL:已失败
typeString订单类型PAYMENT:支付 WITHDRAW:提款
userAmountdecimal用户付款金额
userCurrencyString用户支付币种
signStringmd5 签名详情看签名算法

bizType 类型说明:

1、PAYMENT_WALLET_SCAN MINPAY钱包扫码支付
2、PAYMENT_TRANSFER 数字币绑定地址直充
3、PAYMENT_ANY_DIGITAL_SCAN 数字币任意金额扫码支付
4、WITHDRAW_WALLET 提款至MINPAY钱包
5、WITHDRAW_ANY_DIGITAL_WALLET 提款数字币至任意钱包
6、PAYMENT_FIXED_DIGITAL_SCAN 数字币限定金额扫码支付
7、BATCH_PAY 批量代付

如果您接受到了回调信息,只需要返回success,即表示消息已处理,本条回调不再会发送,否则会尝试重复发送直到获得期望的响应, 目前的重试频率为15s, 15s, 30s, 180s, 600s, 1200s, 1800s,都无响应后,不再重复发送。

校验

服务器在发送回调消息时,会使用下单的 API 进行签名,接收方需验证签名后进行逻辑处理,,服务器的签名过程和下单发起[签名](/docs/dx-docs/2- 2、如何签名)的过程一致,接收方需要使用回调请求中的 body 进行加密,并校验回调的sign是否一致

代码示例

public void notify(JSONObject data){


PaymentNotifyDto paymentNotifyDto = data.to(PaymentNotifyDto.class);
log.info("收到回调通知 {}", paymentNotifyDto);

String key = "key";
String secret = "secret";

//验证签名
String sign = data.getString("sign");
data.put("key", key);
data.remove("sign");

String validStr = SignUtils.getSign(data, secret);

if(!validStr.equals(sign)){
throw new DxBizException("签名错误");
}
}