Saltar al contenido principal

7.4.3 Obtener la dirección en cadena del usuario

#Breve descripción: Obtenga la dirección en cadena del usuario (créela si no existe).

Parámetros de consulta

Nombre del parámetroTipoObligatorioSignificado del parámetroDescripción del parámetro
merchantIdint64Identificación del comerciante
userIdstringID de usuarioID único del usuario local del comerciante
networkstringRed principalSoporta TRON, BSC, POLYGON, ETHEREUM (disponible a través del documento 7.4.2)
keystringClave de comercianteClave de comerciante asignada por la plataforma
signstringReferencia de firma (cómo firmar)Vea cómo firmar reglas para más detalles
Solicitar muestra json
{
"merchantId": "302992856974",
"userId": "77",
"network": "TRON",
"key": "9yUreYgTRtit39Dy",
"sign": "3876e3b40ce4938c3123f07cd5aecb8c"
}

Ejemplo de respuesta 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
}
Descripción del parámetro de datos de respuesta
Nombre del parámetroTipoSignificado del parámetroObservaciones
merchantIdint64Identificación del comerciante
userIdstringID de usuarioID única del usuario local del comerciante
addressstringDirección de cadenaDirección de cadena del usuario
networkobjectCadena de información de la red principal
└ nombrestringNombre de la red principal
└ consultaBaseUrlstringURL de consulta en cadena
└ colecciónRedConfirmarint64Número de confirmaciones de red de recarga
└confirmación de red de retiroint64Número de confirmaciones de la red de retiros
└ monedaTotalint64Número de monedas
└ masterCoinstringMoneda de la cadena principal
└ tipo de redstringTipo de red principal (utilice este campo cuando el cliente desee guardar el tipo de dirección)
└ masterCoinstringMoneda de la cadena principal
└ avgBlockSecondnumTiempo medio de bloqueo (segundos)
└ Minuto estimadonumTiempo estimado de llegada del depósito (minutos)
└ nombre para mostrarstringNombre para mostrar de la red principal
└ logotipostringdirección del logotipo

Notificación de devolución de llamada

Cuando la dirección del usuario recibe el pago y se procesa el pedido, el sistema enviará un mensaje de notificación a la dirección de devolución de llamada predeterminada configurada por el comerciante.

Configuración de la dirección de devolución de llamada

Esta interfaz no admite la especificación de notifyUrl a través de parámetros de solicitud. El sistema devolverá la llamada a la dirección de devolución de llamada predeterminada configurada por el backend del comerciante. La dirección de devolución de llamada predeterminada la proporciona el comerciante cuando se crea y se puede mantener en segundo plano de la gestión de operaciones.

Método de solicitud de devolución de llamada

Método HTTP

POST

Tipo de contenido

application/json

Ejemplo de datos de devolución de llamada

Dependiendo de la fuente de fondos, los datos de devolución de llamada se dividen en las tres situaciones siguientes.

Escenario 1: Transferencia a esta dirección a través de la cadena (otras billeteras)

El escenario de transferencia en cadena devolverá blockchain información de la transacción en cadena.

{
"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"
}

Escenario 2: Transferencia a esta dirección a través de una billetera interna

El escenario de pago de billetera interna devolverá walletUserId del pagador.

{
"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"
}

Escenario 3: retirar dinero a esta dirección a través de Merchant OpenAPI

Cuando se crea una orden de retiro a través de Merchant OpenAPI y se retira a esta dirección, se devolverá la información de la orden de retiro de origen 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"
}

**Para satisfacer las necesidades de desarrollo empresarial, los parámetros de devolución de llamada pueden agregar nuevos campos en el futuro. Los campos recién agregados participan en el cálculo de la firma de forma predeterminada (excepto los campos específicamente establecidos en las reglas de firma). Por lo tanto, el sistema comercial debe tener compatibilidad hacia adelante para evitar fallas en la verificación de firmas debido a la expansión del campo. **

Descripción del parámetro de devolución de llamada

Nombre del parámetroTipoFirma participanteSignificado del parámetroDescripción del parámetro
amountdecimalMonto del pedido
bizTypeenumTipo de negocioFijado en PAYMENT_TRANSFER
blockchainobjectInformación de transacciones en cadenaSolo se devuelven escenarios de recarga y transferencia en cadena
└ redStringRed principal
└ dirección del receptorStringDirección del destinatario
└ dirección del remitenteStringDirección de envío
└ ID de txStringID de transacciónHash de transacciones de blockchain
└ txIndexintÍndice de transacciones
currencyStringMoneda del pedido
fromWithdrawobjectInformación de la orden de retiro de origenSolo se devuelve el escenario de retirar dinero a esta dirección a través de OpenAPI
└ ID de pedido localStringNúmero de pedido del comerciante de origen
└ ID de comercianteint64ID de comerciante de orden de retiro de origen
└ ID de pedidoint64Número de pedido de la plataforma fuente
merchantActualAmountdecimalMonto de pago real del comerciante
merchantCurrencyStringMoneda de liquidación mercantil
merchantIdint64Identificación del comerciante
merchantPaidAmountdecimalImporte por cobrar del comerciante
merchantUserIdStringID de usuario del comercianteuserId correspondiente a la interfaz de adquisición de direcciones
notifyTimelongTiempo de devolución de llamadaHora de notificación de devolución de llamada
orderCreateTimelongHora de creación del pedido
orderIdStringNúmero de pedidoNúmero de pedido de plataforma (único)
statusStringEstado de pagoSUCCESS, FAIL
typeStringTipo de pedidoFijado en PAYMENT
userAmountdecimalImporte realmente pagado por el usuario
userCurrencyStringMoneda del usuario
userReceivableAmountdecimalImporte por cobrar del usuario
walletUserIdint64ID de usuario interno de billeteraDevuelto al realizar pagos o retiros de billetera interna a esta dirección a través de OpenAPI
signStringNoValor de firmaFirma MD5 (consulte el algoritmo de firma para obtener más detalles)

estado descripción del estado

Valor de estadoDescripción
SUCCESSCompletado
FAILFallido

Requisitos de respuesta de devolución de llamada

Después de que el comerciante maneje con éxito la devolución de llamada, se debe devolver el siguiente contenido:

success

Después de que el sistema recibe la cadena success, se considera que el procesamiento de la devolución de llamada fue exitoso y no se volverá a enviar.

Mecanismo de reintento de devolución de llamada

Si:

  • No se recibió respuesta
  • El contenido devuelto no es success
  • Excepción de solicitud HTTP
  • Tiempo de espera del servicio

El sistema volverá a intentar enviar automáticamente la notificación de devolución de llamada.

Número máximo de reintentos

14次

Intervalo de reintento

15s
15s
30s
180s
600s
1200s
1800s
1800s
1800s
3600s
10800s
10800s
21600s
21600s

Se recomienda que el sistema comercial implemente el procesamiento idempotente de acuerdo con orderId para evitar el procesamiento repetido de datos comerciales debido a devoluciones de llamadas repetidas.

Verificación de firma

Después de recibir la notificación de devolución de llamada, el comerciante primero debe realizar una verificación de firma y luego ejecutar la lógica comercial después de pasar la verificación. El algoritmo de firma es completamente consistente con las reglas de firma de solicitud de pedido. Consulte "2. Cómo firmar".

Proceso de verificación de firma

  1. Obtenga sign en el parámetro de devolución de llamada.
  2. Eliminar sign de los parámetros
  3. Ponga el comerciante key en los parámetros.
  4. Utilice el comerciante secret para recalcular la firma de acuerdo con las reglas de firma.
  5. Compare si el resultado del cálculo es consistente con sign en la devolución de llamada

Solo después de que la verificación de la firma sea exitosa, se debe procesar el pedido comercial.

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