31bd0ad0bd
Revisión con IA / ai-review (pull_request) Successful in 47s
docker-compose.yml no interpolaba ninguna WHATSAPP_*, asi que las cuatro variables cargadas en el .env de produccion no llegaban a la app: los envios cortaban con "falta WHATSAPP_TOKEN" y el webhook devolvia 403 al no tener APP_SECRET con que validar la firma. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
54 lines
2.8 KiB
Markdown
54 lines
2.8 KiB
Markdown
# Bot de reservas por WhatsApp
|
|
|
|
Flujo: el cliente escribe al número del taller → el bot lo identifica por teléfono (verifica
|
|
con el email registrado, o lo da de alta) → elige mecánico, trabajo y horario → confirma y se
|
|
crea el Turno. Todo pasa dentro de la ventana de 24hs que abre el cliente, así que **no hacen
|
|
falta plantillas aprobadas** ni tiene costo.
|
|
|
|
## Piezas
|
|
|
|
| Archivo | Qué hace |
|
|
|---|---|
|
|
| `src/lib/whatsapp-bot.ts` | Máquina de conversación. No sabe nada de Meta: devuelve `RespuestaBot[]` |
|
|
| `src/lib/whatsapp.ts` | Traduce a/desde la Graph API de Meta y valida la firma del webhook |
|
|
| `src/app/api/whatsapp/webhook/route.ts` | Endpoint: verificación (GET) y mensajes entrantes (POST) |
|
|
|
|
Tests sin DB ni credenciales: `npm run test:bot` (conversación) y `npm run test:envio` (capa Meta).
|
|
|
|
## Variables de entorno
|
|
|
|
```
|
|
WHATSAPP_PHONE_NUMBER_ID= # id numérico del número, NO el teléfono
|
|
WHATSAPP_TOKEN= # token permanente de System User
|
|
WHATSAPP_VERIFY_TOKEN= # string inventado, el mismo acá y en el panel de Meta
|
|
WHATSAPP_APP_SECRET= # App -> Settings -> Basic -> App Secret
|
|
```
|
|
|
|
Sin `WHATSAPP_APP_SECRET` el webhook rechaza todo con 403 (es a propósito: sin firma no se
|
|
puede confiar en el payload).
|
|
|
|
## Alta en Meta (una sola vez)
|
|
|
|
1. Meta Business Suite con la cuenta de Facebook del taller.
|
|
2. developers.facebook.com → crear App tipo **Business** → agregar producto **WhatsApp**.
|
|
3. **WhatsApp → API Setup**: de ahí salen `PHONE_NUMBER_ID` y un token temporal (24hs).
|
|
Para el token definitivo: Business Settings → System Users → crear usuario → Generate Token
|
|
con permisos `whatsapp_business_messaging` y `whatsapp_business_management`.
|
|
4. **App → Settings → Basic → App Secret** → `WHATSAPP_APP_SECRET`.
|
|
5. Cargar las 4 variables en el `.env` de producción (`/home/proyecto/taller_automotriz/.env`,
|
|
al lado del `docker-compose.yml`, que es de donde compose las interpola) y levantar de nuevo
|
|
con `docker compose up -d`. Un `git push` no alcanza: el `.env` no está en el repo.
|
|
6. **WhatsApp → Configuration → Webhook**:
|
|
- Callback URL: `https://taller.beldo.duckdns.org/api/whatsapp/webhook`
|
|
- Verify token: el mismo `WHATSAPP_VERIFY_TOKEN`
|
|
- Suscribir el campo **`messages`** (sin esto no llega nada).
|
|
7. Probar con el número de prueba que da Meta gratis, antes de migrar el número real.
|
|
|
|
Notas:
|
|
- El número del taller no puede estar activo en la app de WhatsApp normal/Business: hay que
|
|
borrar esa cuenta antes de migrarlo a Cloud API.
|
|
- Business Verification se saltea mientras estemos abajo de 1000 usuarios únicos/24hs; solo
|
|
hace falta la aprobación del **Display Name**.
|
|
- Meta permite 3 botones como máximo. Si hay más de 3 mecánicos activos, salen los 3 primeros
|
|
como botón y el resto se elige respondiendo con el número (el bot acepta las dos formas).
|