RF35: Usuario registra método de pago
Descripción
Como usuario autenticado, quiero registrar una tarjeta como método de pago para poder pagar mi suscripción.
Los datos de tarjeta se capturan directamente en Stripe (Stripe.js / Elements) y se tokenizan como PaymentMethod; nunca pasan por los servidores de Finnova (Stripe §Frontend/Backend). El backend solo recibe el paymentMethodId y lo adjunta al Customer.
| Campo | Valor |
|---|---|
| Módulo | Subscription Module |
| Actor | Usuario autenticado |
| Endpoint | POST /subscription/payment-method ({ paymentMethodId }) |
| Precondiciones | Sesión activa; Customer de Stripe asegurado |
| Prioridad | Alta (MVP) |
| Etapa | MVP |
| Requisitos relacionados | RF33, RF36, RF46 |
Reglas de negocio
- RN-35.1 — El número de tarjeta, CVV y datos PAN nunca llegan al backend de Finnova; solo el
paymentMethodIdtokenizado. - RN-35.2 — El
PaymentMethodse adjunta alCustomery se marca como predeterminado para cobros. - RN-35.3 — Se valida la tarjeta (RF46), incluyendo 3D Secure si el emisor lo requiere.
- RN-35.4 — Si el usuario no tiene
Customer, se crea antes de adjuntar.
Validaciones de entrada
| Campo | Reglas | Mensaje de error |
|---|---|---|
paymentMethodId | Obligatorio. Token válido de Stripe. | "No se pudo registrar el método de pago." |
Authorization | Bearer válido. | "Sesión no válida." (401) |
El backend nunca recibe ni registra en logs números de tarjeta o CVV.
Criterios de aceptación
Escenario 1: Registro de tarjeta exitoso
Dado que ingreso mi tarjeta en el formulario de Stripe,
Cuando se tokeniza y envío el paymentMethodId,
Entonces el sistema lo adjunta a mi Customer,
Y lo marca como predeterminado,
Y responde 201 Created mostrando marca y últimos 4 dígitos.
Escenario 2: Tarjeta rechazada o inválida
Dado que la tarjeta es rechazada o inválida (RF46), Cuando intento registrarla, Entonces el sistema responde con un error claro ("Tu tarjeta fue rechazada. Verifica los datos o usa otra"), Y no la marca como método válido.
Escenario 3: Requiere autenticación 3D Secure
Dado que el emisor exige 3D Secure, Cuando registro la tarjeta, Entonces la app completa el reto 3DS con Stripe antes de confirmar el registro.
Escenario 4: No exposición de datos de tarjeta (seguridad)
Dado que registro un método de pago, Cuando se inspeccionan logs y la base de datos, Entonces nunca aparece el número completo de tarjeta ni el CVV.
Criterios no funcionales
- Scope PCI reducido a SAQ A (Stripe maneja los datos de tarjeta).
- Llamadas con idempotency key; comunicación TLS 1.2+.