Implementar pagos recurrentes con Stripe

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

  1. Cuenta de Stripe activa. Regístrate en https://dashboard.stripe.com.
  2. Clave secreta (STRIPE_SECRET_KEY) y clave pública (STRIPE_PUBLISHABLE_KEY).
  3. Un servidor backend con tu lenguaje de preferencia.
  4. 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 🙂



Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *