Descripción de la configuración de callbacks
Esta sección describe cómo configurar la dirección de callback de EngageLab OTP, así como los mecanismos de verificación de seguridad relacionados, para garantizar la fiabilidad y la seguridad de los datos del callback.
Configuración y verificación de la dirección de callback
Tras configurar la dirección de callback, EngageLab OTP enviará automáticamente una solicitud HTTP POST a dicha dirección para comprobar la disponibilidad del endpoint. Su servicio debe devolver un código de estado HTTP 200 en un plazo de 3 segundos; de lo contrario, el sistema considerará que la dirección no está disponible.
Nota:
Para garantizar la recepción correcta de los datos del callback, agregue 119.8.170.74 y 114.119.180.30 a la lista blanca del firewall de su servidor.
Ejemplo de solicitud
Suponiendo que su dirección de callback es https://example.engagelabotp.callback.com, el sistema enviará la siguiente solicitud:
curl -X POST https://example.engagelabotp.callback.com -d '{}'
Requisitos de la respuesta
Su servicio solo necesita devolver un código de estado HTTP 200, sin necesidad de devolver ningún contenido. Por ejemplo:
HTTP/1.1 200 OK
Content-Length: 0
Nota:
La verificación de la dirección de callback solo evalúa el código de estado HTTP y no exige que se devuelva un contenido concreto. Asegúrese de que el endpoint de su servicio pueda responder correctamente con un 200 en un plazo de 3 segundos.
Mecanismos de seguridad de los callbacks
Para garantizar la seguridad de los datos del callback y la fiabilidad de su origen, EngageLab OTP admite varios métodos de verificación de seguridad.
Verificación con nombre de usuario y clave secreta (opcional)
- Configuración opcional. Si se establece un nombre de usuario, también debe establecerse una clave secreta.
- Una vez configurado, EngageLab añade el campo
X-CALLBACK-IDen el encabezado HTTP de cada solicitud de callback, con el siguiente formato:
X-CALLBACK-ID: timestamp={timestamp};nonce={nonce};username={username};signature={signature}
- Donde:
timestamp: marca de tiempo del envío del callbacknonce: número aleatoriousername: el nombre de usuario que configurósignature: información de la firma, calculada de la siguiente manera
Método de cálculo de la firma (ejemplo en Python)
import hashlib, hmac
def verify(username, secret, timestamp, nonce, signature):
return signature == hmac.new(
key=secret.encode(),
msg=f'{timestamp}{nonce}{username}'.encode(),
digestmod=hashlib.sha256
).hexdigest()
- El servidor puede verificar la legitimidad de la solicitud de callback mediante el método anterior.
Autenticación con Authorization (opcional)
- Si el endpoint de su callback requiere autenticación (como Basic Auth, Bearer Token, etc.), puede indicar la información de Authorization durante la configuración.
- EngageLab incluirá automáticamente ese campo Authorization en la solicitud, lo que facilita que su servicio verifique la identidad de la solicitud.
Descripción de los eventos de callback
Estado del mensaje
El estado del mensaje se utiliza para seguir los cambios de estado de cada mensaje a lo largo de su ciclo de vida. Permite conocer en tiempo real el progreso en cada etapa: envío, entrega, verificación, etc., lo que facilita el análisis estadístico, el tratamiento de excepciones y la optimización de la experiencia del usuario.
| Identificador del evento | Descripción |
|---|---|
| plan | El mensaje está programado para enviarse y entra en la cola de envío |
| target_valid | El número de destino es válido |
| target_invalid | El número de destino no es válido |
| sent | El mensaje se envió correctamente |
| sent_failed | Error al enviar el mensaje |
| delivered | El mensaje se entregó en el dispositivo del usuario |
| delivered_failed | El mensaje se envió, pero no se pudo entregar en el dispositivo del usuario |
| verified | El usuario completó correctamente la verificación OTP |
| verified_failed | La verificación del usuario falló |
| verified_timeout | El usuario no completó la verificación en el tiempo establecido y se agotó el tiempo de espera |
Estructura de datos del callback
Estructura externa
{
"total": 1,
"rows": [
{
// objeto ReportLifecycle
}
]
}
| Nombre del campo | Tipo | Descripción |
|---|---|---|
| total | int | Número de registros incluidos en este callback |
| rows | array | Array de datos de estado del ciclo de vida |
Objeto ReportLifecycle
| Nombre del campo | Tipo | Descripción |
|---|---|---|
| message_id | string | ID único del mensaje |
| to | string | Número del destinatario |
| server | string | Tipo de servicio (por ejemplo, otp) |
| channel | string | Tipo de canal |
| itime | int64 | Marca de tiempo del callback (segundos) |
| custom_args | object | Parámetros personalizados (se devuelven si se pasaron al enviar) |
| status | object | Objeto con los detalles del estado |
Objeto status
| Nombre del campo | Tipo | Descripción |
|---|---|---|
| message_status | string | Estado actual del mensaje (véase la tabla siguiente) |
| status_data | object | Objeto de datos de estado |
| billing | object | Objeto con información de facturación (se devuelve cuando hay facturación) |
| error_code | int | Código de error; 0 indica que no hay error |
| error_detail | object | Detalles del error (se devuelve cuando se produce un error) |
Objeto status_data
| Nombre del campo | Tipo | Descripción |
|---|---|---|
| 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 |
Objeto billing (se devuelve cuando hay facturación)
| Nombre del campo | Tipo | Descripción |
|---|---|---|
| cost | float64 | Importe del coste |
| currency | string | Moneda, fija en "USD" |
Por lo general, solo los mensajes en la etapa sent incluyen información de facturación.
Objeto error_detail (se devuelve cuando se produce un error)
| Nombre del campo | Tipo | Descripción |
|---|---|---|
| message | string | Descripción del mensaje de error |
Ejemplo: mensaje enviado 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": "sent",
"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: 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"
}
}
}
]
}
Notificaciones del sistema
Las notificaciones del sistema hacen referencia a eventos de negocio o alertas a nivel de sistema. Sirven para avisar a la parte de negocio sobre información importante como el estado de funcionamiento del servicio, el saldo o la revisión de plantillas, lo que facilita su tratamiento oportuno y la advertencia temprana de riesgos.
| Identificador del evento | Descripción |
|---|---|
| insufficient_verification_rate | La tasa de verificación está por debajo del umbral establecido |
| insufficient_balance | Saldo de la cuenta insuficiente |
| template_audit_result | Notificación del resultado de la revisión de una plantilla |
Ejemplo
{
"total": 1,
"rows": [{
"server": "otp",
"itime": 1712458844,
"notification": {
"event": "insufficient_balance",
"notification_data": {
"business_id": "1744569418236633088",
"remain_balance": -0.005, // saldo actual;
"balance_threshold": 2 // umbral de alerta;
}
}
}]
}
Respuestas de mensaje
Las respuestas de mensaje se refieren principalmente a los eventos de respuesta de callback que se producen al interactuar con usuarios o sistemas externos.
| Identificador del evento | Descripción |
|---|---|
| uplink_message | Contenido del mensaje entrante (uplink) que el usuario responde, por ejemplo, mediante SMS |
Ejemplo
{
"total": 1,
"rows": [
{
"server": "otp",
"itime": 1741083306,
"message_id": "0",
"business_id": "0",
"response": {
"event": "uplink_message",
"response_data": {
"message_sid": "SM1234567890",
"account_sid": "AC1234567890",
"from": "+1234567890",
"to": "+0987654321",
"body": "Hello, it's time to struggle!"
}
}
}
]
}
Eventos del sistema
Los eventos del sistema abarcan las acciones relacionadas con la cuenta, las plantillas, las llamadas a la API, etc. Facilitan la supervisión, la auditoría y el tratamiento automatizado de operaciones clave como el inicio de sesión de la cuenta, los cambios de claves y las llamadas a la API.
| Identificador del evento | Descripción |
|---|---|
| account_login | Notificación de operaciones relacionadas con el inicio de sesión de la cuenta |
| key_manage | Notificación de operaciones relacionadas con el cambio y la gestión de claves |
| msg_history | Notificación de operaciones relacionadas con la consulta del historial de mensajes |
| template_manage | Notificación de operaciones como la creación, modificación y eliminación de plantillas |
| api_call | Notificación de operaciones relacionadas con las llamadas a la API |
Estructura de datos del callback
Estructura externa
{
"total": 1,
"rows": [
{
// objeto de evento del sistema
}
]
}
| Campo | Tipo | Descripción |
|---|---|---|
| total | int64 | Número total de eventos incluidos en este callback |
| rows | array | Array de objetos de eventos del sistema |
Objeto de evento del sistema
| Campo | Tipo | Descripción |
|---|---|---|
| server | string | Fijo en "otp" |
| itime | int64 | Marca de tiempo en que se produjo el evento (segundos) |
| system_event | object | Contenido del evento del sistema |
Objeto system_event
| Campo | Tipo | Descripción |
|---|---|---|
| event | string | Tipo de evento |
| data | object | Datos del evento |
Objeto data
| Campo | Tipo | Descripción |
|---|---|---|
| business_id | string | ID de negocio |
| org_id | string | ID de la organización |
| operator | object | Información del operador |
Objeto operator
| Campo | Tipo | Descripción |
|---|---|---|
| string | Correo del operador (si lo hay) | |
| api_key | string | API Key (si la hay) |
| ip_address | string | IP de la operación |
Estructura de la solicitud
{
"total": 1,
"rows": [
{
"server": "otp",
"itime": 1694012345,
"system_event": {
"event": "account_login",
"data": {
"business_id": "123",
"org_id": "org-abc",
"operator": {
"email": "foo@example.com",
"api_key": "api-xxxx",
"ip_address": "1.2.3.4"
},
"account_login": {
"action": "login_success"
}
}
}
}
]
}
Evento de inicio de sesión de la cuenta
| Campo | Tipo | Descripción |
|---|---|---|
| action | string | Inicio de sesión correcto / Inicio de sesión fallido / Cierre de sesión |
| fail_reason | string | Motivo del inicio de sesión fallido; solo se devuelve cuando es login_failed |
Ejemplo
{
"event": "account_login",
"data": {
"business_id": "123",
"org_id": "org-abc",
"operator": {
"email": "foo@example.com",
"ip_address": "1.2.3.4"
},
"account_login": {
"action": "login_success"
}
}
}
Evento de gestión de plantillas
| Campo | Tipo | Descripción |
|---|---|---|
| action | string | Crear plantilla / Actualizar plantilla / Eliminar plantilla |
| template_id | string | ID de la plantilla |
| template_name | string | Nombre de la plantilla |
Ejemplo
{
"event": "template_manage",
"data": {
"business_id": "123",
"org_id": "org-abc",
"operator": {
"email": "foo@example.com",
"ip_address": "1.2.3.4"
},
"template_manage": {
"action": "update template",
"template_id": "tmpl-456",
"template_name": "Verification Code"
}
}
}
Evento de gestión de claves
| Campo | Tipo | Descripción |
|---|---|---|
| action | string | Valores de enumeración:create api_key: crear API Keyupdate api_key: actualizar API Keydelete api_key: eliminar API Keyview api_secret: ver API Secret |
| api_key | string | API Key |
| description | string | Descripción (opcional) |
Ejemplo
{
"event": "key_manage",
"data": {
"business_id": "123",
"org_id": "org-abc",
"operator": {
"email": "foo@example.com",
"ip_address": "1.2.3.4"
},
"key_manage": {
"action": "create",
"api_key": "apikey-789",
"description": "Clave nueva"
}
}
}
Evento de llamada a la API
| Campo | Tipo | Descripción |
|---|---|---|
| api_path | string | Ruta del endpoint |
| method | string | Método HTTP |
Ejemplo
{
"event": "api_call",
"data": {
"business_id": "123",
"org_id": "org-abc",
"operator": {
"api_key": "apikey-789",
"ip_address": "1.2.3.4"
},
"api_call": {
"api_path": "/api/v1/messages/send",
"method": "POST"
}
}
}










