12 de abril de 202610 min de leitura

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.

  1. composer require guzzlehttp/guzzle vlucas/phpdotenv
  2. Crie o arquivo .env com WHATSAPP_TOKEN, PHONE_NUMBER_ID, VERIFY_TOKEN e APP_SECRET
  3. Crie a classe WhatsAppClient para encapsular as chamadas à API
  4. 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.

Valide a assinatura HMAC do webhook em produção. Use hash_hmac('sha256', $body, $appSecret) e compare com o valor do header HTTP_X_HUB_SIGNATURE_256 (sem o prefixo 'sha256=').

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.

  1. php artisan make:controller WhatsAppWebhookController
  2. Adicione rotas GET e POST para /api/webhook/whatsapp em routes/api.php
  3. Adicione a rota ao array $except do VerifyCsrfToken middleware
  4. php artisan make:job ProcessWhatsAppMessage para processamento assíncrono
  5. Configure a queue driver para Redis ou database em produção
  6. 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.