Numéros de téléphone ivoiriens : formats, préfixes et validation pour développeurs
Un numéro mal formaté est le premier motif d'échec d'un envoi. Voici les formats à accepter, comment les normaliser et reconnaître l'opérateur.
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.
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.
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
}
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.');
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.
| Code | Signification | Que faire |
|---|---|---|
| 401 | Clé API invalide ou révoquée | Vérifier la variable d'environnement |
| 402 | Crédits insuffisants | Recharger, puis relancer |
| 403 | Compte désactivé ou aucun expéditeur approuvé | Vérifier le compte |
| 422 | Champ manquant ou expéditeur non approuvé | Corriger la requête (ne pas relancer telle quelle) |
| 502 | L'opérateur n'a pas confirmé l'envoi | Vé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.
message_id retourné pour retrouver un envoi en cas de réclamation.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.
Un numéro mal formaté est le premier motif d'échec d'un envoi. Voici les formats à accepter, comment les normaliser et reconnaître l'opérateur.
Un SMS en quelques lignes avec requests, puis une fonction propre, réutilisable dans Django, FastAPI ou vos scripts.
Aucune dépendance nécessaire : Node.js 18+ intègre fetch. Exemples en JavaScript, TypeScript et Express.
Créez votre compte gratuitement, importez vos contacts et préparez vos messages. Vous activez l'envoi quand vous êtes prêt.