跳到主要内容

7.4.3 获取用户链上地址

#简要描述: 获取用户链上地址(如果不存在则创建)。

查询参数​

参数名称类型必填参数含义参数说明
merchantIdint64是商户 ID
userIdstring是用户 ID商户本地用户唯一 ID
networkstring是主网支持 TRON、BSC、POLYGON、ETHEREUM(可通过文档7.4.2获取)
keystring是商户 key平台分配商户 key
signstring是签名参照(如何签名)详见如何签名规则
请求 json 样例​
{
"merchantId": "302992856974",
"userId": "77",
"network": "TRON",
"key": "9yUreYgTRtit39Dy",
"sign": "3876e3b40ce4938c3123f07cd5aecb8c"
}

响应 json 示例

{
"code": 0,
"data": {
"address": "TMWFqTEZMDRxNzyfudFBw4rn7QFvMt4kSN",
"merchantId": 308116064181,
"network": {
"avgBlockSecond": 3,
"coinTotal": 2,
"collectionNetworkConfirm": 3,
"displayName": "Tron",
"estimatedMinute": 1,
"isDefault": null,
"level": null,
"logo": "https://dx-public-download.s3.ap-southeast-1.amazonaws.com/blockchain-logo/tron.png",
"masterCoin": "TRX",
"name": "TRON",
"networkType": "TRON",
"queryBaseUrl": "https://nile.tronscan.org/",
"withdrawalNetworkConfirm": 3
},
"userId": "33"
},
"success": true,
"message": null
}
响应data 参数说明​
参数名称类型参数含义备注
merchantIdint64商户 ID
userIdstring用户 ID商户本地用户唯一 ID
addressstring链地址用户的链地址
networkobject链主网信息
└ namestring主网名称
└ queryBaseUrlstring链上查询网址
└ collectionNetworkConfirmint64充值网络确认次数
└withdrawalNetworkConfirmint64出款网络确认次数
└ coinTotalint64币数量
└ masterCoinstring主链币种
└ networkTypestring主网类型(客户端要保存地址类型时,请使用这个字段)
└ masterCoinstring主链币种
└ avgBlockSecondnum平均出块时间(秒)
└ estimatedMinutenum预计充值到账时间(分钟)
└ displayNamestring主网显示名称
└ logostringlogo地址

回调通知

当该用户地址收到款项且订单处理完成后,系统会向商户配置的默认回调地址发送通知消息。

回调地址配置​

该接口不支持通过请求参数指定 notifyUrl,系统将回调商户后台配置的默认回调地址。 默认回调地址由商户创建时提供,并可在运营管理后台进行维护。

回调请求方式​

HTTP Method

POST

Content-Type

application/json

回调数据示例​

根据款项来源不同,回调数据分为以下三种情况。

情况一:通过链上(其它钱包)转账至该地址​

链上转账场景会返回 blockchain 链上交易信息。

{
"amount": "6",
"bizType": "PAYMENT_TRANSFER",
"blockchain": {
"network": "TRON",
"receiverAddress": "TMWFqTEZMDRxNzyfudFBw4rn7QFvMt4kSN",
"senderAddress": "TPutFhYUQnrRxHSmKVwjp55vgk9QY6r5nS",
"txId": "8265e6b65d8aad4727b55f79880941c1e22df54278a1f78b28d760eb7328a0d2",
"txIndex": 0
},
"currency": "USDT",
"merchantActualAmount": "38.86",
"merchantCurrency": "CNY",
"merchantId": 308116064181,
"merchantPaidAmount": "38.86",
"merchantUserId": "33",
"notifyTime": 1783671086642,
"orderCreateTime": 1783671075931,
"orderId": "566708436246981",
"status": "SUCCESS",
"type": "PAYMENT",
"userAmount": "6",
"userCurrency": "USDT",
"userReceivableAmount": "6",
"sign": "b0d2d52d8dc41af9373431fc8b2b2d6a"
}

情况二:通过内部钱包转账至该地址​

内部钱包支付场景会返回付款方的 walletUserId。

{
"amount": "7",
"bizType": "PAYMENT_TRANSFER",
"currency": "USDT",
"merchantActualAmount": "45.33",
"merchantCurrency": "CNY",
"merchantId": 308116064181,
"merchantPaidAmount": "45.33",
"merchantUserId": "33",
"notifyTime": 1783671928955,
"orderCreateTime": 1783671928956,
"orderId": "566715422826565",
"status": "SUCCESS",
"type": "PAYMENT",
"userAmount": "7",
"userCurrency": "USDT",
"userReceivableAmount": "7",
"walletUserId": 3,
"sign": "08c9b45f19709f9d4e8ffbd5bc852eb9"
}

情况三:通过 商户OpenAPI 提款至该地址​

通过 商户OpenAPI 创建提款订单并提款至该地址时,会返回来源提款订单信息 fromWithdraw。

{
"amount": "8",
"bizType": "PAYMENT_TRANSFER",
"currency": "USDT",
"fromWithdraw": {
"localOrderId": "17751376202610003",
"merchantId": 308116064181,
"orderId": 566716344475973
},
"merchantActualAmount": "51.81",
"merchantCurrency": "CNY",
"merchantId": 308116064181,
"merchantPaidAmount": "51.81",
"merchantUserId": "33",
"notifyTime": 1783672041921,
"orderCreateTime": 1783672041922,
"orderId": "566716348211653",
"status": "SUCCESS",
"type": "PAYMENT",
"userAmount": "8",
"userCurrency": "USDT",
"userReceivableAmount": "8",
"walletUserId": 2,
"sign": "fc648e11787ccd94accd139453a3c69b"
}

为满足业务发展需要,回调参数未来可能新增字段。新增字段默认参与签名计算(除签名规则中特别说明的字段外),因此商户系统应具备向前兼容能力,避免因字段扩展导致验签失败。

回调参数说明​

参数名称类型参与签名参数含义参数说明
amountdecimal是订单金额
bizTypeenum是业务类型固定为 PAYMENT_TRANSFER
blockchainobject是链上交易信息仅链上转账充值场景返回
└ networkString是主网
└ receiverAddressString是接收地址
└ senderAddressString是发送地址
└ txIdString是交易 ID区块链交易哈希
└ txIndexint是交易索引
currencyString是订单币种
fromWithdrawobject是来源提款订单信息仅通过 OpenAPI 提款至该地址的场景返回
└ localOrderIdString是来源商户订单号
└ merchantIdint64是来源提款订单商户 ID
└ orderIdint64是来源平台订单号
merchantActualAmountdecimal是商户实际收款金额
merchantCurrencyString是商户结算币种
merchantIdint64是商户 ID
merchantPaidAmountdecimal是商户应收金额
merchantUserIdString是商户用户 ID对应获取地址接口的 userId
notifyTimelong是回调时间回调通知时间
orderCreateTimelong是订单创建时间
orderIdString是订单号平台订单号(唯一)
statusString是支付状态SUCCESS、FAIL
typeString是订单类型固定为 PAYMENT
userAmountdecimal是用户实付金额
userCurrencyString是用户币种
userReceivableAmountdecimal是用户应收金额
walletUserIdint64是钱包内部用户 ID内部钱包支付或通过 OpenAPI 提款至该地址时返回
signString否签名值MD5 签名(详情参见签名算法)

status 状态说明​

状态值说明
SUCCESS已完成
FAIL已失败

回调响应要求​

商户成功处理回调后,必须返回以下内容:

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