cauril/Docs

Ciclo de vida del pago

Los estados normalizados y sus transiciones, iguales para todos los PSPs.

Cauril expone una sola máquina de estados para los pagos. No importa si por debajo está Stripe o Mercado Pago: vos siempre ves estos estados.

Estados

EstadoSignificado
createdEl pago se registró; aún no hay resultado del PSP.
pendingEn curso del lado del PSP.
requires_actionNecesita acción del cliente (ej. 3D Secure). Mirá next_action.
processingEl PSP lo está procesando; el resultado final llegará por webhook.
succeededCobrado con éxito.
failedRechazado o fallido. Mirá failure.code.
canceledCancelado antes de completarse.
partially_refundedReembolsado en parte.
refundedReembolsado en su totalidad.

Transiciones

DesdePuede pasar a
createdpending, requires_action, processing
pendingrequires_action, processing, succeeded, failed, canceled
requires_actionprocessing, failed
processingsucceeded, failed, canceled
succeededpartially_refunded, refunded
partially_refundedrefunded
failed · canceled · refundedterminales, no transicionan

Forward-only: nunca retrocede

Las transiciones son solo hacia adelante. Un estado terminal (succeeded, failed, canceled, refunded) no vuelve atrás. Esto importa porque los webhooks del PSP pueden llegar fuera de orden o duplicados: un evento processing que llega tarde no va a pisar un pago ya succeeded. Podés confiar en que el estado solo progresa.

Por eso conviene tratar tu lógica de negocio como idempotente respecto del estado: reaccioná a payment.succeeded una vez, sin asumir el orden de llegada de los eventos.

requires_action

Si un pago queda en requires_action, el objeto incluye next_action con la URL a la que redirigir al cliente (ej. autenticación 3DS). Tras completarla, el PSP notifica por webhook y el pago avanza a succeeded o failed.

JSON
{
  "status": "requires_action",
  "next_action": { "type": "redirect", "url": "https://..." }
}