API NestJS que recibe el Webhook Messenger de SAP Business One (CloudEvents), valida HMAC opcional y guarda cada notificacion local (data/events/) e inserta en Postgres (webhook_events). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
3.5 KiB
Del alta de una Orden al archivo JSON
Cómo viaja un evento de SAP Business One hasta quedar guardado en disco por
sap-webhook-api: los dos servidores involucrados, sus componentes,
puertos e IPs de ejemplo, y dónde entra en juego el certificado
autofirmado.
Diagrama
flowchart LR
subgraph SAP["SAP Business One — servidor Windows · 192.168.1.205"]
direction TB
SL["Service Layer\nsap10:50000\nLogin · EventSubscriptions\ncert propio autofirmado"]
SQL["SQL Server (MSSQL)\nDB: SBODemoCL\nTablas: OEVC · OEVN · EVN1\nlogin: sa"]
WM["Webhook Messenger\npuerto 40008\nWebhookMessenger.jar\nDEFAULT_LANGUAGE=us_english (workaround)"]
SL <-->|"Login / EventSubscriptions"| SQL
SQL <-->|"SELECT/UPDATE OEVN, EVN1 (login sa)"| WM
end
subgraph MAC["Mac de desarrollo · 192.168.1.166"]
direction TB
CFG["Configuración\ncurl / sl.http"]
API["sap-webhook-api (NestJS)\n192.168.1.166:3000\nPOST /webhooks/sap\ncert CN/SAN=192.168.1.166"]
FS["data/events/*.json\n1 archivo por notificación"]
API -->|guarda| FS
end
CFG -- "HTTPS :50000\nLogin, EventSubscriptions" --> SL
WM -- "HTTPS :3000\nCloudEvents batch\nPOST /webhooks/sap" --> API
classDef warn fill:#faf0dd,stroke:#a8690b,color:#7a4c08;
class WM warn
Dos servidores en la misma LAN. La Mac llama al Service Layer para
configurar la suscripción (flecha superior); el Webhook Messenger — que
corre dentro del servidor SAP y lee la cola de eventos en SQL Server
autenticado como sa — es quien llama de vuelta a la Mac para entregar
cada evento (flecha inferior). El recuadro en ámbar marca el workaround de
DATEFORMAT aplicado para que esa segunda flecha funcione.
Componentes e IPs de ejemplo
| Componente | Host : puerto | Protocolo | Notas |
|---|---|---|---|
| Service Layer (SAP Business One) | sap10 : 50000 |
HTTPS | Certificado propio autofirmado; nuestras llamadas lo ignoran con curl -k. |
| Webhook Messenger (servicio Windows) | 192.168.1.205 : 40008 |
TCP (health) + JDBC a SQL Server | Se conecta a SQL Server como sa; despacha los eventos por HTTPS hacia el WebhookURL suscripto. |
| SQL Server (MSSQL) | — (interno) | TDS | DB SBODemoCL. Tablas OEVC / OEVN / EVN1. |
| sap-webhook-api (NestJS) | 192.168.1.166 : 3000 |
HTTPS | Certificado autofirmado propio, CN/SAN = 192.168.1.166. |
| data/events/ (filesystem local) | — (disco) | — | Un archivo .json por notificación recibida. |
🔐 Certificado autofirmado
Generado en la Mac para CN/SAN = 192.168.1.166 — la IP donde corre
sap-webhook-api, no la del servidor SAP.
Ese nombre tiene que coincidir con el host que se declara como
WebhookURL al crear la suscripción
(https://192.168.1.166:3000/webhooks/sap). Como la suscripción usa
VerifyCertificate: tNO, SAP nunca valida este certificado — si más
adelante se activa la verificación, hay que importarlo además en el
keystore del propio Webhook Messenger.
🟠 Estado del bug de fechas
El Webhook Messenger construye el SQL contra OEVN con la fecha como
texto plano. Con el login sa en idioma Español (DATEFORMAT dmy),
cualquier día del mes mayor a 12 rompía la consulta.
Workaround confirmado en este ambiente de desarrollo: cambiar sa a
DEFAULT_LANGUAGE = us_english y reiniciar el servicio. Sigue pendiente
confirmar si FP2605 HFX1 lo corrige oficialmente.
Detalle completo del diagnóstico, la evidencia y los pasos de instalación
en CLAUDE.md y PASOS-REALIZADOS.md de este repositorio.