Tutorial Destacado Acceso Libre 20 Feb, 2026

Tutorial: Configurar Stripe Checkout en Django

Implementación paso a paso de Stripe Checkout para cobros únicos y suscripciones en Django. Incluye webhooks, portal del cliente y manejo de estados.

#django #stripe #pagos #suscripciones #saas

Contenido

Configurar Stripe Checkout en Django

Guía paso a paso para integrar Stripe Checkout Session en Django. Cubre: crear sesión de pago, manejar webhooks, y activar suscripciones. El mismo patrón que usa esta comunidad.

Instalación

pip install stripe

Settings

# settings.py
import os
STRIPE_PUBLIC_KEY = os.environ['STRIPE_PUBLIC_KEY']
STRIPE_SECRET_KEY = os.environ['STRIPE_SECRET_KEY']
STRIPE_WEBHOOK_SECRET = os.environ['STRIPE_WEBHOOK_SECRET']
STRIPE_PRICE_ID = os.environ['STRIPE_PRICE_ID']  # Price ID del plan

Vista: Crear Checkout Session

import stripe
from django.conf import settings
from django.shortcuts import redirect
from django.contrib.auth.decorators import login_required

stripe.api_key = settings.STRIPE_SECRET_KEY

@login_required
def create_checkout(request):
    session = stripe.checkout.Session.create(
        payment_method_types=['card'],
        mode='subscription',
        customer_email=request.user.email,
        line_items=[{
            'price': settings.STRIPE_PRICE_ID,
            'quantity': 1,
        }],
        success_url=request.build_absolute_uri('/membership/success/'),
        cancel_url=request.build_absolute_uri('/membership/'),
        metadata={
            'user_id': str(request.user.id),
        },
    )
    return redirect(session.url)

Webhook: Recibir confirmación de pago

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_POST
import json

@csrf_exempt
@require_POST
def stripe_webhook(request):
    payload = request.body
    sig = request.META.get('HTTP_STRIPE_SIGNATURE', '')

    try:
        event = stripe.Webhook.construct_event(
            payload, sig, settings.STRIPE_WEBHOOK_SECRET
        )
    except (ValueError, stripe.error.SignatureVerificationError):
        return HttpResponse(status=400)

    if event['type'] == 'checkout.session.completed':
        session = event['data']['object']
        user_id = session['metadata']['user_id']
        activate_membership(user_id, session['subscription'])

    elif event['type'] == 'customer.subscription.deleted':
        subscription = event['data']['object']
        deactivate_membership(subscription['id'])

    return HttpResponse(status=200)


def activate_membership(user_id, subscription_id):
    from django.contrib.auth import get_user_model
    User = get_user_model()
    user = User.objects.get(id=user_id)

    membership, _ = Membership.objects.get_or_create(user=user)
    membership.is_active = True
    membership.stripe_subscription_id = subscription_id
    membership.save()

def deactivate_membership(subscription_id):
    try:
        membership = Membership.objects.get(
            stripe_subscription_id=subscription_id
        )
        membership.is_active = False
        membership.save()
    except Membership.DoesNotExist:
        pass

URLs

urlpatterns = [
    path('membership/checkout/', create_checkout, name='checkout'),
    path('membership/webhook/', stripe_webhook, name='stripe-webhook'),
    path('membership/success/', success_view, name='checkout-success'),
]

Template: Botón de checkout

<a href="{% url 'checkout' %}"
   class="bg-emerald-500 text-white px-6 py-3 rounded-lg hover:bg-emerald-600">
  Activar Membresía — $9.99/mes
</a>

Testing con Stripe CLI

# Instalar Stripe CLI
brew install stripe/stripe-cli/stripe

# Login
stripe login

# Forward webhooks a tu localhost
stripe listen --forward-to localhost:8000/membership/webhook/

# Tarjeta de prueba: 4242 4242 4242 4242, cualquier fecha futura, CVC 123

Checklist pre-producción

  • Cambiar API keys de test a live en variables de entorno
  • Configurar webhook endpoint en Stripe Dashboard → Developers → Webhooks
  • Eventos a escuchar: checkout.session.completed, customer.subscription.updated, customer.subscription.deleted
  • Verificar que STRIPE_WEBHOOK_SECRET sea el del endpoint de producción (no el de CLI)

Recurso Externo

Este recurso incluye un enlace externo. Regístrate para acceder.

Inicia Sesión para Acceder

Únete a la Comunidad

Regístrate gratis para descargar archivos, guardar recursos en favoritos, ganar XP y acceder a cursos y el foro de la comunidad.

¿Ya tienes cuenta? Inicia sesión

Erik Taveras

Autor

Erik Taveras

Recursos Relacionados