Contents
Implementar pagos recurrentes con Stripe
Los pagos recurrentes (o suscripciones) son fundamentales para negocios SaaS, membresías, servicios de streaming y más. Stripe ofrece una plataforma completa y segura para gestionar cobros periódicos, planes, cupones, facturación y eventos de ciclo de vida.
1. ¿Por qué elegir Stripe para suscripciones
- Infraestructura a escala: soporta millones de transacciones mensuales.
- Soporte global: múltiples monedas y métodos de pago (tarjetas, débito SEPA, ACH, etc.).
- Seguridad y cumplimiento: PCI-DSS Level 1, cifrado de datos y tokenización.
- API flexible: integración sencilla con bibliotecas para Node.js, PHP, Python, Ruby, Java y más.
2. Requisitos previos
- Cuenta de Stripe activa. Regístrate en https://dashboard.stripe.com.
- Clave secreta (
STRIPE_SECRET_KEY
) y clave pública (STRIPE_PUBLISHABLE_KEY
). - Un servidor backend con tu lenguaje de preferencia.
- Conocimiento básico de webhooks para manejar eventos.
3. Modelo de datos de Stripe Billing
Antes de codificar, conviene entender los objetos principales:
Objeto | Descripción |
---|---|
Customer | Representa al usuario que paga. |
Product | Unidad de negocio: plan, servicio o producto. |
Price (Plan) | Define el importe, ciclo (mensual, anual) y moneda. |
Subscription | Vincula Customer con Price y genera facturas periódicas. |
4. Configuración de planes y precios
Desde el Dashboard de Stripe o usando la API:
const stripe = require(stripe)(process.env.STRIPE_SECRET_KEY)
async function crearPrice() {
const producto = await stripe.products.create({ name: Membresía Pro })
const price = await stripe.prices.create({
product: producto.id,
unit_amount: 2000, // 20.00 USD
currency: usd,
recurring: { interval: month }
})
return price
}
5. Integración cliente – Stripe Elements
Stripe Elements ofrece formularios seguros de pago:
En tu JavaScript:
const stripe = Stripe(pk_test_XXXX)
const elements = stripe.elements()
const card = elements.create(card)
card.mount(#card-element)
document.getElementById(subscription-form).addEventListener(submit, async (e) =gt {
e.preventDefault()
const { paymentMethod, error } = await stripe.createPaymentMethod({
type: card,
card: card
})
if (error) {
document.getElementById(card-errors).textContent = error.message
} else {
// Enviar paymentMethod.id al servidor
}
})
6. Lógica del servidor
Ejemplo en Node.js/Express:
app.post(/create-subscription, async (req, res) =gt {
const { email, paymentMethodId, priceId } = req.body
// Crear cliente
const customer = await stripe.customers.create({
payment_method: paymentMethodId,
email: email,
invoice_settings: { default_payment_method: paymentMethodId }
})
// Crear suscripción
const subscription = await stripe.subscriptions.create({
customer: customer.id,
items: [{ price: priceId }],
expand: [latest_invoice.payment_intent]
})
res.send(subscription)
})
7. Manejo de Webhooks
Los webhooks notifican eventos como pagos exitosos o fallidos. Configura en Dashboard gt Webhooks.
app.post(/webhook, express.raw({ type: application/json }), (req, res) =gt {
const sig = req.headers[stripe-signature]
let event
try {
event = stripe.webhooks.constructEvent(req.body, sig, process.env.STRIPE_WEBHOOK_SECRET)
} catch (err) {
return res.status(400).send(Webhook Error: {err.message})
}
switch (event.type) {
case invoice.payment_succeeded:
// Marcar suscripción como activa en tu BD
break
case invoice.payment_failed:
// Notificar al cliente o suspender acceso
break
// Otros eventos importantes...
}
res.json({ received: true })
})
8. Pruebas y modo sandbox
- Usa tarjetas de prueba (e.g., 4242 4242 4242 4242 en Visa) con fechas futuras y CVC cualquiera.
- Simula fallos con números especiales:
4000 0000 0000 0341
. - Verifica resultados en el Dashboard (modo test).
9. Ajustes avanzados
- Cambios de plan: usa
stripe.subscriptions.update
para upgrades/downgrades. - Cupones y descuentos: crea cupones en Dashboard gt Billing gt Coupons.
- Prorrateos: controla proration al cambiar items de suscripción.
- Pagos fallidos: configura Smart Retries en Dashboard gt Billing gt Settings.
10. Buenas prácticas y cumplimiento
- Mantén claves y webhook secrets en variables de entorno.
- Asegura tu servidor con HTTPS y cabeceras de seguridad.
- Implementa customer self-serve portal usando
stripe.billingPortal.sessions.create
. - Consulta la documentación oficial: https://stripe.com/docs/billing.
Conclusión
Stripe simplifica la gestión de pagos recurrentes con una API robusta y opciones de personalización. Siguiendo estos pasos, podrás ofrecer suscripciones seguras, escalables y fáciles de administrar. Revisa siempre las últimas guías en la documentación oficial de Stripe para mantener tu integración al día con nuevas funcionalidades y mejoras de seguridad.
|
Acepto donaciones de BAT's mediante el navegador Brave 🙂 |