Interfaz de callback de estado del ciclo de vida
Este documento describe la estructura de datos y los campos de la interfaz de callback de estado del ciclo de vida de los mensajes. El sistema realiza un callback de la información de estado a la URL configurada por el cliente, mediante HTTP POST, cuando cambia el estado del mensaje.
Forma del callback
- Método de solicitud:
POST - Content-Type:
application/json - Respuesta de éxito: código de estado HTTP 200 o 204
- Reintento en caso de fallo: si el cliente no devuelve un código de estado de éxito, el sistema reintentará automáticamente
Estructura de datos
1. Estructura externa (ReportLifecycles)
{
"total": 1,
"rows": [
{
// array de objetos ReportLifecycle
}
]
}
| Nombre del campo | Tipo | Descripción | ¿Siempre devuelto? |
|---|---|---|---|
total |
int64 | Número total de registros | Sí |
rows |
array | Array de datos de estado del ciclo de vida | Sí |
2. Objeto ReportLifecycle
Cada elemento del array rows tiene la siguiente estructura:
| Nombre del campo | Tipo | Descripción | ¿Siempre devuelto? |
|---|---|---|---|
message_id |
string | ID del mensaje | Sí |
to |
string | Número del destinatario | Sí |
server |
string | Tipo de servicio | Sí |
channel |
string | Tipo de canal | Sí |
itime |
int64 | Marca de tiempo del callback (segundos) | Sí |
custom_args |
map[string]any | Parámetros personalizados (los pasados al enviar) | No |
status |
object | Objeto con los detalles del estado | No |
3. Objeto Status
Objeto con la información detallada del estado:
| Nombre del campo | Tipo | Descripción | ¿Siempre devuelto? |
|---|---|---|---|
message_status |
string | Estado del mensaje, por ejemplo: sent, sent_fail, delivered, delivered_fail, verified, etc. |
Sí |
status_data |
object | Objeto de datos de estado; véase más abajo | Sí |
billing |
object | Objeto con información de facturación; véase más abajo | No |
error_code |
int | Código de error; 0 indica que no hay error | Sí |
error_detail |
object | Objeto con los detalles del error; véase más abajo | No |
kwai_extra |
object | Información de extensión específica de Kwai; véase más abajo | No |
Nota: los siguientes campos son de uso estadístico interno y no se incluyen en el callback al cliente:
- campo de análisis estadístico internoanalysis
4. Objeto StatusData
Datos básicos relacionados con el estado:
| Nombre del campo | Tipo | Descripción | ¿Siempre devuelto? |
|---|---|---|---|
msg_time |
int64 | Marca de tiempo de creación del mensaje (segundos) | Sí |
message_id |
string | ID del mensaje | Sí |
current_send_channel |
string | Nombre del canal de envío actual | Sí |
template_key |
string | Key de configuración de la plantilla | Sí |
business_id |
string | ID de negocio | Sí |
Nota: los siguientes campos son información sensible o campos internos; se han filtrado y no se incluyen en el callback al cliente:
- contenido del mensaje (información sensible)message_content- número de fragmentos del mensaje (campo interno)parts- tipo de mensaje (campo interno)msg_type- tipo de protocolo (campo interno)protocol_type- ID del proveedor (información sensible)supplier_ids
5. Objeto Billing
Información de facturación (se devuelve solo cuando hay datos de facturación):
| Nombre del campo | Tipo | Descripción | ¿Siempre devuelto? |
|---|---|---|---|
cost |
float64 | Importe del coste (con 4 decimales) | Sí |
currency |
string | Moneda, fija en "USD" | Sí |
Nota: los siguientes campos son campos de facturación internos y no se incluyen en el callback al cliente:
- campo de facturación interno (en unidades de diezmilésimas)cost10000- coste del remitente (en unidades de diezmilésimas)sender_cost10000
6. Objeto ErrorDetail
Detalles del error (se devuelve solo cuando se produce un error):
| Nombre del campo | Tipo | Descripción | ¿Siempre devuelto? |
|---|---|---|---|
message |
string | Descripción del mensaje de error | Sí |
channel_code |
string | Código de error original devuelto por el canal | Sí |
channel_message |
string | Mensaje de error original devuelto por el canal | Sí |
7. Objeto KwaiExtra
Información de extensión específica para clientes de Kwai (se devuelve solo en el estado de entrega y cuando se trata de un cliente de Kwai):
| Nombre del campo | Tipo | Descripción | ¿Siempre devuelto? |
|---|---|---|---|
delivered_time |
int64 | Marca de tiempo de entrega (milisegundos) | Sí |
parts |
int | Número de fragmentos facturables | Sí |
duration |
int64 | Duración de la llamada (segundos); este campo solo existe en los mensajes de voz | No |
Descripción de los estados del mensaje
Valores de estado del mensaje habituales:
| Valor de estado | Descripción |
|---|---|
sent |
Enviado al canal |
sent_fail |
Error de envío |
delivered |
Entregado en el terminal del usuario |
delivered_fail |
Error de entrega |
verified |
El usuario ha verificado (por ejemplo, se ha usado el código de verificación OTP) |
Ejemplos de callback
Ejemplo 1: mensaje entregado correctamente
{
"total": 1,
"rows": [
{
"message_id": "123456789",
"to": "+6598765432",
"server": "sms",
"channel": "sms",
"itime": 1701234567,
"custom_args": {
"order_id": "ORDER123",
"user_id": "USER456"
},
"status": {
"message_status": "delivered",
"status_data": {
"msg_time": 1701234560,
"message_id": "123456789",
"current_send_channel": "CHANNEL_A",
"template_key": "verify_code",
"business_id": "1001"
},
"billing": {
"cost": 0.005,
"currency": "USD"
},
"error_code": 0
}
}
]
}
Ejemplo 2: error al enviar el mensaje
{
"total": 1,
"rows": [
{
"message_id": "123456790",
"to": "+6598765433",
"server": "sms",
"channel": "sms",
"itime": 1701234568,
"status": {
"message_status": "sent_fail",
"status_data": {
"msg_time": 1701234561,
"message_id": "123456790",
"current_send_channel": "CHANNEL_B",
"template_key": "verify_code",
"business_id": "1001"
},
"error_code": 4001,
"error_detail": {
"message": "Invalid phone number",
"channel_code": "INVALID_NUMBER",
"channel_message": "The phone number format is invalid"
}
}
}
]
}
Ejemplo 3: error de entrega del mensaje (con información de facturación)
{
"total": 1,
"rows": [
{
"message_id": "123456791",
"to": "+6598765434",
"server": "sms",
"channel": "sms",
"itime": 1701234570,
"custom_args": {
"campaign": "new_year_promo"
},
"status": {
"message_status": "delivered_fail",
"status_data": {
"msg_time": 1701234562,
"message_id": "123456791",
"current_send_channel": "CHANNEL_C",
"template_key": "marketing",
"business_id": "1001"
},
"billing": {
"cost": 0.0045,
"currency": "USD"
},
"error_code": 5002,
"error_detail": {
"message": "Phone number unreachable",
"channel_code": "UNREACHABLE",
"channel_message": "Subscriber absent"
}
}
}
]
}
Ejemplo 4: entrega de mensaje de voz a cliente de Kwai
{
"total": 1,
"rows": [
{
"message_id": "123456792",
"to": "+6598765435",
"server": "voice",
"channel": "voice",
"itime": 1701234575,
"status": {
"message_status": "delivered",
"status_data": {
"msg_time": 1701234565,
"message_id": "123456792",
"current_send_channel": "VOICE_CHANNEL_A",
"template_key": "voice_verify",
"business_id": "2001"
},
"billing": {
"cost": 0.012,
"currency": "USD"
},
"error_code": 0,
"kwai_extra": {
"delivered_time": 1701234575000,
"parts": 1,
"duration": 45
}
}
}
]
}
Aspectos importantes
Reglas de devolución de campos
- Todos los campos marcados como
omitemptyno aparecen en el JSON devuelto cuando su valor es vacío o cero - La información sensible y los campos internos se filtran o se vacían antes del callback
- Todos los campos marcados como
Seguridad
- El contenido del mensaje (
message_content) no se incluye en el callback al cliente - La información sensible, como el ID del proveedor (
supplier_ids), se ha filtrado - Los campos de facturación internos (
cost10000,sender_cost10000) no se incluyen en el callback
- El contenido del mensaje (
Requisitos de recepción
- El endpoint de callback del cliente debe devolver una respuesta en un plazo de 5 segundos
- Debe devolver el código de estado HTTP 200 o 204 para indicar que la recepción fue correcta
- Si devuelve otro código de estado o se agota el tiempo de espera, el sistema reintentará automáticamente
Mecanismo de reintento
- Tras un fallo del callback, se reintentará automáticamente
- El intervalo entre reintentos aumenta progresivamente
- Durante los reintentos, los datos se guardan en Redis
Acerca de las marcas de tiempo
itime: marca de tiempo en la que se produce el callback, en segundosmsg_time: marca de tiempo de creación del mensaje, en segundosdelivered_time: campo específico de Kwai, marca de tiempo de entrega, en milisegundos
Parámetros personalizados
- El campo
custom_argsdevuelve tal cual los parámetros personalizados pasados al enviar el mensaje - Si al enviar no se pasaron parámetros personalizados, este campo no aparece en los datos del callback
- El campo
Referencia de códigos de error
Descripción de los códigos de error habituales (para los códigos de error concretos, consulte la documentación de códigos de error):
| Código de error | Descripción |
|---|---|
| 0 | Sin error, operación correcta |
| 4001 | Formato del número incorrecto |
| 4002 | El número no existe |
| 5001 | Rechazado por el canal |
| 5002 | Usuario inalcanzable |
| 6001 | Tiempo de espera de red agotado |
Para una descripción más detallada de los códigos de error, consulte la documentación específica de códigos de error.
Registro de cambios
- 2024-01: versión inicial
- Se añadió el campo
kwai_extrapara dar soporte a los clientes de Kwai - Se filtraron los campos de información sensible para reforzar la seguridad










