Webhook, WebSocket y polling para confirmar un pago
Cuándo usar cada señal y cómo evitar que una reconexión duplique una venta Lightning.
El problema
Una conexión WebSocket puede cerrarse, un webhook puede reintentarse y dos operadores pueden observar el mismo cobro. Tratar cada mensaje como una venta nueva crea duplicados.
Implementación
Todas las señales llaman a una sola operación: confirm(paymentHash). Esa operación comprueba el estado actual y acepta únicamente la transición pending → paid.
if (sale.status !== "pending") return sale;
await markAsPaidOnce(sale.id, paymentHash);
WebSocket actualiza la pantalla, webhook cubre el canal servidor a servidor y polling consulta después de un timeout progresivo.
Validación
Envía el mismo evento varias veces, desconecta el cliente y ejecuta polling en paralelo. La venta debe conservar una fecha de pago y un único movimiento.
Conclusión
La idempotencia es la regla central; los canales son mecanismos intercambiables para descubrir el mismo hecho.