La doc previa describía Evolution API, pero el stack real desde abril es Baileys directo en /opt/whatsapp-bridge/. Se documenta el systemd unit que ahora supervisa el proceso y se agrega troubleshooting. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3.2 KiB
3.2 KiB
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)
- Copiar
server.jsypackage.jsona/opt/whatsapp-bridge/ cd /opt/whatsapp-bridge && npm install- 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) systemctl daemon-reload && systemctl enable --now whatsapp-bridge- Vincular WhatsApp (ver siguiente sección)
Vincular número de WhatsApp
- Abrir
/pos/whatsappen el POS - Click en "Conectar WhatsApp"
- Escanear el QR con el teléfono (WhatsApp → Dispositivos vinculados → Vincular)
- 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
# 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.jsusa CommonJS (package.jsontiene"type": "commonjs"). No hay variante.mjs— fue removida en abril 2026.