3、回调
当下单成功后,会尝试发送消息通知发起方,在下单的时候指定 notifyUrl 参数覆盖默认回调地址。
当不传此参数时,会对商户的默认回调地址进行回调请求(创建商户时,默认回调地址由商户提供)
注:为满足业务发展需要,回调通知参数可能会在后续版本中进行扩展或新增字段,新增字段将按照签名规则自动参与签名计算(除非规则中明确排除)。
param.put("notifyUrl", "http://{域名}/callback/notifyUrl");
回调的方式是:POST application/json
回调参数JSON化示例:
{
"amount":"100",
"bizType":"WITHDRAW_ANY_DIGITAL_WALLET",
"blockchain": {
"network":"TRON",
"receiverAddress":"THcJ2FeNBkuzd4PZBpRans6tx9QGg9KHRt",
"senderAddress":"TE35TrUfHjbGEBsVS6zVXdHS8HxXCWwC2y",
"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",
"userReceivableAmount":"14.971722",
"sign":"2c27c7e8184cc709a64ad502ee42eab7",
"key":"9yUreYgTRtit39Dy"
}
回调参数说明:回调参数后
| 参数名称 | 类型 | 参与签名 | 参数含义 | 参数说明 |
|---|---|---|---|---|
| amount | decimal | 是 | 订单金额 | |
| bizType | enum | 是 | 订单类型 | bizType 类型说明如下 |
| blockchain | object | 是 | 链交易信息 | 当下单请求参数isBlockchain为true,回调请求会携带此对象信息。(只涉及链上交易时,isBlockchain参数会生效) |
| └network | String | 是 | 主网 | |
| └receiverAddress | String | 是 | 接收地址 | |
| └senderAddress | decimal | 是 | 发送地址 | |
| └txId | String | 是 | 交易ID | |
| currency | String | 是 | 币种 | |
| key | String | 是 | 商户 key | |
| localOrderId | String | 是 | 本地订单号 | |
| merchantActualAmount | decimal | 是 | 商户实际收款金额 | |
| merchantCurrency | String | 是 | 商户收款币种 | 默认币种 |
| merchantId | String | 是 | 商户号 | |
| merchantPaidAmount | decimal | 是 | 商户收款金额 | |
| merchantUserId | String | 是 | 用户 id | |
| notifyTime | long | 是 | 回调时间 | |
| orderCreateTime | long | 是 | 订单创建时间 | |
| orderId | String | 是 | 订单号 | |
| status | String | 是 | 支付状态 | SUCCESS:已完成 | FAIL:已失败 |
| type | String | 是 | 订单类型 | PAYMENT:支付 WITHDRAW:提款 |
| userAmount | decimal | 是 | 用户付款金额 | |
| userCurrency | String | 是 | 用户支付币种 | |
| userMinerFee | String | 是 | 矿工费 | 提款矿工费 |
| userReceivableAmount | String | 是 | 应付/应收金额 | 用户应付/应收金额 |
| sign | String | 否 | md5 签名 | 详情看签名算法 |
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,表示已成功接收并处理该消息。 系统在收到 success 响应后,将不再对该笔回调进行重复发送。 若未收到期望响应(未返回 success 或返回异常),系统将按照阶梯式重试机制重新发送回调通知,最多重试 14 次。 当前重试时间间隔依次为: 15s, 15s, 30s, 180s, 600s, 1200s, 1800s, 1800s,1800s,3600s,10800s,10800s,21600s,21600s
签名校验
服务器在发送回调消息时,会使用下单的 API 进行签名,接收方需验证签名后进行逻辑处理,,服务器的签名过程和下单发起签名(文档2)的过程一致,接收方需要使用回调请求中的 body 进行加密,并校验回调的sign是否一致
代码示例
public void notify(JSONObject data){
log.info("收到回调通知 {}", data.toJSONString());
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("签名错误");
}
}