API do WhatsApp Business com PHP: Tutorial Completo 2026
PHP ainda é a linguagem de servidor mais usada no mundo, e integrar a API do WhatsApp Business com PHP é mais simples do que parece. Com cURL ou a biblioteca Guzzle, você envia mensagens, processa webhooks e cria chatbots sem precisar migrar sua stack.
Configuração e dependências
A forma mais simples de fazer chamadas HTTP em PHP é com a biblioteca Guzzle, que abstrai o cURL e fornece uma API limpa para requisições. Para o webhook, qualquer servidor PHP (Apache, Nginx com PHP-FPM, Laravel, Slim) funciona.
- composer require guzzlehttp/guzzle vlucas/phpdotenv
- Crie o arquivo .env com WHATSAPP_TOKEN, PHONE_NUMBER_ID, VERIFY_TOKEN e APP_SECRET
- Crie a classe WhatsAppClient para encapsular as chamadas à API
- Crie o endpoint webhook.php para processar eventos recebidos
Enviando mensagens de texto com PHP e Guzzle
A função de envio cria uma instância do Guzzle Client com o base_uri da Graph API e o header Authorization com o token. O método post() envia o payload JSON com o número do destinatário e o conteúdo da mensagem.
Em caso de erro, capture GuzzleException e registre o response body para diagnóstico. Erros comuns são token expirado, número inválido e template não aprovado.
- Base URI: https://graph.facebook.com/v19.0/
- Endpoint: {PHONE_NUMBER_ID}/messages
- Headers: Content-Type: application/json, Authorization: Bearer {token}
- Body mínimo para texto: messaging_product, recipient_type, to, type='text', text.body
Implementando o webhook em PHP puro
O arquivo webhook.php precisa tratar dois tipos de requisição: GET (verificação inicial da Meta) e POST (eventos de mensagem). Use $_SERVER['REQUEST_METHOD'] para diferenciar.
Na verificação GET, compare $_GET['hub_verify_token'] com seu token secreto e imprima $_GET['hub_challenge'] sem headers adicionais. Na requisição POST, leia o body com file_get_contents('php://input') e decodifique o JSON.
Integração com Laravel
Em um projeto Laravel, crie um Controller para o webhook, registre as rotas no routes/api.php e use o sistema de Jobs para processamento assíncrono das mensagens. Isso garante resposta rápida ao webhook e processamento em background.
- php artisan make:controller WhatsAppWebhookController
- Adicione rotas GET e POST para /api/webhook/whatsapp em routes/api.php
- Adicione a rota ao array $except do VerifyCsrfToken middleware
- php artisan make:job ProcessWhatsAppMessage para processamento assíncrono
- Configure a queue driver para Redis ou database em produção
- php artisan make:service WhatsAppService para encapsular a lógica de envio
Enviando templates com parâmetros dinâmicos
Para enviar um template com variáveis, monte o array components com um objeto do tipo body e o array parameters com os valores. Cada variável {{1}}, {{2}} corresponde a um objeto no array na mesma ordem.
- tipo 'header': parâmetros que aparecem no cabeçalho do template
- tipo 'body': parâmetros do corpo principal da mensagem
- tipo 'button': parâmetros de botões com URL dinâmica
- Variáveis de data e número também usam type='text'
Deploy e configuração no servidor
O webhook precisa ser HTTPS. Use Certbot com Let's Encrypt para configurar SSL gratuitamente em um VPS com Apache ou Nginx. Configure o DocumentRoot para o diretório público do projeto e garanta que as variáveis de ambiente estão disponíveis para o PHP-FPM.
- Apache: configure mod_rewrite para o .htaccess do Laravel
- Nginx: use fastcgi_pass para o PHP-FPM e configure try_files para o index.php
- Certbot: certbot --nginx -d seudominio.com.br para SSL automático
- Variáveis de ambiente: use .env ou variáveis de sistema, nunca hardcode no código
Perguntas frequentes
Posso usar PHP 7 ou preciso do PHP 8?
PHP 8.1 ou superior é recomendado. Guzzle 7 requer PHP 7.2+, mas recursos modernos como enums, fibras e match expressions que simplificam o código de webhook requerem PHP 8.1+. Laravel 11 requer PHP 8.2+.
Como processar mensagens de áudio enviadas pelo usuário?
O webhook recebe o media_id do áudio. Faça um GET para graph.facebook.com/v19.0/{media_id} com o token de acesso para obter o URL de download. Depois baixe o arquivo com Guzzle. Para transcrever, envie para a API Whisper da OpenAI.
É possível usar a API do WhatsApp com WordPress?
Sim. Você pode criar um plugin WordPress que processa o webhook via um endpoint REST personalizado (register_rest_route). Para envio, use wp_remote_post() como alternativa ao Guzzle. Existem plugins prontos no repositório do WordPress, mas avalie a qualidade antes de usar em produção.
Como evitar duplicação de processamento no webhook?
Guarde o message_id de cada mensagem processada em banco de dados ou Redis com TTL de 24 horas. No início do processamento, verifique se o ID já existe. Se sim, retorne 200 sem processar novamente. A Meta pode reenviar o mesmo evento em caso de timeout.
Guzzle ou cURL puro: qual usar para produção?
Guzzle para qualquer projeto sério. Ele gerencia conexões, retry, timeouts e tratamento de erros de forma muito mais robusta que cURL puro. O overhead é mínimo e o ganho em manutenibilidade é significativo.