feat(whatsapp): webhook + envio por Graph API (F0)
Ultima fase del bot de reservas: conecta la maquina de conversacion ya existente (whatsapp-bot.ts) con la WhatsApp Business Cloud API. - src/lib/whatsapp.ts: traduce RespuestaBot -> payloads de Meta (texto e interactive/button, con los limites de 3 botones / 20 chars / 4096 chars), aplana el payload del webhook y valida X-Hub-Signature-256 en tiempo constante. - src/app/api/whatsapp/webhook/route.ts: GET de verificacion y POST de mensajes. Valida la firma sobre el cuerpo crudo, deduplica por message id (Meta reintenta) y siempre devuelve 200 para no entrar en loop de retries. - scripts/test-whatsapp-envio.ts (npm run test:envio): 30 asserts sobre la capa Meta con fetch stubbeado, sin DB ni credenciales. - docs/whatsapp.md con el alta en el panel de Meta y las 4 env vars. Falta solo cargar las credenciales de Meta en el .env de produccion. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -4,3 +4,13 @@ NEXTAUTH_URL="http://localhost:3000"
|
||||
GMAIL_USER="tu-email@gmail.com"
|
||||
GMAIL_APP_PASSWORD="xxxx xxxx xxxx xxxx"
|
||||
MAGIC_LINK_BASE_URL="http://localhost:3000"
|
||||
|
||||
# Bot de reservas por WhatsApp (Meta Cloud API).
|
||||
# PHONE_NUMBER_ID: panel de Meta -> WhatsApp -> API Setup (es un id numérico, NO el teléfono).
|
||||
# TOKEN: token permanente de un System User con whatsapp_business_messaging + _management.
|
||||
# VERIFY_TOKEN: string inventado por vos; el mismo va acá y en el panel al dar de alta el webhook.
|
||||
# APP_SECRET: App -> Settings -> Basic -> App Secret. Sin esto el webhook rechaza todo.
|
||||
WHATSAPP_PHONE_NUMBER_ID=""
|
||||
WHATSAPP_TOKEN=""
|
||||
WHATSAPP_VERIFY_TOKEN=""
|
||||
WHATSAPP_APP_SECRET=""
|
||||
|
||||
Reference in New Issue
Block a user