Saltar al contenido principal

RF36: Usuario actualiza método de pago

Descripción

Como usuario autenticado, quiero actualizar mi método de pago (cambiar a otra tarjeta) para mantener vigente el cobro de mi suscripción.

La actualización se hace mediante el Customer Portal de Stripe (hosted page) o registrando un nuevo PaymentMethod y marcándolo como predeterminado; los datos de tarjeta nunca pasan por Finnova (Stripe §5 Actualización de método de pago).

CampoValor
MóduloSubscription Module
ActorUsuario autenticado
EndpointPOST /subscription/billing-portal (genera sesión) o PUT /subscription/payment-method
PrecondicionesSesión activa; Customer existente
PrioridadMedia (MVP)
EtapaMVP
Requisitos relacionadosRF35, RF34, RF46

Reglas de negocio

  • RN-36.1 — Se usa stripe.billingPortal.sessions.create() para que el usuario gestione su tarjeta sin que Finnova maneje datos de tarjeta.
  • RN-36.2 — La nueva tarjeta se valida (RF46) y se marca como predeterminada al confirmarse.
  • RN-36.3 — El cambio no interrumpe la suscripción activa; aplica al próximo cobro.
  • RN-36.4 — Solo el dueño del Customer (por user_id del JWT) puede gestionar su método.

Validaciones de entrada

CampoReglasMensaje de error
paymentMethodId (si aplica)Token válido de Stripe."No se pudo actualizar el método de pago."
AuthorizationBearer válido."Sesión no válida." (401)

Criterios de aceptación

Escenario 1: Actualización exitosa vía portal

Dado que tengo un método de pago, Cuando abro la gestión y registro/confirmo una nueva tarjeta, Entonces el sistema la valida y la marca como predeterminada, Y responde 200 OK mostrando la nueva marca y últimos 4 dígitos.

Escenario 2: Nueva tarjeta rechazada

Dado que la nueva tarjeta es rechazada (RF46), Cuando intento actualizarla, Entonces el sistema mantiene la anterior y muestra un error claro.

Escenario 3: No exposición de datos (seguridad)

Dado que actualizo mi tarjeta, Cuando se inspeccionan logs/DB, Entonces nunca aparece el número completo ni el CVV.

Criterios no funcionales

  • La sesión del Customer Portal expira; comunicación TLS 1.2+.
  • Idempotencia en las llamadas a Stripe.

Diagrama de secuencia