Aller au contenu

Envoyer un SMS en PHP avec une API REST (exemples PHP pur et Laravel)

Tutoriel pas à pas pour envoyer un SMS en PHP via l'API SMS Gold : cURL natif, client HTTP Laravel, gestion des erreurs et bonnes pratiques de sécurité.

PHP fait tourner une grande partie des sites et applications métier en Côte d'Ivoire. Bonne nouvelle : envoyer un SMS depuis PHP ne demande qu'une requête HTTP. Ce tutoriel montre comment le faire avec l'API SMS Gold, d'abord en PHP pur avec cURL, puis dans une application Laravel.

Prérequis

  • Un compte SMS Gold activé, avec des crédits et un nom d'expéditeur approuvé.
  • Une clé API, générée depuis Paramètres → Clés API.
  • PHP 8 ou plus avec l'extension curl (présente sur la plupart des hébergements).

Stockez votre clé dans une variable d'environnement plutôt que dans le code : SMSGOLD_API_KEY=sk_live_… dans votre fichier .env ou la configuration de votre serveur.

1. Le premier SMS en PHP pur

L'endpoint d'envoi attend un JSON avec trois champs : to (numéro au format international), message et sender_name (votre nom d'expéditeur approuvé).

<?php
$ch = curl_init('https://smsgold.tornixtech.com/api/v2/sms/send');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 30,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . getenv('SMSGOLD_API_KEY'),
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'to'          => '+2250700000000',
        'message'     => 'Votre commande n°1042 est prête.',
        'sender_name' => 'MABOUTIQUE',
    ]),
]);

$body   = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

var_dump($status, $body);

En cas de succès, vous obtenez un code 200 et une réponse de ce type :

{
  "success": true,
  "message_id": "tel%3A%2B2250700000000-abc123",
  "status": "sent",
  "credits_remaining": 498,
  "error": null
}

2. Une petite classe réutilisable

Pour éviter de répéter ce code, encapsulez l'appel dans une classe qui normalise le numéro et lève une exception claire en cas d'erreur :

<?php
final class SmsGold
{
    private const URL = 'https://smsgold.tornixtech.com/api/v2/sms/send';

    public function __construct(private string $apiKey, private string $sender) {}

    public function send(string $to, string $message): array
    {
        $ch = curl_init(self::URL);
        curl_setopt_array($ch, [
            CURLOPT_POST           => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT        => 30,
            CURLOPT_HTTPHEADER     => [
                'Authorization: Bearer ' . $this->apiKey,
                'Content-Type: application/json',
            ],
            CURLOPT_POSTFIELDS => json_encode([
                'to'          => self::normalize($to),
                'message'     => $message,
                'sender_name' => $this->sender,
            ]),
        ]);
        $raw    = curl_exec($ch);
        $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $error  = curl_error($ch);
        curl_close($ch);

        if ($raw === false) {
            throw new RuntimeException("Connexion impossible : $error");
        }
        $body = json_decode($raw, true) ?? [];
        if ($status !== 200 || empty($body['success'])) {
            throw new RuntimeException("SMS non envoyé ($status) : " . ($body['error'] ?? 'erreur inconnue'));
        }
        return $body;
    }

    /** 07 00 00 00 00 → +2250700000000 */
    public static function normalize(string $phone): string
    {
        $digits = preg_replace('/\D/', '', $phone);
        if (str_starts_with($digits, '225')) {
            return '+' . $digits;
        }
        return '+225' . $digits;
    }
}

$sms = new SmsGold(getenv('SMSGOLD_API_KEY'), 'MABOUTIQUE');
$sms->send('07 00 00 00 00', 'Bonjour Awa, votre commande est prête.');

3. Avec Laravel

Dans Laravel, le client HTTP intégré rend le code encore plus court. Ajoutez vos paramètres dans config/services.php :

'smsgold' => [
    'key'    => env('SMSGOLD_API_KEY'),
    'sender' => env('SMSGOLD_SENDER', 'MABOUTIQUE'),
],

Puis créez un service :

<?php
namespace App\Services;

use Illuminate\Support\Facades\Http;

class SmsGoldService
{
    public function send(string $to, string $message): array
    {
        $response = Http::withToken(config('services.smsgold.key'))
            ->timeout(30)
            ->post('https://smsgold.tornixtech.com/api/v2/sms/send', [
                'to'          => $to,
                'message'     => $message,
                'sender_name' => config('services.smsgold.sender'),
            ]);

        if ($response->failed() || ! $response->json('success')) {
            throw new \RuntimeException('SMS non envoyé : ' . $response->json('error', 'erreur inconnue'));
        }

        return $response->json();
    }
}

Pour ne pas ralentir vos pages, envoyez le SMS depuis une job en file d'attente (ShouldQueue), par exemple déclenchée à la validation d'une commande.

4. Gérer les erreurs correctement

CodeSignificationQue faire
401Clé API invalide ou révoquéeVérifier la variable d'environnement
402Crédits insuffisantsRecharger, puis relancer
403Compte désactivé ou aucun expéditeur approuvéVérifier le compte
422Champ manquant ou expéditeur non approuvéCorriger la requête (ne pas relancer telle quelle)
502L'opérateur n'a pas confirmé l'envoiVérifier le solde avant de relancer

Attention aux relances automatiques : sur une erreur 502, le SMS a pu partir malgré tout. Relancer aveuglément risque d'envoyer deux fois le même message. La documentation détaille les règles de remboursement.

5. Bonnes pratiques de sécurité

  • Ne publiez jamais votre clé API dans un dépôt Git ou dans du code exécuté côté navigateur.
  • Utilisez une clé par application ou par environnement (production, recette) : vous pourrez en révoquer une sans tout couper.
  • Validez les numéros saisis par vos utilisateurs avant d'appeler l'API.
  • Journalisez le message_id retourné pour retrouver un envoi en cas de réclamation.

Aller plus loin

Retrouvez les mêmes exemples en Python et en Node.js, ou consultez la référence complète de l'API. Pour les codes de vérification, lisez notre guide envoyer des codes OTP par SMS.

Tous les articles

Prêt à envoyer vos premiers SMS professionnels ?

Créez votre compte gratuitement, importez vos contacts et préparez vos messages. Vous activez l'envoi quand vous êtes prêt.