engineering · Bitácora técnica

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.

Sigue construyendo

Explora el proyecto detrás de estas decisiones.

Ver Lightning PoS