Saltar al contenido principal

3- 3. Devolución de llamada

Cuando se procese el pedido, el sistema enviará un mensaje de notificación a la dirección de devolución de llamada configurada por el comerciante.

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

Al realizar un pedido, puede especificar la dirección de devolución de llamada exclusiva para este pedido a través del parámetro notifyUrl. Esta dirección anulará la dirección de devolución de llamada predeterminada configurada en el backend del comerciante.


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

Si no se ingresa notifyUrl al realizar un pedido, el sistema devolverá la llamada a la dirección de devolución de llamada predeterminada configurada en 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

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

**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 pedidoLa descripción del tipo de pedido es la siguiente
blockchainobjectInformación de transacciones en cadenaInformación de transacciones en cadena, devuelta solo cuando isBlockchain=true
└redStringRed principal
└dirección del receptorStringDirección del destinatario
└Dirección del remitentedecimalDirección de envío
└txIdStringID de transacciónHash de transacciones de blockchain
└txÍndiceStringÍndice de transaccionesÍndice de transacciones (escenario de transferencia por lotes)
currencyStringMonedaMoneda del pedido
keyStringClave de comerciante
localOrderIdStringNúmero de pedido del comerciante
merchantActualAmountdecimalMonto de pago real del comerciante
merchantCurrencyStringMoneda de liquidación mercantil
merchantIdStringIdentificación del comerciante
merchantPaidAmountdecimalImporte a cobrar o a pagar por el comerciante
merchantUserIdStringID de usuario del comerciante
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 pagoÉXITO, FRACASO (descripción a continuación)
typeStringTipo de pedidoPAGO, RETIRO (descripción a continuación)
userAmountdecimalEl importe realmente recibido o pagado por el usuario
userCurrencyStringMoneda del usuario
userMinerFeeStringTarifa minera
userReceivableAmountStringImporte a pagar o a cobrar por el usuario
isReissueBooleanYa sea para reeditarYa sea para volver a emitir la devolución de llamada
ratestringTipo de cambio
rateExpressionstringExpresión del tipo de cambio
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

tipo tipo descripción

Tipo ValorDescripción
PAYMENTPago
WITHDRAWRetiro

bizType descripción del tipo de negocio

tipo de negocioDescripción
PAYMENT_WALLET_SCANCódigo de escaneo de billetera VPAY para pagar
PAYMENT_TRANSFERDepósito directo de dirección vinculante de moneda digital
PAYMENT_ANY_DIGITAL_SCANEscanea el código QR para pagar cualquier cantidad de moneda digital
PAYMENT_FIXED_DIGITAL_SCANPago de código de escaneo de cantidad fija en moneda digital
WITHDRAW_WALLETRetirar a la billetera VPAY
WITHDRAW_ANY_DIGITAL_WALLETRetirar a cualquier billetera digital
BATCH_PAYPago por lotes

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