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).
| Campo | Valor |
|---|---|
| Módulo | Subscription Module |
| Actor | Usuario autenticado |
| Endpoint | POST /subscription/billing-portal (genera sesión) o PUT /subscription/payment-method |
| Precondiciones | Sesión activa; Customer existente |
| Prioridad | Media (MVP) |
| Etapa | MVP |
| Requisitos relacionados | RF35, 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(poruser_iddel JWT) puede gestionar su método.
Validaciones de entrada
| Campo | Reglas | Mensaje de error |
|---|---|---|
paymentMethodId (si aplica) | Token válido de Stripe. | "No se pudo actualizar el método de pago." |
Authorization | Bearer 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.