Table des matières
Fondamentaux
Connecter & Envoyer
Production
Guide de l'API WhatsApp en PHP
API WhatsApp avec PHP: Le guide d'intégration complet
Appels Guzzle et cURL pour connecter un compte WhatsApp, envoyer et recevoir des messages, gérer les groupes et exécuter le tout dans un Laravel application, sans enregistrer d'application Meta Business. Il s'agit de API WhatsApp en PHP de bout en bout : connexion, webhooks, SaaS multi-tenant et le coût réel par message.
Pas de vérification Meta Business
Guzzle & cURL, pas de SDK abandonné
Utiliser GuzzleHttp\Client;
$client = new Client([
'base_uri' => 'https://api1.unipile.com:13111',
'headers' => ['X-API-KEY' => $apiKey],
]);
// Fournisseur WHATSAPP : pas d'application Meta, pas de WABA
$res = $client->poste('/api/v1/accounts', [
'json' => ['provider' => 'WhatsApp'],
]);201 Créé, account_id renvoyé
Même modèle pour
Définition
Qu'est-ce que l'API WhatsApp en PHP ?
Le API WhatsApp en PHP est la pratique consistant à appeler une API REST WhatsApp à partir d'un environnement d'exécution PHP, que ce soit PHP-FPM, un script CLI ou un worker de queue, en utilisant un client HTTP tel que Guzzle ou cURL. Il n'existe pas d'API WhatsApp conçue spécifiquement pour PHP : Meta et les fournisseurs d'API exposent du JSON brut via HTTPS, et PHP est simplement le langage qui effectue la requête, de la même manière qu'il appellerait n'importe quelle autre API web.
En pratique, une intégration PHP de l'API WhatsApp est un appel HTTP normal : une méthode, une URL, un corps JSON ou multipart, et un
X-API-KEY en-tête. Rien ici ne dépend d'une fonctionnalité exclusive à PHP ou d'un point de terminaison exclusif à PHP. Ce qui change entre l'API Cloud, un fournisseur de solutions professionnelles (BSP) et un compte lié n'est pas le langage, c'est qui possède le numéro WhatsApp et si la vérification Meta Business se situe entre vous et votre premier message. Pour une analyse complète de cet écosystème, consultez le Guide d'intégration de l'API WhatsApp.JSON simple sur HTTPS
Chaque appel est un cycle requête/réponse que Guzzle ou cURL savent déjà effectuer.
L'authentification est un en-tête statique
Un
X-API-KEY valeur, pas de danse OAuth, pas de boucle de rafraîchissement de jeton à écrire.Indépendant de l'environnement d'exécution
Fonctionne de la même manière dans PHP-FPM, une commande de console Symfony ou un travail de file d'attente Laravel.
Décision
Quelle API WhatsApp devez-vous utiliser depuis PHP ?
Il y a trois façons d'appeler WhatsApp à partir d'un backend PHP : API Cloud de Meta directement, un Fournisseur de solutions d'affaires la revente d'accès à celui-ci, ou un compte associé via une API unifiée comme Unipile. Les trois renvoient du JSON que votre code PHP analyse de la même manière, ce qui change c'est le temps de configuration, si la vérification Meta Business se trouve en amont de votre premier message, et si vous récupérez un historique de conversation existant ou si vous partez de zéro.
Critères
API Cloud (direct)
BSP
Compte lié
Vérification Meta Business
Requis
Requis
Pas nécessaire
Délai avant le premier message
Quelques jours à quelques semaines
Intégration plus rapide, mêmes exigences sous-jacentes
rapidement
Numéro de téléphone
Nouveau numéro enregistré sur un WABA
Nouveau numéro provisionné par le BSP
Le propre numéro WhatsApp de l'utilisateur
Accès aux conversations existantes
Non, commence vide
Non, commence vide
Oui, l'historique complet
Meilleur ajustement
Un numéro d'entreprise diffusant à de nombreux clients
Pareil, avec une couche d'intégration gérée
Un produit où chaque utilisateur lie le compte WhatsApp qu'il possède déjà
Si votre application PHP est un produit SaaS où chaque client connecte son propre WhatsApp, un compte lié supprime entièrement l'étape de vérification Meta. Si vous diffusez à partir d'un numéro d'entreprise unique, l'API Cloud ou un BSP constitue le point de départ approprié à la place.
Créer avec un compte lié Mise en place
De quoi avez-vous besoin avant d'écrire du code PHP ?
Vous avez besoin PHP 8.1 ou plus récent, Compositeur, le Guzzle Client HTTP et une clé API Unipile. Aucun kit de développement logiciel (SDK) PHP n'est activement maintenu pour Unipile aujourd'hui, donc chaque exemple de ce guide communique avec le
/api/v1 API REST directement.PHP 8.1+
Les propriétés typées et les arguments nommés permettent de garder le code client court.
Compositeur
Gestionnaire de dépendances standard, requis pour inclure Guzzle.
Guzzle 7
Client HTTP pour requêtes JSON et multipart, avec un mécanisme de secours cURL.
Clé API Unipile
Envoyé en tant que
X-API-KEY sur chaque requête, générée depuis votre tableau de bord.composer require guzzlehttp/guzzle:^7.0Existe-t-il un SDK PHP ? Pas un qu'il faut installer.
Un paquet communautaire,
unipile/unipile-php-sdk, existe sur Packagist, mais il est répertorié comme abandonné: aucun commit depuis le 17 octobre 2023, 5 étoiles sur GitHub, et il cible une ancienne URL de base d'API. Ne pas exécuter composer require unipile/unipile-php-sdk. Le SDK Node.js (unipile-node-sdk) est officiellement maintenu et à jour, mais pour PHP, Guzzle directement contre l'API REST est la voie fiable, et c'est ce que chaque exemple ci-dessous utilise. Voir La documentation de Guzzle pour les options client utilisées ici.Mise en œuvre
Comment connecter un compte WhatsApp depuis PHP ?
Connecter un compte WhatsApp depuis PHP en prend un
POST requête avec le fournisseur défini sur WHATSAPP, puis une action de l'utilisateur final : l'utilisateur final scanne le code QR renvoyé depuis WhatsApp > Appareils connectés, ou saisit un code d'appairage sur son téléphone si vous en avez demandé un à la place. Pas d'application développeur Meta, pas de WABA, pas d'étape de vérification.1
Demander un point de contrôle, code QR par défaut
Appeler le point de terminaison des comptes avec seulement
provider jeu. Unipile renvoie un account_id plus un ensemble de données de point de contrôle conçu pour le parcours QR.$response = $client->poste('/api/v1/accounts', [
'json' => ['provider' => 'WhatsApp'],
]);
$payload = json_decode(Réponse $->obtenirCorps()->obtenirLeContenu(), true);
$accountId = $payload['identifiant_de_compte'];
// La charge utile $ contient également le point de contrôle à afficher dans le
le code QR à scanner depuis WhatsApp > Appareils connectés
// périphériques. var_dump($payload) en utilisant à nouveau votre propre clé
// pour voir la forme exacte avant de connecter le frontend.2
Ou demandez plutôt un code d'appairage
Passe
couplage_numéro_de_téléphone en chiffres au format E.164, sans signe plus, lorsqu'il n'est pas pratique de scanner un code QR, par exemple un agent du support qui intègre un client par téléphone.$response = $client->poste('/api/v1/accounts', [
'json' => [
'provider' => 'WhatsApp',
'pairing_phone_number' => '33612345678',
],
]);
$payload = json_decode(Réponse $->obtenirCorps()->obtenirLeContenu(), true);
$accountId = $payload['identifiant_de_compte'];
// Le point de contrôle ici est le code que votre interface utilisateur montre à l'utilisateur
// à taper dans WhatsApp > Appareils connectés > Associer un appareil
// utilisez plutôt un numéro de téléphone.3
Interroger l'état du système jusqu'à ce que le compte soit entièrement lié
Le compte reste dans un
CONNEXION état jusqu'à ce que le code QR soit scanné ou que le code d'appairage soit saisi. Vérifier sources[0].status sur le compte.$response = $client->obtenir(""/api/v1/accounts/{$accountId}"");
$account = json_decode(Réponse $->obtenirCorps()->obtenirLeContenu(), true);
$status = $account['sources'][0]['statut'] ?? nul;
si ($status === OK) {
// Permet d'envoyer, de recevoir et d'afficher la liste des discussions en toute sécurité sur $accountId
}Interroger en boucle fonctionne mais gaspille des requêtes. Si votre application PHP possède déjà un point de terminaison de webhook, enregistrez-en un auprès de
statut_du_compte" à la place et réagissez au moment où le statut bascule vers OK. La configuration du webhook elle-même est abordée plus bas pour les messages entrants, et le même point de terminaison accepte les événements de statut de compte.Flux principal
Comment envoyer un message WhatsApp avec PHP et Guzzle ?
Envoyer un message depuis PHP est un
POST vers l'URL des messages du chat avec un text champ dans un corps multipartie. L'appel renvoie un ID du message dès que WhatsApp l'acceptera.$response = $client->poste(""/api/v1/chats/{$chatId}/messages"", [
'multipart' => [
['nom' => texte, 'contenu' => 'Bonjour ! Votre commande a été expédiée.'],
],
]);
$result = json_decode(Réponse $->obtenirCorps()->obtenirLeContenu(), true);
$messageId = $result['message_id'];Le même
multipartie le tableau transporte également pièces jointes, une message_vocal dossier, ou un identifiant_de_citation pour répondre à un message spécifique, Guzzle les joint en tant que champs multipart supplémentaires à côté de text. Pour une analyse complète de chaque types de messages pris en charge par l'API WhatsApp, y compris les modèles et la fenêtre de service de 24 heures, consultez notre guide dédié.Flux principal
Comment commence-t-on une nouvelle conversation depuis PHP ?
Commencer une conversation qui n'existe pas encore signifie appeler l'endpoint des chats avec un
account_id et un attendees_ids tableau au lieu d'un existant chat_id. Unipile crée le chat et, si vous incluez un text champ, envoie le premier message dans le même appel.$response = $client->poste('/api/v1/chats', [
'multipart' => [
['nom' => 'identifiant_de_compte', 'contenu' => [$accountId],
['nom' => 'attendees_ids[]', 'contenu' => '33612345678@s.whatsapp.net'],
['nom' => texte, 'contenu' => 'Bonjour, ici le support Acme.'],
],
]);
$result = json_decode(Réponse $->obtenirCorps()->obtenirLeContenu(), true);
$chatId = $result['chat_id'];Le destinataire est identifié par
{phone_number}@s.whatsapp.net, chiffres internationaux, sans signe plus au début, sans espaces. Stocker le retourné chat_id À côté de cet enregistrement utilisateur : chaque message après le premier passe par le point de terminaison des messages de la section précédente, et non par celui-ci.Flux principal
Comment récupère-t-on les discussions et les messages en PHP ?
La plupart des tutoriels sur l'API WhatsApp s'arrêtent à l'envoi. Un backend PHP a généralement aussi besoin de lister les conversations existantes d'un utilisateur, de parcourir son historique et de voir qui participe à une discussion. Trois points de terminaison couvrent ces besoins :
GET /api/v1/chats, GET /api/v1/chats/{chat_id}/messages, ou encore GET /api/v1/chats/{chat_id}/attendees, toutes paginées avec un curseur.Lister toutes les discussions WhatsApp d'un compte
$response = $client->obtenir('/api/v1/chats', [
'query' => [
''account_id' => $accountId,
'account_type' => 'WhatsApp',
'limit' => 50,
],
]);
$data = json_decode(Réponse $->obtenirCorps()->obtenirLeContenu(), true);
$chats = $data['articles'];
$nextCursor = $data['curseur'];Parcourir l'historique d'une conversation
$cursor = nul;
$all = [];
faire {
$res = $client->obtenir(""/api/v1/chats/{$chatId}/messages"", [
'requête' => array_filter(['curseur' => $cursor, 'limite' => 100]),
]);
$page = json_decode($res->obtenirCorps()->obtenirLeContenu(), true);
$all = array_merge($all, $page['articles']);
$cursor = $page['curseur'];
} tandis que ($cursor !== nul);Chaque point de terminaison de liste suit le même contrat de curseur : transmettez la réponse précédente
curseur rentre, arrête-toi quand il revient nul. Pour voir qui participe réellement à une conversation, appelez GET /api/v1/chats/{chat_id}/attendees: il renvoie celle de chaque participant id, provider_id et le nom affiché, ce dont vous avez besoin avant de pouvoir appeler ajouterUnParticipant ou supprimerLeParticipant sur un groupe plus loin dans ce guide.Production
Comment recevoir des messages WhatsApp avec un webhook PHP ?
Un webhook WhatsApp en PHP est un point de terminaison HTTPS public que Unipile appelle avec une charge utile JSON lors d'événements tels que
message_received. Votre script lit le corps brut, confirme que l'appel est authentique, répond rapidement et confie le travail réel à une file d'attente. Interrogation GET /api/v1/chats pour les nouveaux messages, cela fonctionne pour une démo, pas pour un produit ayant plus de quelques utilisateurs.1. Enregistrer le webhook, avec un secret partagé dans un en-tête personnalisé
$client->poste('/api/v1/webhooks', [
'json' => [
'source' => 'messagerie',
'request_url' => 'https://example.com/webhooks/whatsapp',
'events' => ['message_reçu'],
'headers' => [
['clé' => 'X-Webhook-Secret', 'valeur' => [$webhookSecret],
],
],
]);2. Vérifier, répondre, puis traiter
$rawBody = file_get_contents('php://input');
$provided = $_SERVER['HTTP_X_WEBHOOK_SECRET'] ?? '';
si (!hash_equals($expectedSecret, $provided)) {
http_response_code(401);
quitter;
}
http_response_code(200);
si (function_exists('fastcgi_finish_request')) {
fastcgi_finish_request();
}
$payload = json_decode($rawBody, true);
si (($payload['événement'] ?? nul) === 'message_reçu') {
// insérer la charge utile $ dans une table de file d'attente ou une liste Redis,
// ne jamais traiter un webhook en ligne
mettre_en_file_d_attente_message_whatsapp($payload) ;
}Unipile ne signe pas le corps du webhook avec un secret HMAC que vous recalculez, l'endpoint create-webhook expose un
en-têtes tableau à la place. Attachez votre propre secret en tant qu'en-tête personnalisé lorsque vous enregistrez le webhook, puis vérifiez-le avec hash_equals(), une comparaison de chaînes à temps constant, avant de faire confiance à la charge utile. Chaque champ de $charge utile, account_id, type_de_compte, événement, chat_id, ID du message, message et sender.attendee_provider_id, correspond aux documents JSON Unipile pour le webhook de messagerie.Production
Comment intégrer l'API WhatsApp dans une application Laravel ?
Laravel remplace trois éléments des exemples de code PHP natif ci-dessus : le
Http une façade au lieu d'un client Guzzle fait maison, un job en file d'attente au lieu d'un traitement synchrone, et une route avec un contrôleur au lieu d'un analyseur syntaxique php://input à la main. Les appels WhatsApp ci-dessous sont identiques à tous les exemples déjà présents dans ce guide.1. ConfigurationUne entrée dans services.php, valeurs provenant de .env
return [
// ...services existants
'unipile' => [
'base_uri' => env('UNIPILE_BASE_URI', 'https://api1.unipile.com:13111'),
'clé_api' => env('UNIPILE_API_KEY'),
'secret_de_webhook' => env('UNIPILE_WEBHOOK_SECRET'),
],
];2. Une classe de service mince basée sur la façade Http
espace de noms App\Services;
Utiliser Illuminate\Support\Facades\Http;
classe ServiceWhatsapp
{
protégé fonction client()
{
return Http::baseUrl(configuration('services.unipile.base_uri'))
->avecEn-têtes(['X-API-KEY' => configuration('services.unipile.api_key')]);
}
public fonction sendMessage(chaîne $chatId, chaîne $text) : tableau
{
return $this->client()
->enMultipart()
->poste(""/api/v1/chats/{$chatId}/messages"", [
['nom' => texte, 'contenu' => [$text],
])
->json();
}
}3. Route et contrôleur de webhook
Route::poste('/webhooks/whatsapp', [WhatsappWebhookController::classe, 'poignée']);public function handle(Request $request)
{
$provided = $request->header('X-Webhook-Secret', '');
if (!hash_equals(config('services.unipile.webhook_secret'), $provided)) {
abort(401);
}
if ($request->input('event') === 'message_received') {
ProcessWhatsappMessage::dispatch($request->all());
}
return response()->json(['status' => 'received']);
}4. Un travail en file d'attente, de sorte que la route du webhook reste rapide
classe TraiterMessageWhatsapp met en œuvre ShouldQueue
{
Utiliser Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public fonction __construct(public tableau $payload) {}
public fonction poignée(): vide
{
// rechercher le locataire à l'aide de $this->payload['account_id'],
// stocker le message, notifier le bon utilisateur
}
}L'itinéraire ne touche jamais directement Guzzle, il passe par
Développez-le avec Laravel ServiceWhatsapp, ce qui rend les appels WhatsApp simulables dans les tests de la même manière que n'importe quelle autre intégration HTTP Laravel. Voir Documentation du client HTTP de Laravel pour simuler ces requêtes dans votre suite de tests.Production
Comment gérez-vous les groupes WhatsApp à partir de PHP ?
Gérer un groupe WhatsApp depuis PHP est un jeu d'enfant
PATCH appel à l'écouteur de discussion avec un action champ ajouterUnParticipant, supprimerLeParticipantou obtenirLienInvitation. La propre fonctionnalité de groupe de l'API Cloud de Meta limite un groupe à 8 participants et n'expose aucun point de terminaison pour ajouter quelqu'un directement, seulement un lien d'invitation à partager.Ajouter un participant
$client->correctif(""/api/v1/chats/{$groupChatId}"", [
'json' => [
'action' => 'ajouterUnParticipant',
'valeur' => '33612345678@s.whatsapp.net',
],
]);Obtenir le lien d'invitation
$res = $client->correctif(""/api/v1/chats/{$groupChatId}"", [
'json' => ['action' => 'obtenirLienInvitation'],
]);
$link = json_decode($res->obtenirCorps()->obtenirLeContenu(), true)['lien_invitation'];supprimerLeParticipant prend la même forme que ajouterUnParticipant, avec l'identifiant WhatsApp du participant dans valeur. C'est la seule action que l'API Groups de Meta n'expose pas du tout, l'ajout de quelqu'un se fait uniquement par le lien d'invitation de son côté. Pour chaque limite, le plafond de 10 000 groupes par numéro et ce qui n'est toujours pas pris en charge, voir le API de groupe WhatsApp référence.Échelle
Comment gérez-vous de nombreux comptes utilisateurs à partir d'une seule application PHP ?
Un produit SaaS PHP n'a pas un seul compte WhatsApp, il en a un par client. Il n'y a qu'un seul Unipile
X-API-KEY pour toute votre application, mais un distinct account_id pour chaque utilisateur final qui associe son WhatsApp. Le modèle consiste à stocker cela account_id à côté de votre propre ligne de locataire, et transmettez-le explicitement à chaque appel qui pourrait autrement croiser les comptes.// Dans le gestionnaire de webhook : trouver quel locataire
// le message appartient à avant de faire quoi que ce soit avec.
$stmt = $pdo->préparer('SELECT id FROM tenants WHERE unipile_account_id = ?');
$stmt->exécutez([$payload['identifiant_de_compte']]);
$tenantId = $stmt->récupérerColonne();
si ($tenantId === faux) {
// ID de compte inconnu, rejeter plutôt que de deviner le locataire
http_response_code(404);
quitter;
}
// Sortant : transmettre account_id pour qu'un chat_id obsolète ou réutilisé puisse
// ne jamais envoyer via le numéro WhatsApp du mauvais locataire.
$client->poste(""/api/v1/chats/{$chatId}/messages"", [
'multipart' => [
['nom' => texte, 'contenu' => [$text],
['nom' => 'identifiant_de_compte', 'contenu' => [$expectedAccountId],
],
]);L'optionnel
account_id Le champ sur l'endpoint des messages existe spécifiquement pour empêcher l'envoi dans un chat en dehors de ce compte, considérez-le comme obligatoire dans une base de code multi-tenant même si l'API ne l'exige pas. Chiffrez le stockage account_id valeurs au repos comme n'importe quel autre identifiant client : elles ne sont pas secrètes en elles-mêmes, mais constituent la clé de liaison entre votre table d'utilisateurs et les vraies conversations WhatsApp de quelqu'un.Pièges
Quelles sont les erreurs les plus courantes spécifiques à PHP ?
La plupart des bugs de l'API WhatsApp dans une base de code PHP proviennent de PHP lui-même, et non de l'API. Ces cinq-là reviennent sans cesse dans les intégrations en production.
Tronquer un message avec substr() au lieu de mb_substr()
de PHP
substr() compte les octets, pas les caractères. Un emoji est une séquence UTF-8 multi-octet, le couper en deux revient à envoyer un caractère cassé ou un JSON invalide. Utilisez toujours les fonctions multi-octets sur le texte WhatsApp généré par l'utilisateur.$safe = mb_substr($text, 0, 4096, 'UTF-8');Erreur cURL 60 sous Windows et XAMPP
"Problème de certificat SSL : impossible d'obtenir le certificat de l'émetteur local. Les versions de PHP pour Windows et XAMPP sont souvent livrées sans bundle de CA actuel configuré dans php.ini, de sorte que les appels HTTPS de Guzzle échouent même si le code est correct.
curl.cainfo = "C:\php\extras\cacert.pem"
openssl.cafile = "C:\php\extras\cacert.pem"max_execution_time tue le webhook avant qu'il ne réponde
Une valeur par défaut de 30 secondes est amplement suffisante jusqu'à ce que le gestionnaire effectue un appel sortant lent avant de répondre. Si Unipile n'obtient pas de réponse rapide, il réessaie, et un gestionnaire lent commence à traiter le même message deux fois. Répondez d'abord, travaillez ensuite, comme indiqué dans la section webhook ci-dessus.
Pas de temporisation sur les réponses 429 ou 5xx
Un serré
tandis que Une boucle qui réessaye immédiatement en cas d'échec transforme une limite de taux en une panne auto-infligée. Attendez, et augmentez le temps d'attente à chaque échec consécutif.pour ($attempt = 1 ; $attempt <= 5; $attempt++) {
essayer {
return $client->poste($uri, $options) ;
} attraper (ConnectException | ServerException $e) {
usleep((2 ** $attempt) * 100_000); // 0,2 s, 0,4 s, 0,8 s...
}
}Enregistrer la réponse brute et appeler ça du débogage
Si vous construisez un corps JSON à la main au lieu de laisser celui de Guzzle
json gérer l'option, ajouter JSON_UNESCAPED_UNICODE à json_encode(). Sans cela, les émojis et les noms accentués apparaissent sous forme échappée. \u séquences dans vos journaux, ce qui est techniquement du JSON valide mais illisible lorsque vous essayez de déboguer une vraie conversation.Coût
Combien coûte l'envoi de messages WhatsApp depuis PHP ?
Rien dans le code PHP ne modifie le prix. Meta facture par message depuis le 1er juillet 2025, et non par conversation. La seule chose que votre code contrôle est le timing : une réponse envoyée dans la fenêtre de service de 24 heures suivant le message d'un utilisateur reste gratuite, et l'appel identique envoyé une heure plus tard est facturable.
Modèles d'utilitaires et d'authentification restez libre pendant une fenêtre de service ouverte, facturé en dehors de celle-ci.
Modèles de marketing sont facturés quelle que soit la fenêtre.
Les tarifs par message varient selon le pays du destinataire et la catégorie du message, et non selon la bibliothèque client que vous utilisez pour les envoyer.
Horodatez chaque message entrant que reçoit votre webhook PHP et conservez une valeur " fenêtre ouverte jusqu'à " par conversation, c'est la seule donnée dont votre logique de facturation a réellement besoin. Pour les utilisateurs actuels tarification WhatsApp par message par pays et par catégorie, consultez la ventilation complète des prix.
API WhatsApp avec PHP - FAQ
Des réponses directes sur la connexion, l'envoi, Laravel et le SDK PHP abandonné.
Créer un client Guzzle pointant vers l'API REST Unipile, appeler
POST /api/v1/accounts avec fournisseur WHATSAPP pour obtenir un code QR ou un code d'appairage, demandez à l'utilisateur de le finaliser sur son téléphone, puis utilisez le même client pour GET, POST et PATCH appels pour envoyer des messages, lister les discussions et gérer les groupes. Il n'y a pas de point de terminaison spécifique à PHP, chaque appel est une requête HTTP normale avec un X-API-KEY en-tête. Le connecter un compte WhatsApp La section ci-dessus détaille le code exact.Oui. Un seul
POST à /api/v1/chats/{chat_id}/messages avec un text champ dans un corps multipart envoie le message et renvoie un ID du message, voir les envoyer la section ci-dessus pour l'appel Guzzle exact.Seulement si vous passez directement par l'API Cloud de Meta ou par un fournisseur de solutions commerciales (Business Solution Provider) construit sur celle-ci. La connexion d'un compte WhatsApp via Unipile lie le numéro WhatsApp existant de l'utilisateur par code QR ou code d'appairage et ne nécessite aucune vérification d'entreprise Meta.
Aucun n'est activement maintenu. Un paquet communautaire,
unipile/unipile-php-sdk, est sur Packagist mais marqué abandonné, sans commit depuis le 17 octobre 2023 et avec 5 étoiles sur GitHub. Tous les exemples de ce guide appellent plutôt directement l'API REST via Guzzle, ce que faisait également le SDK abandonné en interne.Vous ne pouvez pas recevoir de webhooks sans une URL HTTPS accessible publiquement, c'est ainsi que fonctionnent les rappels HTTP. Pendant le développement local, créez un tunnel pour un port local avec un service comme ngrok et pointez le webhook vers
request_url à l'adresse HTTPS du tunnel. Interrogation du point de terminaison des messages est la solution de repli lorsqu'un point de terminaison public s'avère réellement impossible, au détriment de la latence et de requêtes supplémentaires.Oui, rien de tout cela n'est spécifique à un framework. Le Section Laravel ci-dessus encapsule les mêmes appels équivalents à Guzzle dans le
Http façade, un job en file d'attente, ainsi qu'une route et un contrôleur de webhook, ce qui représente la manière idiomatique de l'estructurer dans une base de code Laravel.Oui, c'est la structure SaaS normale. Une seule clé API Unipile couvre toute l'application, tandis que chaque utilisateur final obtient la sienne.
account_id après avoir connecté leur WhatsApp. Stockez cet identifiant à côté de votre enregistrement de locataire et transmettez-le lors des appels sortants pour éviter les envois inter-locataires, voir le section multi-locataire au-dessus.PATCH /api/v1/chats/{chat_id} avec {"action" : "addParticipant", "value" : "@s.whatsapp.net"}. La propre fonction de groupe de l'API Cloud de Meta n'a pas d'équivalent, seulement un lien d'invitation, ce qui est l'une des différences les plus évidentes entre la construction directe sur Meta et le passage par Unipile. Les détails dans le section des groupes au-dessus.Presque toujours parce qu'une chaîne a été tronquée avec
substr() au lieu de mb_substr(). Les fonctions de chaînes de caractères de base de PHP comptent les octets, et un émoji est une séquence UTF-8 multi-octet ; coupé au milieu, il se transforme en caractère invalide ou corrompt complètement la charge utile JSON.Guzzle suffit, c'est un client HTTP construit sur l'extension cURL de PHP, et non un remplacement pour celle-ci. Chaque requête de ce guide utilise Guzzle ; un brut
curl_init() l'appel fonctionne de manière identique si un projet ne peut pas ajouter la dépendance, les corps JSON et multipart sont les mêmes dans les deux cas.De la même manière que pour n'importe quel autre moyen. Meta facture par message depuis le 1er juillet 2025, en fonction de la catégorie et du pays du destinataire, et non de la bibliothèque client utilisée pour appeler l'API. Voir le section des coûts au-dessus et le guide complet des prix pour les tarifs actuels.
Oui, cela ne disparaît pas, cela détermine simplement ce qui est gratuit plutôt que ce qui est techniquement autorisé. Une réponse dans la fenêtre de 24 heures suivant le dernier message d'un utilisateur est envoyée sans être facturée comme un message modèle, le code PHP qui ignore cette fenêtre paie simplement pour des messages dont il n'avait pas besoin.
Vous avez encore des questions sur la façon de construire ceci en PHP ? Notre équipe est là pour vous aider.
Guide de l'API WhatsApp en PHP
Prêt à intégrer l'API WhatsApp dans votre application PHP ?
Chaque point de terminaison de ce guide, connect, send, receive, groups, fonctionne sur le même compte Unipile que vous pouvez créer dès maintenant. Pas de vérification Meta Business, pas de SDK abandonné, juste
Guzzle et une API REST que votre application PHP sait déjà appeler.Automatiser au lieu d'intégrer dans une application existante ? Lisez la même intégration en Python.