في المغرب، يتطلب إرسال الرسائل الموثوقة استخدام مسارات مباشرة مع مشغلي الاتصالات (اتصالات المغرب، إنوي، أورنج) والامتثال للأنظمة المحلية. ### 1. Votre URL n'est pas publiquement accessible
Si vous développez en local (http://localhost:8000/api/sms/webhook), le serveur de la passerelle SMS ne peut pas y accéder. Vous devez utiliser un outil comme Ngrok pour exposer temporairement votre port local sur internet.
### 2. Le Firewall bloque les IPs du fournisseur
Si votre application est en production, assurez-vous que le pare-feu de votre serveur (ou Cloudflare) ne bloque pas les requêtes entrantes (POST) provenant des adresses IP du fournisseur SMS. Vérifiez vos logs WAF (Web Application Firewall) pour détecter d'éventuels rejets 403 Forbidden.
### 3. Protection CSRF activée sur l'endpoint
C'est l'erreur numéro 1 avec Laravel. Par défaut, Laravel protège toutes les requêtes POST avec un token CSRF (Cross-Site Request Forgery). Puisque le webhook du fournisseur SMS n'a pas ce token, Laravel rejette la requête avec une erreur 419 Page Expired.
Solution : Ajoutez l'URL de votre webhook dans les exceptions du middleware VerifyCsrfToken (ou placez l'endpoint dans routes/api.php plutôt que 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.
### 5. L'URL est mal configurée dans la requête
Assurez-vous que l'URL du webhook est bien renseignée, soit au niveau global dans le dashboard de votre fournisseur, soit dynamiquement dans le payload de la requête POST d'envoi de SMS (souvent via un paramètre callback_url ou notify_url).