FreemiumProBusinessEnterprise

Ciclo de vida del pago

Descripción general

Cada pago en tikento pasa por una secuencia determinada de estados. Las transiciones entre estados ocurren automáticamente basándose en las notificaciones webhook de la pasarela de pago. El organizador ve el estado actual en la sección Participantes y en el detalle del registro.

Estados del pago

EstadoDescripción
pendingPago creado, el participante fue redirigido a la página de pago de la pasarela
paidDinero recibido, la pasarela confirmó el pago a través de webhook
failedEl pago no se procesó (fondos insuficientes, tarjeta bloqueada, error de 3D Secure)
expiredEl participante no completó el pago en el tiempo asignado (30 minutos)
refundedReembolso completado en su totalidad
partially_refundedSe realizó un reembolso parcial

Diagrama de transiciones

         creación del pago
               │
               ▼
           ┌────────┐
           │pending │
           └───┬────┘
               │
       ┌───────┼───────┐
       ▼       ▼       ▼
   ┌──────┐ ┌────┐ ┌───────┐
   │failed│ │paid│ │expired│
   └──────┘ └─┬──┘ └───────┘
              │
       ┌──────┴──────┐
       ▼             ▼
┌──────────┐  ┌──────────────────┐
│refunded  │  │partially_refunded│
└──────────┘  └──────────────────┘

Las transiciones son irreversibles: paid no puede volver a pending, y refunded no puede volver a paid.

Reserva (Reservation)

Antes de crear el pago, tikento crea una reserva — una retención temporal del boleto para que no se lo lleve otro participante mientras el primero está pagando.

Cómo funciona la reserva

  1. El participante hace clic en «Pagar» — tikento crea una reservation con TTL de 15 minutos.
  2. De la cantidad disponible de boletos se descuenta la plaza reservada.
  3. El participante es redirigido a la página de pago de la pasarela.
  4. Si el pago se completa, la reserva se convierte en un registro confirmado.
  5. Si el TTL expira, la reserva se libera automáticamente y el boleto vuelve a estar disponible.

La reserva previene la situación en la que dos participantes pagan el último boleto simultáneamente.

Procesamiento de webhooks

tikento conoce el resultado del pago a través de un webhook — una solicitud HTTP de la pasarela de pago a los servidores de tikento.

Secuencia

  1. La pasarela (YooKassa, Tochka, Telegram) envía una solicitud POST a la URL del webhook de tikento.
  2. tikento verifica la firma de la solicitud (cada pasarela utiliza su propio mecanismo de firma).
  3. El pago actualiza su estado en la base de datos.
  4. Si el estado es paid, el registro del participante se confirma y se envía un email con el boleto.
  5. Si el estado es failed o expired, la reserva se libera.

Reintentos de entrega

Si tikento no pudo procesar el webhook (por ejemplo, devolvió un 5xx), la pasarela reintenta el envío:

  • YooKassa: hasta 10 intentos con retardo exponencial
  • Tochka: hasta 5 intentos con intervalo de 5 minutos

Gracias a las claves de idempotencia, el reprocesamiento del mismo webhook es seguro y no crea duplicados.

Protección de idempotencia

Cada operación de pago en tikento está protegida por una clave de idempotencia — un identificador único que garantiza que la operación se ejecuta exactamente una vez.

Por qué es necesario

  • El participante pulsó «Pagar» dos veces accidentalmente — solo se crea un pago
  • El webhook llegó repetido por un timeout — el estado se actualiza una sola vez
  • Un fallo de red interrumpió la solicitud, el cliente reenvió — el dinero no se cobra dos veces

Cómo funciona

  1. Al crear el pago, tikento genera un Idempotency-Key (UUIDv7).
  2. La clave se envía en el encabezado de la solicitud a la pasarela.
  3. Si la pasarela recibe una solicitud repetida con la misma clave, devuelve el resultado de la primera operación.
  4. tikento almacena la clave en caché en Redis con TTL de 24 horas.

Relación entre estados de pago y registro

El estado del pago afecta directamente al estado de registro del participante:

Estado del pagoEstado del registroQué ve el participante
pendingpayment_pending«Pendiente de pago»
paidregistered«Registrado», recibe el boleto por email
failedpayment_failed«El pago no se completó», se ofrece reintentar
expiredexpired«El tiempo de pago expiró», se ofrece comenzar de nuevo
refundedrefunded«Reembolso procesado»

Cuando la moderación está activada, entre el pago y el estado final registered puede haber una etapa intermedia de revisión por parte del organizador.

Consulta del historial de pagos

Todos los pagos y sus estados están disponibles en la sección Participantes de su evento. Para cada registro se muestran:

  • Estado actual del pago
  • Método de pago (tarjeta, SBP, Stars)
  • Monto y moneda
  • Fecha y hora de creación / pago / devolución
  • Clave de idempotencia (para diagnóstico)
  • Historial de transiciones entre estados

Para exportar datos de pagos — Exportación de pagos e informes.

Preguntas frecuentes

¿Por qué el pago se quedó en estado pending?
Lo más frecuente es que el participante no completó el pago (cerró la página del banco, no confirmó el 3D Secure). El pago pasará automáticamente a expired después de 30 minutos. Si el webhook de la pasarela no llegó, verifique la configuración del webhook.
¿Qué ocurre si se pulsa el botón «Pagar» dos veces?
Nada negativo. Cada pago está protegido por una clave de idempotencia: una solicitud repetida con la misma clave no creará un duplicado, sino que devolverá el resultado de la operación original.
¿Se puede cambiar manualmente el estado de un pago a paid?
Sí, pero solo para pagos manuales (efectivo, transferencia bancaria). Para pagos a través de la pasarela, el estado se actualiza automáticamente mediante webhook.
¿Cuánto dura la reserva (reservation)?
Por defecto, 15 minutos. Durante este tiempo, el participante debe completar el pago; de lo contrario, la reserva se libera y el boleto vuelve a estar disponible.