Skip to main content
Ao final desta página, seu projeto Laravel envia um template de um job em fila e registra o status de cada mensagem que chega pelo webhook.

Antes de começar

  • PHP 8.2 ou mais novo e Laravel 10, 11 ou 12.
  • O SDK instalado com composer require ararahq/sdk e uma chave de API em ARARA_API_KEY. Veja SDK PHP.
  • Um template aprovado. Os exemplos usam confirmacao_pedido. Veja Templates.
  • Uma URL https pública para o webhook. Em desenvolvimento, veja Testar localmente.

Registrar o SDK

Adicione a chave e o secret do webhook em config/services.php. Os valores vêm do .env (ARARA_API_KEY e ARARA_WEBHOOK_SECRET):
Crie um service provider que registra o SDK como singleton:
Registre o provider em config/app.php, ou em bootstrap/providers.php no Laravel 11 ou mais novo. As demais opções do Config estão em SDK PHP.

Enviar de um controller

O receiver aceita +5511999999999, whatsapp:+5511999999999 ou só os dígitos; a API valida o número. send devolve um array com id (ara_msg_...) e status inicial.

Enviar de um job em fila

Em produção, envie de um job. O send do SDK sempre manda Idempotency-Key e reaproveita a mesma chave nas retentativas do SDK (em 5xx). Passe idempotencyKey: derivada do pedido para que uma nova tentativa do job também não duplique a mensagem:
Coloque o job na fila:
A API responde 202. Repetir a mesma Idempotency-Key devolve a mensagem original, sem novo envio. Em POST /v1/messages isso vale mesmo se o payload mudar (a API não compara destinatário nem variáveis), então nunca reaproveite a chave para outra mensagem.

Webhook

1

Guarde o secret

No painel, abra Webhooks, gere o secret e copie o valor para o .env:
2

Crie a rota

3

Crie o controller

O controller lê o corpo bruto, verifica a assinatura e registra o ID e o status de cada mensagem.
Troque os Log::info pela gravação no seu banco. $data['id'] é o mesmo ID devolvido no envio. $data['status'] vem em minúsculas: queued, sent, delivered, read, failed.
4

Cadastre a URL

Na mesma tela do painel, informe https://seu-dominio.com/api/webhooks/arara e dispare o evento de teste.
Na 2.0.0 do SDK, WebhookUtils::verifySignature($body, $signature, $secret, $timestamp) faz a mesma conferência (assinatura sobre timestamp.corpo e janela anti-replay) e pode substituir o código manual acima. Se mantiver o manual, compare com hash_equals, que é em tempo constante. Nunca use ==. Quem está na 1.8.1 deve atualizar: lá a função não inclui o timestamp e nunca confere.
Responda 2xx rápido. Quando a entrega falha, a Arara tenta de novo, então o controller precisa aguentar o mesmo evento mais de uma vez. Use o header X-Arara-Delivery-Id para deduplicar. Prazos e intervalos estão em Entrega.
Rotas em routes/api.php já ficam fora da verificação de CSRF. Se registrar o webhook em routes/web.php, adicione o caminho ao VerifyCsrfToken@except (Laravel 10) ou a validateCsrfTokens(except: [...]) em bootstrap/app.php (Laravel 11 ou mais novo).

Atualizar o admin em tempo real

Para mostrar o status no seu admin com Pusher ou Reverb, crie um evento de broadcast:
Emita o evento no handleStatus, depois do Log::info:

Próximos passos

Eventos

Corpo e campos de cada evento.

Webhooks

Retentativas, deduplicação e teste local.

SDK PHP

Métodos disponíveis e limitações da versão publicada.

Receitas

Carrinho abandonado, confirmação de pedido, suporte.