Especialidad technical

Webhook del estado de entrega de SMS que no se activa: guía de debug

Webhook no funciona: causas reales, método de diagnóstico y soluciones concretas para el mercado marroquí.

Webhook del estado de entrega de SMS que no se activa: guía de debug
En este artículo
  1. Has desarrollado una aplicación [Laravel](/fr/blog/sms-laravel-maroc/) o Node.js que desencadena el envío de SMS. El envío funciona perfectamente, la API devuelve un éxito (HTTP `200`). Ahora estás esperando el callback (el webhook) de estado de entrega (DLR) para actualizar tu base de datos y indicar al usuario que el SMS ha sido bien recibido.
  2. Cómo funciona un webhook DLR
  3. Los 5 errores de configuración más frecuentes
  4. Pruebe su punto final con ngrok o webhook.site
  5. Estrategia de retry y fallback

Has desarrollado una aplicación [Laravel](/fr/blog/sms-laravel-maroc/) o Node.js que desencadena el envío de SMS. El envío funciona perfectamente, la API devuelve un éxito (HTTP `200`). Ahora estás esperando el callback (el webhook) de estado de entrega (DLR) para actualizar tu base de datos y indicar al usuario que el SMS ha sido bien recibido.

Su punto final permanece en silencio, sus tablas no se actualizan.

Este es un problema de configuración clásico en las arquitecturas de eventos. Aquí está cómo deshacer un webhook DLR (Delivery Report) que no se activa.

Cómo funciona un webhook DLR

Cuando envías un SMS a través de una API, la operación es asíncrona. La API toma el mensaje, te da un message_id y luego lo transmite a los operadores (Maroc Telecom, inwi, Orange). Sólo cuando el teléfono de destino confirma la recepción, el operador notifica a la pasarela, que a su vez envía una solicitud HTTP POST a la URL que le proporcionaste (tu Webhook).

Si no recibe nada, la ruptura de comunicación puede situarse en tres niveles.

Los 5 errores de configuración más frecuentes

1. Su URL no es accesible públicamente Si está desarrollando localmente (http://localhost:8000/api/sms/webhook), el servidor de la pasarela SMS no puede acceder a ella. Debe utilizar una herramienta como Ngrok para exponer temporalmente su puerto local a Internet.

2. El Firewall bloquea las IP del proveedor Si su aplicación está en producción, asegúrese de que el firewall de su servidor (o Cloudflare) no bloquee las solicitudes entrantes (POST) de las direcciones IP del proveedor de SMS. Compruebe sus registros WAF (Web Application Firewall) para detectar posibles rechazos '403 Forbidden'.

3. Protección CSRF activada en el punto final Este es el error número 1 con Laravel. Por defecto, Laravel protege todas las consultas POST con un token CSRF (Cross-Site Request Forgery). Dado que el webhook del proveedor SMS no tiene este token, Laravel rechaza la consulta con un error 419 Page Expired. Solución: Agregue la URL de su webhook en las excepciones del middleware VerifyCsrfToken (o coloque el punto final en routes/api.php en lugar de `routes/web.php').

4. Timeout trop court ou script bloquant

Si votre webhook prend trop de temps à répondre parce qu'il effectue des requêtes complexes en base de données ou appelle d'autres services externes, le fournisseur SMS peut considérer que l'appel a échoué (Timeout) après 3 ou 5 secondes.
Votre webhook doit toujours retourner un code HTTP 200 le plus vite possible, avant même de traiter l'information. L'idéal est de placer le payload reçu dans une file d'attente (Queue) et de répondre immédiatement.

La URL está mal configurada en la consulta Asegúrese de que la URL de la webhook esté bien informada, ya sea a nivel global en el dashboard de su proveedor o dinámicamente en la carga de la POST de la solicitud de envío de SMS (a menudo a través de un parámetro callback_url o notify_url).

Pruebe su punto final con ngrok o webhook.site

Para aislar el problema, el método más rápido es usar webhook.site. 1. Generar una URL temporal en webhook.site. 2. Configurar esta URL como webhook de recepción en su proveedor de SMS. 3. Enviar un SMS de prueba. 4. Si recibe la carga de pago en webhook.site, el proveedor está haciendo su trabajo bien: el problema proviene de su código, su firewall o su enrutamiento. 5. Si nada sucede en webhook.site, el problema proviene de la configuración del lado del proveedor (URL no informado, webhooks desactivados en la cuenta, o SMS nunca entregados al operador).

Estrategia de retry y fallback

Incluso con una configuración perfecta, un webhook puede fallar (cortar la red, reiniciar su servidor). Compruebe la Retry Policy de su proveedor: ¿cuántas veces se devolverá el webhook en caso de error 500?

Para aplicaciones críticas (banco, OTP transaccional), no confíe únicamente en los webhooks. Implemente un mecanismo de fallback en polling (interrogación regular): si después de 5 minutos todavía no ha recibido un estado para un message_id en Pending, activa un Cron Job (tarea programada) que interrogará manualmente la API (ej.: `GET /v1/messages/{message_id}') para recuperar el estado final con certeza.

php
// Exemple de code fonctionnel et asynchrone (Laravel minimal)
Route::post('/api/webhooks/sms', function (Request $request) {
    // 1. On stocke le statut dans une file d'attente pour traitement asynchrone
    ProcessSmsDeliveryReport::dispatch($request->all());

    // 2. On répond TOUT DE SUITE avec un code 200 pour éviter le timeout
    return response()->json(['status' => 'received'], 200);
});

¿Por qué elegir EnvoiSMS para su negocio?

Entrega a Operadores

Rutas locales hacia IAM, Orange e Inwi, con conmutación automática entre rutas y estado de entrega enviado por webhook.

Optimización de Costes

WhatsApp Business API desde 0,65 MAD por mensaje. El mejor retorno de inversión.

Conformidad CNDP

Alojamiento que cumple con las regulaciones de protección de datos personales locales.

¿Cuál es la latencia de enrutamiento en las redes IAM, Inwi y Orange?
Utilizamos rutas locales hacia Maroc Telecom (IAM), Orange e inwi, con conmutación automática entre rutas. Mediana del tiempo hasta la confirmación del operador: 46–58 s (medido en septiembre de 2026).
¿Cómo gestiona la plataforma el formato de los números marroquíes?
EnvoiSMS normaliza automáticamente los números introducidos (06..., 07..., 00212...) al estándar E.164 (+212) para evitar fallos de entrega debidos al formato.

Artículos sugeridos

Formateo de SMS en Marruecos: saltos de línea, codificación GSM-7 frente a UCS-2 y optimización de costes
technical

Formateo de SMS en Marruecos: saltos de línea, codificación GSM-7 frente a UCS-2 y optimización de costes

Formato empresarial de WhatsApp en Marruecos: texto enriquecido, emojis y botones interactivos
technical

Formato empresarial de WhatsApp en Marruecos: texto enriquecido, emojis y botones interactivos

Autenticación WhatsApp en 1-Clic y One-Tap Autofill OTP en Marruecos
technical

Autenticación WhatsApp en 1-Clic y One-Tap Autofill OTP en Marruecos