Quick start
Do docker run a um webhook assinado e à resposta do usuário. Cada chamada abaixo roda como está escrita contra um container novo.
-
Suba
Diga onde a sua aplicação recebe os webhooks e o segredo para assiná-los.
docker run --rm -p 3010:3010 \ -e WEBHOOK_URL=http://host.docker.internal:4000/webhooks/whatsapp \ -e WEBHOOK_SECRET=my-app-secret \ --add-host host.docker.internal:host-gateway \ ghcr.io/instituto-ama/whatsapp-mock:latestSobe com uma empresa, a WhatsApp Business Account
100000000000001e o número1234567890, registrado e com ligações ativadas. O painel fica em http://localhost:3010. -
Aponte sua aplicação
Mesmos caminhos, mesmos corpos, mesmas respostas, mesmos códigos de erro. Qualquer token bearer é aceito, desde que exista.
- WHATSAPP_GRAPH_URL=https://graph.facebook.com/v23.0 + WHATSAPP_GRAPH_URL=http://localhost:3010/v23.0 WHATSAPP_PHONE_NUMBER_ID=1234567890 WHATSAPP_TOKEN=test -
Crie um template
Ele passa por uma revisão, aprovada em 2 segundos por padrão, e o veredito chega no webhook
message_template_status_update.curl -X POST localhost:3010/v23.0/100000000000001/message_templates \ -H 'Authorization: Bearer test' -H 'Content-Type: application/json' \ -d '{"name":"appointment_reminder","language":"pt_BR","category":"UTILITY", "components":[{"type":"BODY","text":"Olá {{1}}, sua consulta é amanhã às {{2}}.", "example":{"body_text":[["Maria","14:30"]]}}, {"type":"BUTTONS","buttons":[{"type":"QUICK_REPLY","text":"Confirmar"}, {"type":"QUICK_REPLY","text":"Remarcar"}]}]}' # → {"id":"…","status":"PENDING","category":"UTILITY"} -
Envie
curl -X POST localhost:3010/v23.0/1234567890/messages \ -H 'Authorization: Bearer test' -H 'Content-Type: application/json' \ -d '{"messaging_product":"whatsapp","to":"5511987654321","type":"template", "template":{"name":"appointment_reminder","language":{"code":"pt_BR"}, "components":[{"type":"body","parameters":[ {"type":"text","text":"Maria"},{"type":"text","text":"14:30"}]}]}}' # → {"messages":[{"id":"wamid.…","message_status":"accepted"}]}, depois sent, delivered, readAbra o painel: a conversa com
5511987654321mostra o template como o WhatsApp desenha, com os botões. -
Responda como o usuário
Toque num botão ou digite no painel, ou faça isso de um teste com um header:
curl -X POST localhost:3010/v23.0/1234567890/messages \ -H 'Authorization: Bearer test' -H 'Content-Type: application/json' \ -H 'X-Mock-From: 5511987654321' -H 'X-Mock-Contact-Name: Maria Souza' \ -d '{"messaging_product":"whatsapp","type":"text","text":{"body":"Oi! Quero remarcar."}}' # → o seu endpoint recebe o webhook messages, assinado com x-hub-signature-256 -
No seu compose
services: whatsapp: image: ghcr.io/instituto-ama/whatsapp-mock:latest ports: - '3010:3010' environment: WEBHOOK_URL: http://host.docker.internal:4000/webhooks/whatsapp WEBHOOK_SECRET: my-app-secret WEBHOOK_LOCALHOST_REWRITE: host.docker.internal extra_hosts: - 'host.docker.internal:host-gateway' # Linux volumes: - whatsapp-data:/app/data # conversas, templates, números, mídia volumes: whatsapp-data:Templates também podem vir de arquivos: todo JSON numa pasta
templates/montada é importado no boot e quando muda. -
No CI
Não guarde nada entre execuções e tire as esperas:
WHAP_DB=:memory: MOCK_WEBHOOK_RESPONSE_DELAY_MS=0 MOCK_TEMPLATE_REVIEW_DELAY_MS=0