SDK PHP

Envoyer des SMS, WhatsApp et OTP en PHP avec le SDK officiel

envoisms/envoisms-php est le SDK PHP officiel d'EnvoiSMS.ma. Un client, une clé API : envoi de SMS et de messages WhatsApp, codes OTP, envois groupés, suivi des messages, vérification des webhooks et solde du compte. Il sert aussi de base au package Laravel envoisms/laravel-otp.

cURL REST API
curl -X POST https://api.envoisms.ma/v1/messages \ -H "Authorization: Bearer env_live_votretoker" \ -H "Content-Type: application/json" \ -d '{ "to": "+212661234567", "message": "Votre code de confirmation est : 849201. Expire dans 3 minutes.", "from": "VOTREMARQUE" }'
● Routes locales MarocIAM • Inwi • Orange
https://api.envoisms.ma/v1
Routes locales
Maroc Telecom (IAM) • Inwi • Orange
Accusés réels DLR
Signatures HMAC-SHA256
Tarifs clairs en MAD
dès 0,60 MAD/SMS • 5 MAD offerts

Installation et premier SMS

composer require envoisms/envoisms-php, puis $client = new EnvoiSMS\Client(getenv('ENVOISMS_API_KEY')). $client->send(['to' => '+212600000000', 'message' => '…', 'from' => 'MonBusiness']) renvoie l'identifiant du message, que vous retrouvez avec getMessage() et dans vos webhooks.

  • 'from' : votre Sender ID validé, ou omis pour l'expéditeur par défaut
  • sendBulk(['messages' => [...], 'from' => ...]) pour un envoi groupé
  • getMessage($id) et listMessages(50, 0) pour suivre vos envois

Envois rejouables et gestion des erreurs

Chaque send() et sendBulk() porte un Idempotency-Key, généré ou passé en second argument : un nouvel essai après un timeout ne facture jamais le même message deux fois. Le client rejoue lui-même les réponses 5xx et les erreurs cURL jusqu'à maxRetries fois (2 par défaut), avec un délai exponentiel, puis lève EnvoiSMSError avec statusCode et errorCode.

  • new Client(getenv('ENVOISMS_API_KEY'), maxRetries: 3, timeoutSeconds: 20)
  • catch (EnvoiSMS\EnvoiSMSError $e) : $e->statusCode, $e->errorCode

SMS ou WhatsApp : choisir le canal

Le SMS est le canal par défaut : il atteint tous les mobiles marocains (IAM, Inwi, Orange) sans autre configuration que la clé API. 'channel' => 'whatsapp' envoie depuis votre propre numéro WhatsApp Business : il doit être connecté (sinon 403 WHATSAPP_NOT_CONNECTED), et un texte libre n'est accepté que dans les 24 heures après le dernier message du client (sinon 400 OUT_OF_24H_WINDOW). Hors de cette fenêtre, envoyez un template approuvé. Rien n'est facturé quand l'API refuse.

  • 'template' => ['name' => 'order_shipped', 'language' => 'fr', 'variables' => ['89240']]
  • 'cascade' => true : repli automatique en SMS si le numéro n'a pas WhatsApp

Codes OTP et webhooks

$client->sendOtp(['to' => …, 'brand' => 'MonBusiness', 'code_length' => 6, 'expiry' => 600]) renvoie un session_id ; $client->checkOtp($sessionId, $code) renvoie verified. getOtpSession() lit l'état d'une session sans consommer de tentative. Pour un webhook de statut, Client::verifyWebhookSignature($rawBody, $signature, $secret) vérifie l'en-tête X-EnvoiSMS-Signature sur le corps brut de la requête.

  • 'channel' => 'whatsapp' dans sendOtp() : code WhatsApp via l'expéditeur partagé, sans connexion
  • getBalance(), listPacks(), createTopup() pour le compte
  • createOptout($phone) pour enregistrer un STOP

Tout savoir sur SDK PHP.

Comment vérifier un webhook de statut en PHP ?
Lisez le corps brut avec file_get_contents('php://input') — pas le tableau déjà décodé — et passez-le à Client::verifyWebhookSignature() avec l'en-tête X-EnvoiSMS-Signature et votre secret de webhook. Ne traitez la livraison que si la vérification réussit.
Peut-on utiliser le SDK avec Laravel ?
Oui, directement, ou via le package envoisms/laravel-otp qui s'appuie dessus et ajoute un canal de notification et une façade Laravel.
Que se passe-t-il si mon script renvoie deux fois le même SMS ?
Rien de plus : avec le même Idempotency-Key, l'API renvoie la réponse d'origine sans renvoyer ni facturer le message. Une clé est valable 24 heures.

Prêt à intégrer SDK PHP ?

Créez votre compte en moins de 2 minutes. Bénéficiez immédiatement de 5 MAD de crédit gratuit pour tester l'API.