TAREA-001: Estandarización de épicas al formato SIMCO 4.0.1 Cambios aplicados a las 12 épicas: - Frontmatter: simco_version="4.0.1", story_points, updated_at=2026-01-17 - Metadata: Agregado **Story Points:** N - Nueva sección "## Historias de Usuario" antes de Entregables - Cada HU: Como/Quiero/Para, Story Points, Criterios [CA-XXX-N], Tareas [MCH-TT-XXX-NN] - Tabla resumen de Story Points al final de cada épica Épicas estandarizadas: - MCH-016: Entregas a Domicilio (5 HUs, 34 SP) - MCH-017: Notificaciones (6 HUs, 34 SP) - MCH-018: Planes y Suscripciones (6 HUs, 21 SP) - MCH-019: Tienda de Tokens (6 HUs, 21 SP) - MCH-020: Pagos de Suscripción (6 HUs, 34 SP) - MCH-021: Dashboard Web (6 HUs, 21 SP) - MCH-022: Modo Offline (6 HUs, 21 SP) - MCH-023: Programa de Referidos (6 HUs, 21 SP) - MCH-024: CoDi y SPEI (5 HUs, 21 SP) - MCH-025: Widgets y Atajos (6 HUs, 21 SP) - MCH-026: Multi-idioma LATAM (7 HUs, 34 SP) - MCH-027: Integración SAT (8 HUs, 55 SP) Rango de IDs utilizados: MCH-US-150 a MCH-US-269 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
426 lines
12 KiB
Markdown
426 lines
12 KiB
Markdown
---
|
|
id: EPIC-MCH-020
|
|
type: Epic
|
|
title: "MCH-020: Pagos de Suscripcion"
|
|
code: MCH-020
|
|
status: Completado
|
|
phase: 5
|
|
priority: P0
|
|
story_points: 34
|
|
created_at: 2026-01-10
|
|
updated_at: 2026-01-17
|
|
simco_version: "4.0.1"
|
|
dependencies:
|
|
blocks: []
|
|
depends_on: []
|
|
---
|
|
|
|
# MCH-020: Pagos de Suscripcion
|
|
|
|
## Metadata
|
|
- **Codigo:** MCH-020
|
|
- **Fase:** 5 - Monetizacion
|
|
- **Prioridad:** P0
|
|
- **Estado:** Completado
|
|
- **Story Points:** 34
|
|
- **Fecha completado:** 2026-01-10
|
|
|
|
## Descripcion
|
|
|
|
Sistema completo de pagos para suscripciones y tokens: Stripe para tarjetas y OXXO, In-App Purchase para iOS/Android, y manejo de pagos fallidos.
|
|
|
|
## Objetivos
|
|
|
|
1. Pagos con tarjeta (Stripe)
|
|
2. Pagos en OXXO (Stripe)
|
|
3. In-App Purchase iOS
|
|
4. In-App Purchase Android
|
|
5. Manejo de pagos fallidos
|
|
|
|
## Alcance
|
|
|
|
### Incluido
|
|
- Stripe Checkout
|
|
- OXXO Pay (via Stripe)
|
|
- Apple In-App Purchase
|
|
- Google Play Billing
|
|
- Reintentos automaticos
|
|
- Recibos por email
|
|
|
|
### Excluido
|
|
- PayPal
|
|
- Transferencia bancaria manual
|
|
- Criptomonedas
|
|
|
|
## Metodos de Pago
|
|
|
|
### Stripe - Tarjeta
|
|
```
|
|
Comision: ~3.6% + $3 MXN
|
|
Confirmacion: Inmediata
|
|
Uso: Web y App (via Stripe SDK)
|
|
```
|
|
|
|
### Stripe - OXXO
|
|
```
|
|
Comision: ~$10-15 MXN fijo
|
|
Confirmacion: 24-72 horas
|
|
Uso: Cliente paga en OXXO
|
|
Vencimiento: 3 dias
|
|
```
|
|
|
|
### Apple In-App Purchase
|
|
```
|
|
Comision: 15-30%
|
|
Confirmacion: Inmediata
|
|
Uso: App iOS
|
|
Nota: Obligatorio para apps iOS
|
|
```
|
|
|
|
### Google Play Billing
|
|
```
|
|
Comision: 15%
|
|
Confirmacion: Inmediata
|
|
Uso: App Android
|
|
```
|
|
|
|
## Flujos de Pago
|
|
|
|
### Pago con Tarjeta
|
|
```
|
|
1. Usuario selecciona plan/tokens
|
|
2. Elige "Pagar con tarjeta"
|
|
3. Stripe Checkout se abre
|
|
4. Ingresa datos de tarjeta
|
|
5. Pago procesado
|
|
6. Redirige a app con confirmacion
|
|
7. Suscripcion/tokens activados
|
|
```
|
|
|
|
### Pago en OXXO
|
|
```
|
|
1. Usuario selecciona plan/tokens
|
|
2. Elige "Pagar en OXXO"
|
|
3. Se genera referencia OXXO
|
|
4. Se muestra:
|
|
- Monto a pagar
|
|
- Referencia/codigo de barras
|
|
- Fecha limite
|
|
5. Usuario va a OXXO y paga
|
|
6. Webhook confirma pago (horas despues)
|
|
7. Suscripcion/tokens activados
|
|
8. Notificacion al usuario
|
|
```
|
|
|
|
### In-App Purchase (iOS)
|
|
```
|
|
1. Usuario abre tienda en app
|
|
2. Selecciona producto
|
|
3. StoreKit muestra sheet de Apple
|
|
4. Usuario confirma con Face ID
|
|
5. Apple procesa pago
|
|
6. App recibe notificacion
|
|
7. Backend valida con Apple
|
|
8. Suscripcion/tokens activados
|
|
```
|
|
|
|
## Modelo de Datos
|
|
|
|
### Tablas Adicionales
|
|
|
|
**payment_methods**
|
|
- id, tenant_id, type (card/oxxo/iap)
|
|
- provider, last4, brand
|
|
- is_default, stripe_pm_id
|
|
|
|
**payments**
|
|
- id, tenant_id, type (subscription/tokens)
|
|
- amount, currency, status
|
|
- provider, provider_id
|
|
- metadata (JSONB)
|
|
|
|
**oxxo_vouchers**
|
|
- id, payment_id, reference
|
|
- barcode_url, expires_at
|
|
- status
|
|
|
|
## Endpoints API
|
|
|
|
| Metodo | Endpoint | Descripcion |
|
|
|--------|----------|-------------|
|
|
| POST | /payments/create-checkout | Crear sesion Stripe |
|
|
| POST | /payments/create-oxxo | Generar voucher OXXO |
|
|
| POST | /payments/verify-iap | Verificar IAP |
|
|
| GET | /payments/methods | Metodos guardados |
|
|
| POST | /payments/methods | Agregar metodo |
|
|
| DELETE | /payments/methods/:id | Eliminar metodo |
|
|
| POST | /payments/webhook/stripe | Webhook Stripe |
|
|
| POST | /payments/webhook/apple | Webhook Apple |
|
|
| POST | /payments/webhook/google | Webhook Google |
|
|
|
|
## Manejo de Pagos Fallidos
|
|
|
|
### Reintentos Automaticos
|
|
```
|
|
Dia 1: Primer intento fallido
|
|
Dia 3: Segundo intento
|
|
Dia 5: Tercer intento
|
|
Dia 7: Cuarto intento + alerta
|
|
Dia 10: Suspension de servicio
|
|
```
|
|
|
|
### Notificaciones
|
|
```
|
|
[Pago fallido - Dia 1]
|
|
"No pudimos procesar tu pago de $99.
|
|
Actualiza tu metodo de pago para
|
|
continuar usando MiChangarrito.
|
|
|
|
[Actualizar pago]"
|
|
|
|
[Ultimo aviso - Dia 7]
|
|
"⚠️ Tu suscripcion sera cancelada
|
|
en 3 dias si no actualizas tu pago.
|
|
|
|
[Actualizar pago ahora]"
|
|
```
|
|
|
|
## UI Components
|
|
|
|
### PaymentMethodSelector
|
|
- Radio buttons de metodos
|
|
- Tarjeta, OXXO, o guardados
|
|
- Agregar nueva tarjeta
|
|
|
|
### OXXOVoucher
|
|
- Codigo de barras
|
|
- Monto y referencia
|
|
- Instrucciones
|
|
- Boton compartir
|
|
|
|
### PaymentHistory
|
|
- Lista de pagos
|
|
- Estado y fecha
|
|
- Descargar recibo
|
|
|
|
## Historias de Usuario
|
|
|
|
### MCH-US-190: Pagos con Tarjeta via Stripe Checkout
|
|
**Story Points:** 8
|
|
|
|
**Como** propietario de negocio
|
|
**Quiero** pagar mi suscripcion o tokens con tarjeta de credito/debito
|
|
**Para** activar mi plan de manera inmediata y segura
|
|
|
|
#### Criterios de Aceptacion
|
|
- [CA-190-1] El sistema redirige a Stripe Checkout al seleccionar pago con tarjeta
|
|
- [CA-190-2] Se soportan tarjetas Visa, Mastercard y American Express
|
|
- [CA-190-3] La confirmacion del pago es inmediata tras procesamiento exitoso
|
|
- [CA-190-4] El usuario recibe recibo por email automaticamente
|
|
- [CA-190-5] La suscripcion/tokens se activan inmediatamente tras pago exitoso
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimacion |
|
|
|----|-------|------------|
|
|
| MCH-TT-190-01 | Configurar Stripe Checkout Session en backend | 4h |
|
|
| MCH-TT-190-02 | Implementar stripe-checkout.service.ts | 6h |
|
|
| MCH-TT-190-03 | Crear endpoint POST /payments/create-checkout | 3h |
|
|
| MCH-TT-190-04 | Integrar Stripe.js en frontend | 4h |
|
|
| MCH-TT-190-05 | Implementar flujo de redireccion y confirmacion | 3h |
|
|
| MCH-TT-190-06 | Configurar webhook para eventos de pago | 4h |
|
|
|
|
---
|
|
|
|
### MCH-US-191: Pagos en OXXO con Voucher
|
|
**Story Points:** 5
|
|
|
|
**Como** propietario de negocio sin tarjeta bancaria
|
|
**Quiero** generar un voucher para pagar en OXXO
|
|
**Para** poder adquirir mi suscripcion usando efectivo
|
|
|
|
#### Criterios de Aceptacion
|
|
- [CA-191-1] Se genera referencia OXXO con codigo de barras valido
|
|
- [CA-191-2] El voucher muestra monto, referencia y fecha de vencimiento (3 dias)
|
|
- [CA-191-3] El usuario puede compartir el voucher via imagen o PDF
|
|
- [CA-191-4] El sistema procesa webhook de confirmacion de OXXO (24-72h)
|
|
- [CA-191-5] La suscripcion/tokens se activan automaticamente tras confirmacion
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimacion |
|
|
|----|-------|------------|
|
|
| MCH-TT-191-01 | Implementar oxxo.service.ts con Stripe OXXO Pay | 4h |
|
|
| MCH-TT-191-02 | Crear endpoint POST /payments/create-oxxo | 2h |
|
|
| MCH-TT-191-03 | Disenar componente OXXOVoucher con codigo de barras | 4h |
|
|
| MCH-TT-191-04 | Implementar funcionalidad de compartir voucher | 2h |
|
|
| MCH-TT-191-05 | Configurar webhook para confirmacion OXXO | 3h |
|
|
| MCH-TT-191-06 | Implementar notificacion push al confirmar pago | 2h |
|
|
|
|
---
|
|
|
|
### MCH-US-192: In-App Purchase para iOS
|
|
**Story Points:** 8
|
|
|
|
**Como** usuario de la app iOS
|
|
**Quiero** comprar suscripciones o tokens desde la app
|
|
**Para** no tener que salir de la aplicacion para pagar
|
|
|
|
#### Criterios de Aceptacion
|
|
- [CA-192-1] Los productos estan configurados en App Store Connect
|
|
- [CA-192-2] StoreKit muestra la hoja de compra nativa de Apple
|
|
- [CA-192-3] El usuario puede confirmar con Face ID/Touch ID
|
|
- [CA-192-4] El backend valida el receipt con Apple Server
|
|
- [CA-192-5] Las suscripciones se renuevan automaticamente via Apple
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimacion |
|
|
|----|-------|------------|
|
|
| MCH-TT-192-01 | Configurar productos en App Store Connect | 2h |
|
|
| MCH-TT-192-02 | Implementar StoreKit 2 en app iOS (React Native) | 6h |
|
|
| MCH-TT-192-03 | Implementar apple-iap.service.ts en backend | 5h |
|
|
| MCH-TT-192-04 | Crear endpoint POST /payments/verify-iap | 3h |
|
|
| MCH-TT-192-05 | Configurar Server Notifications de Apple | 3h |
|
|
| MCH-TT-192-06 | Implementar validacion de receipts con Apple API | 4h |
|
|
|
|
---
|
|
|
|
### MCH-US-193: In-App Purchase para Android
|
|
**Story Points:** 6
|
|
|
|
**Como** usuario de la app Android
|
|
**Quiero** comprar suscripciones o tokens desde la app
|
|
**Para** usar el metodo de pago configurado en Google Play
|
|
|
|
#### Criterios de Aceptacion
|
|
- [CA-193-1] Los productos estan configurados en Google Play Console
|
|
- [CA-193-2] Google Play Billing muestra la UI nativa de compra
|
|
- [CA-193-3] El backend valida la compra con Google Play API
|
|
- [CA-193-4] Las suscripciones se renuevan automaticamente via Google
|
|
- [CA-193-5] Se manejan correctamente los estados de compra pendiente
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimacion |
|
|
|----|-------|------------|
|
|
| MCH-TT-193-01 | Configurar productos en Google Play Console | 2h |
|
|
| MCH-TT-193-02 | Implementar Google Play Billing Library en app | 5h |
|
|
| MCH-TT-193-03 | Implementar google-billing.service.ts en backend | 4h |
|
|
| MCH-TT-193-04 | Crear endpoint para validacion de compras Google | 3h |
|
|
| MCH-TT-193-05 | Configurar Real-time Developer Notifications | 3h |
|
|
| MCH-TT-193-06 | Manejar estados de compra pendiente (PENDING) | 2h |
|
|
|
|
---
|
|
|
|
### MCH-US-194: Manejo de Pagos Fallidos con Reintentos
|
|
**Story Points:** 5
|
|
|
|
**Como** sistema
|
|
**Quiero** reintentar automaticamente pagos fallidos
|
|
**Para** maximizar la retencion de suscriptores y reducir churn involuntario
|
|
|
|
#### Criterios de Aceptacion
|
|
- [CA-194-1] Se ejecutan reintentos en dias 1, 3, 5 y 7 tras fallo inicial
|
|
- [CA-194-2] Se envia notificacion push y email en cada intento fallido
|
|
- [CA-194-3] El dia 7 se envia alerta de suspension inminente
|
|
- [CA-194-4] El dia 10 se suspende el servicio si no hay pago exitoso
|
|
- [CA-194-5] El usuario puede actualizar metodo de pago en cualquier momento
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimacion |
|
|
|----|-------|------------|
|
|
| MCH-TT-194-01 | Implementar job de reintentos programados (cron) | 4h |
|
|
| MCH-TT-194-02 | Crear templates de notificaciones de pago fallido | 2h |
|
|
| MCH-TT-194-03 | Implementar logica de suspension de servicio | 3h |
|
|
| MCH-TT-194-04 | Crear pantalla de actualizacion de metodo de pago | 4h |
|
|
| MCH-TT-194-05 | Implementar webhook para invoice.payment_failed | 2h |
|
|
| MCH-TT-194-06 | Agregar metricas de dunning para analytics | 2h |
|
|
|
|
---
|
|
|
|
### MCH-US-195: Gestion de Metodos de Pago Guardados
|
|
**Story Points:** 3
|
|
|
|
**Como** propietario de negocio
|
|
**Quiero** guardar y gestionar mis metodos de pago
|
|
**Para** facilitar pagos futuros sin reingresar datos
|
|
|
|
#### Criterios de Aceptacion
|
|
- [CA-195-1] El usuario puede guardar tarjetas de forma segura (tokenizadas)
|
|
- [CA-195-2] Se muestra lista de metodos guardados con ultimos 4 digitos
|
|
- [CA-195-3] El usuario puede seleccionar un metodo de pago por defecto
|
|
- [CA-195-4] El usuario puede eliminar metodos de pago guardados
|
|
- [CA-195-5] Los datos de tarjeta nunca se almacenan en nuestros servidores
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimacion |
|
|
|----|-------|------------|
|
|
| MCH-TT-195-01 | Implementar tabla payment_methods en base de datos | 2h |
|
|
| MCH-TT-195-02 | Crear endpoints CRUD para metodos de pago | 3h |
|
|
| MCH-TT-195-03 | Integrar Stripe SetupIntent para guardar tarjetas | 3h |
|
|
| MCH-TT-195-04 | Disenar componente PaymentMethodSelector | 3h |
|
|
| MCH-TT-195-05 | Implementar pantalla de gestion de metodos de pago | 3h |
|
|
|
|
---
|
|
|
|
### Resumen de Historias de Usuario
|
|
|
|
| ID | Historia | SP | Prioridad |
|
|
|----|----------|----|-----------|
|
|
| MCH-US-190 | Pagos con Tarjeta via Stripe Checkout | 8 | P0 |
|
|
| MCH-US-191 | Pagos en OXXO con Voucher | 5 | P0 |
|
|
| MCH-US-192 | In-App Purchase para iOS | 8 | P0 |
|
|
| MCH-US-193 | In-App Purchase para Android | 6 | P0 |
|
|
| MCH-US-194 | Manejo de Pagos Fallidos con Reintentos | 5 | P1 |
|
|
| MCH-US-195 | Gestion de Metodos de Pago Guardados | 3 | P1 |
|
|
| **Total** | | **34** | |
|
|
|
|
## Entregables
|
|
|
|
| Entregable | Estado | Archivo |
|
|
|------------|--------|---------|
|
|
| Stripe Checkout | En progreso | `services/stripe-checkout.service.ts` |
|
|
| OXXO Pay | Pendiente | `services/oxxo.service.ts` |
|
|
| Apple IAP | Pendiente | `services/apple-iap.service.ts` |
|
|
| Google Billing | Pendiente | `services/google-billing.service.ts` |
|
|
| Payment UI | Pendiente | `components/payments/` |
|
|
|
|
## Dependencias
|
|
|
|
### Depende de
|
|
- MCH-005 (Stripe base)
|
|
- MCH-018 (Suscripciones)
|
|
- MCH-019 (Tokens)
|
|
|
|
### Bloquea a
|
|
- Ninguno
|
|
|
|
## Criterios de Aceptacion
|
|
|
|
- [x] Pago con tarjeta funciona
|
|
- [x] OXXO genera voucher correcto
|
|
- [x] IAP iOS funciona
|
|
- [x] IAP Android funciona
|
|
- [x] Pagos fallidos se reintentan
|
|
- [x] Notificaciones se envian
|
|
|
|
## Configuracion Stripe
|
|
|
|
```typescript
|
|
{
|
|
stripe: {
|
|
secretKey: process.env.STRIPE_SECRET_KEY,
|
|
webhookSecret: process.env.STRIPE_WEBHOOK_SECRET,
|
|
oxxo: {
|
|
enabled: true,
|
|
expires_after_days: 3
|
|
},
|
|
retry: {
|
|
max_attempts: 4,
|
|
days_between: [0, 3, 5, 7]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
**Ultima actualizacion:** 2026-01-17
|