SDK PHP para WhatsApp, Instagram e Messenger: os três canais em 15 linhas
O SDK PHP oficial da WAME manda mensagem no WhatsApp, Instagram e Messenger com a mesma chamada — só muda o provider. Instalação via Composer, envio de texto, mídia, botões e listas, e o parser de webhook que já vem pronto.
PHP move a maior parte dos sistemas de gestão feitos no Brasil. ERP, sistema de clínica, controle de oficina, portal de imobiliária — muita coisa que roda bem e fatura bem é PHP. E o cliente desses sistemas quer WhatsApp dentro deles.
Este guia mostra o SDK PHP da WAME do zero até receber mensagem, com os três canais.
Instalação
composer require raphaelvserafim/client-php-api-wa-me
<?php
require 'vendor/autoload.php';
use Api\Wame\Wame;
$wa = new Wame([
'server' => 'https://server.api-wa.me',
'key' => 'YOUR_INSTANCE_KEY',
]);
A chave sai do portal ao criar a instância. Guarde no .env como qualquer credencial — nunca no código versionado.
Enviar a primeira mensagem
$to = "5566996852025"; // internacional, só dígitos
$result = $wa->message->sendText($to, "Seu pedido #1042 saiu para entrega 🚚");
if ($result) {
$data = json_decode($result);
echo "Enviada! ID: " . $data->data->key->id;
} else {
echo "Falha no envio.";
}
São as 15 linhas do título, composer require incluído.
Guarde o key->id retornado: é ele que aparece no webhook de status de entrega, e é por ele que você amarra "mandei" com "foi entregue".
Os três canais, a mesma chamada
Aqui está a diferença que costuma decidir a escolha do fornecedor. O provider pode valer para o client inteiro:
use Api\Wame\Provider;
$wa = new Wame([
'server' => 'https://server.api-wa.me',
'key' => 'YOUR_INSTANCE_KEY',
'provider' => Provider::INSTAGRAM,
]);
$wa->message->sendText('IG_USER_ID', 'Oi! Vi que você comentou no post.');
Ou por mensagem:
$wa->message->sendText('5511999999999', 'Oi', Provider::WHATSAPP);
$wa->message->sendText('IG_USER_ID', 'Oi', Provider::INSTAGRAM);
$wa->message->sendText('PSID_MESSENGER','Oi', Provider::MESSENGER);
Mesmo método, mesma assinatura, mesmo tratamento de erro. Não são três integrações — é uma instância cobrindo os três canais.
Além do texto
// Imagem por URL pública
$wa->message->sendImage($to, 'https://exemplo.com/nota-fiscal.jpg', 'Sua NF-e');
// Documento
$wa->message->sendDocument($to, 'https://exemplo.com/boleto.pdf', 'boleto-outubro.pdf');
// Áudio
$wa->message->sendAudio($to, 'https://exemplo.com/audio.mp3');
Para botões e menus de lista, o guia de envio pela API tem os formatos completos — os endpoints são os mesmos que o SDK encapsula.
Receber: configurar o webhook
$wa->instance->updateWebhook([
'allowWebhook' => true,
'allowNumber' => 'all',
'webhookFormat' => 'meta',
'webhookMessage' => 'https://seusistema.com.br/webhook/wame',
]);
O webhookFormat => 'meta' importa: é ele que faz os eventos chegarem no envelope padrão da Cloud API, o mesmo para os três canais.
Receber: o parser pronto
Sem SDK, você navegaria o JSON aninhado na mão e escreveria as guardas que faltam na primeira versão de todo mundo. O SDK já faz:
<?php
require 'vendor/autoload.php';
use Api\Wame\Wame;
// Responda 200 ANTES de processar. Webhook que demora é reenviado,
// e o cliente recebe a mesma resposta duas ou três vezes.
http_response_code(200);
header('Content-Type: application/json');
echo '{"ok":true}';
if (function_exists('fastcgi_finish_request')) {
fastcgi_finish_request(); // devolve ao cliente e segue processando
}
$payload = json_decode(file_get_contents('php://input'), true);
$msg = Wame::parseMeta($payload);
// Status de entrega também cai aqui. Sem esta guarda,
// o sistema responde a si mesmo.
if (!$msg || $msg['type'] !== 'text') {
exit;
}
registrarNoSistema([
'canal' => $msg['provider'], // whatsapp | instagram | messenger
'de' => $msg['from'],
'texto' => $msg['text'],
'messageId' => $msg['id'],
]);
O fastcgi_finish_request() é o detalhe que separa quem já apanhou de quem vai apanhar: em PHP-FPM ele devolve a resposta HTTP e continua a execução em segundo plano. Sem isso, o webhook fica aberto durante todo o processamento e a plataforma reenvia por timeout.
Em Laravel
Nada de especial — é um pacote Composer:
// config/wame.php
return [
'server' => env('WAME_SERVER', 'https://server.api-wa.me'),
'key' => env('WAME_KEY'),
];
// AppServiceProvider::register()
$this->app->singleton(Wame::class, fn () => new Wame([
'server' => config('wame.server'),
'key' => config('wame.key'),
]));
E o webhook como rota normal, com o processamento numa Job para responder rápido:
Route::post('/webhook/wame/{segredo}', function (Request $req, string $segredo) {
abort_unless(hash_equals(config('wame.webhook_secret'), $segredo), 404);
ProcessarMensagemWame::dispatch($req->all());
return response()->json(['ok' => true]); // 200 na hora; a Job processa depois
});
O segredo no caminho da URL é o mínimo de proteção: sem ele, qualquer um que descubra o endereço posta evento forjado. As camadas seguintes estão em webhook em produção.
Quando o SDK não é o caminho
Se o seu sistema é PHP legado sem Composer, ou se você só precisa de um envio pontual, a API REST resolve com curl puro:
$ch = curl_init("https://us.api-wa.me/SUA_KEY/message/text");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode(['to' => $to, 'text' => 'Olá!']),
]);
$res = curl_exec($ch);
Mesma API por trás. O SDK poupa o boilerplate e o parser; ele não é obrigatório.
Conclusão
Colocar WhatsApp num sistema PHP é composer require mais 15 linhas. O que costumava ser projeto — app na Meta, verificação de negócio, três integrações para três canais — não está mais no caminho.
Se você trabalha em Node, o SDK JavaScript e TypeScript tem a mesma cobertura com tipagem completa. E se você entrega esse módulo para vários clientes, vale ver como provisionar instância por API — o mesmo SDK cria e desativa conta sem ninguém abrir painel.
A referência completa está em docs/sdk/php.
Pronto para automatizar seu WhatsApp?
Crie sua conta gratuita e comece a enviar mensagens pela API em minutos.
Começar grátisPerguntas frequentes
Como instalar o SDK PHP da WAME?+
Via Composer: composer require raphaelvserafim/client-php-api-wa-me. Depois basta instanciar a classe Wame com o servidor e a chave da instância. Não há dependência de extensão exótica — funciona em qualquer PHP moderno, com ou sem framework.
O SDK PHP funciona com Laravel?+
Sim. É um pacote Composer comum, sem service provider obrigatório. Você pode instanciar direto onde precisar ou registrar como singleton no container, guardando a chave da instância no config e no .env como qualquer outra credencial.
Dá para enviar no Instagram e no Messenger com o mesmo SDK?+
Sim, e com o mesmo método. O provider pode ser definido uma vez ao criar o client, valendo para todas as chamadas, ou passado por mensagem como último argumento. O código de envio é idêntico nos três canais.
Como receber mensagens em PHP?+
Configure o webhook da instância com webhookFormat 'meta' e aponte para um endpoint seu. O SDK traz o parser parseMeta() que lê o envelope da Cloud API e devolve os campos já extraídos, então você não precisa navegar no JSON aninhado à mão.
Preciso de servidor próprio para usar o SDK PHP?+
Para enviar, não: qualquer script PHP com acesso à internet basta, inclusive uma hospedagem compartilhada. Para receber mensagens você precisa de uma URL pública em HTTPS, porque o webhook é uma requisição que chega de fora até o seu código.
Continue lendo
Como criar e integrar uma API de WhatsApp (cURL, Node.js e PHP)
Tutorial passo a passo para integrar uma API de WhatsApp: conectar o número por QR Code e enviar sua primeira mensagem com cURL, Node.js (SDK oficial) e PHP. Com exemplos de código prontos.
Como criar um chatbot de IA com a API da OpenAI para responder no WhatsApp
Um webhook, uma chamada à API da OpenAI e uma resposta pela WAME API: o código completo de um chatbot de IA que atende no WhatsApp, Instagram e Messenger. Com memória por contato, controle de custo e o que fazer quando a IA não deve responder.
Cobrança por Pix dentro do WhatsApp pela API: como enviar e o que muda na conversão
Mandar o código Pix no WhatsApp resolve o pior ponto da cobrança digital: o cliente não precisa sair do app. Como enviar a cobrança pela API, tratar a confirmação e evitar os erros que transformam a facilidade em suporte.