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:
jpbeldomenico
2026-08-04 19:00:20 -03:00
committed by Beldor
parent 0046b6c3cf
commit 15d6e8a2ee
6 changed files with 457 additions and 1 deletions
+2 -1
View File
@@ -11,7 +11,8 @@
"db:push": "prisma db push",
"db:seed": "npx tsx prisma/seed.ts",
"db:studio": "prisma studio",
"test:bot": "tsx scripts/test-whatsapp-bot.ts"
"test:bot": "tsx scripts/test-whatsapp-bot.ts",
"test:envio": "tsx scripts/test-whatsapp-envio.ts"
},
"prisma": {
"seed": "npx tsx prisma/seed.ts"