Aplicación starter

Facturación con Stripe

Configura precios, checkout idempotente, webhooks, créditos, seguridad del portal y reconciliación.

Sincronizado con el commit 7d452a6 del starter.

Crea Prices estables mensuales y anuales para Plus y Max; define STRIPE_PRICE_*, STRIPE_PRIVATE_KEY y STRIPE_WEBHOOK_SECRET. Los Prices CNY son opcionales. Importes y catálogo viven en src/config/billing.ts; los IDs quedan solo en servidor.

Checkout es solo para el owner y exige Idempotency-Key. Se crea intención/orden antes de Stripe: repetir la misma petición tiene un solo efecto y una segunda compra deliberada usa otra clave. Varias suscripciones pueden coexistir y el resolver combina sus entitlements.

Webhooks

Publica /api/pay/notify/stripe y suscribe checkout completado/expirado, alta/cambio/baja de suscripción, invoice pagada/fallida y reembolso/disputa. Se verifica firma, se deduplican eventos, se respeta su tiempo ante desorden y cada beneficio se concede una vez. Renovaciones crean orden y créditos mensuales.

Reembolsos y disputas se señalan para revisión; no se retiran silenciosamente créditos gastados. Usa el comando de reconciliación y la vista admin para estados inciertos.

Portal y pruebas

Configura Stripe Billing Portal y su ID en producción. Desactiva cambios de suscripción en el portal; una configuración insegura falla cerrada.

stripe listen --forward-to localhost:3000/api/pay/notify/stripe

Prueba duplicados, webhooks tardíos, renovación, fallo, cancelación, reembolso y portal. En producción usa claves live y solo eventos live.

Facturación con Stripe · Sushi SaaS