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 } ] }
              
              {
  "total": 1,
  "rows": [
    {
      // array de objetos ReportLifecycle
    }
  ]
}

            
Este bloque de código se muestra en una ventana flotante
Nombre del campo Tipo Descripción ¿Siempre devuelto?
total int64 Número total de registros
rows array Array de datos de estado del ciclo de vida

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
to string Número del destinatario
server string Tipo de servicio
channel string Tipo de canal
itime int64 Marca de tiempo del callback (segundos)
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.
status_data object Objeto de datos de estado; véase más abajo
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
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:

  • analysis - campo de análisis estadístico interno

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)
message_id string ID del mensaje
current_send_channel string Nombre del canal de envío actual
template_key string Key de configuración de la plantilla
business_id string ID de negocio

Nota: los siguientes campos son información sensible o campos internos; se han filtrado y no se incluyen en el callback al cliente:

  • message_content - contenido del mensaje (información sensible)
  • parts - número de fragmentos del mensaje (campo interno)
  • msg_type - tipo de mensaje (campo interno)
  • protocol_type - tipo de protocolo (campo interno)
  • supplier_ids - ID del proveedor (información sensible)

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)
currency string Moneda, fija en "USD"

Nota: los siguientes campos son campos de facturación internos y no se incluyen en el callback al cliente:

  • cost10000 - campo de facturación interno (en unidades de diezmilésimas)
  • sender_cost10000 - coste del remitente (en unidades de diezmilésimas)

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
channel_code string Código de error original devuelto por el canal
channel_message string Mensaje de error original devuelto por el canal

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)
parts int Número de fragmentos facturables
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 } } ] }
              
              {
  "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
      }
    }
  ]
}

            
Este bloque de código se muestra en una ventana flotante

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

            
Este bloque de código se muestra en una ventana flotante

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

            
Este bloque de código se muestra en una ventana flotante

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

            
Este bloque de código se muestra en una ventana flotante

Aspectos importantes

  1. Reglas de devolución de campos

    • Todos los campos marcados como omitempty no 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
  2. 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
  3. 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
  4. 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
  5. Acerca de las marcas de tiempo

    • itime: marca de tiempo en la que se produce el callback, en segundos
    • msg_time: marca de tiempo de creación del mensaje, en segundos
    • delivered_time: campo específico de Kwai, marca de tiempo de entrega, en milisegundos
  6. Parámetros personalizados

    • El campo custom_args devuelve 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

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_extra para dar soporte a los clientes de Kwai
  • Se filtraron los campos de información sensible para reforzar la seguridad
Icon Solid Transparent White Qiyu
Contacto