# Configuración de WhatsApp — Baileys Bridge El POS se conecta a WhatsApp mediante un **bridge Node.js directo (Baileys)** que vive en `/opt/whatsapp-bridge/`. No usa Evolution API ni Meta Cloud API (ambos fueron reemplazados en abril 2026). ## Arquitectura ``` Refaccionaria → WhatsApp Web ↓ /opt/whatsapp-bridge/server.js ← Baileys (Node 20) ↓ webhook HTTP Flask POS /pos/api/whatsapp/webhook (puerto 5001) ↓ IA + inventario + cotizador ↓ send HTTP bridge → WhatsApp Web → cliente ``` - **Bridge puerto:** 21465 (local) - **Flask webhook:** `http://localhost:5001/pos/api/whatsapp/webhook` - **Auth state:** `/opt/whatsapp-bridge/auth/` (creds + pre-keys; sobrevive reinicios) ## Instalación (servidor nuevo) 1. Copiar `server.js` y `package.json` a `/opt/whatsapp-bridge/` 2. `cd /opt/whatsapp-bridge && npm install` 3. Instalar la unidad systemd: `cp docs/systemd/whatsapp-bridge.service /etc/systemd/system/` *(o usar la ya presente en `/etc/systemd/system/whatsapp-bridge.service`)* 4. `systemctl daemon-reload && systemctl enable --now whatsapp-bridge` 5. Vincular WhatsApp (ver siguiente sección) ## Vincular número de WhatsApp 1. Abrir `/pos/whatsapp` en el POS 2. Click en "Conectar WhatsApp" 3. Escanear el QR con el teléfono (WhatsApp → Dispositivos vinculados → Vincular) 4. La sesión queda guardada en `/opt/whatsapp-bridge/auth/` — no hay que re-escanear mientras el teléfono se conecte a internet cada ~14 días. ## Operación ```bash # Estado del bridge systemctl status whatsapp-bridge # Reiniciar (p. ej. tras actualizar server.js) systemctl restart whatsapp-bridge # Logs en vivo journalctl -u whatsapp-bridge -f # o el archivo plano: tail -f /var/log/whatsapp-bridge.log ``` ## Endpoints del bridge (localhost:21465) | Método | Path | Uso | |---|---|---| | GET | `/status` | Estado de conexión (`disconnected`, `connecting`, `qr`, `open`) | | GET | `/qr` | QR en base64 para escanear | | POST | `/connect` | Forzar inicio de conexión | | POST | `/send` | `{phone, message}` → enviar texto | | POST | `/logout` | Cerrar sesión | ## Troubleshooting | Síntoma | Verificar | |---|---| | POS dice "error" al consultar estado | `systemctl status whatsapp-bridge` — si está "inactive" → `systemctl start whatsapp-bridge` | | Puerto 21465 no escucha | `ss -tlnp \| grep 21465` — si vacío, el proceso Node crasheó; ver `journalctl -u whatsapp-bridge -n 100` | | QR no aparece | Probable que ya esté vinculado → `/status` debe decir `open` | | Mensajes llegan pero no responde | Verificar que Flask esté escuchando en 5001 y revisar logs del webhook con prefix `[WA-AI]` | | Tras actualizar `server.js` no toma cambios | `systemctl restart whatsapp-bridge` | | "Invalid mex newsletter notification" en logs | Ruido normal de Baileys (warn), ignorar | ## Notas - Cada refaccionaria conecta su propio número; la sesión vive en el servidor local (mini rack). - Si el teléfono pierde internet por >14 días, WhatsApp desvincula el dispositivo y hay que re-escanear. - `server.js` usa CommonJS (`package.json` tiene `"type": "commonjs"`). No hay variante `.mjs` — fue removida en abril 2026.