Volver a la wiki

Endpoint POST /api/billing/webhook/stripe — Receptor de eventos de Stripe

Resumen

Endpoint público (sin autenticación de usuario) que recibe eventos del webhook de Stripe. Verifica la firma HMAC del header Stripe-Signature contra la clave STRIPE_WEBHOOK_SECRET y procesa o almacena cada evento en el ledger global StripeEvent.

Ubicación: billing/api.py:stripe_webhook(request) → registrado en config/urls.py como /api/billing/webhook/stripe

Firma y autenticación

@router.post("/webhook/stripe", auth=None)
def stripe_webhook(request):

Flujo de procesamiento

  1. Extrae firma del header Stripe-Signature
  2. Verifica HMAC → 400 Bad Request si no coincide o es vieja (tolerancia: 300 s de replay)
  3. Parsea payload JSON (body crudo)
  4. Get-or-create StripeEvent en la tabla ledger (clave: event_id único)
  5. Si es reentrega (evento ya processed o skipped) → responde 200 + {"duplicate": True} sin re-procesar
  6. Si es nuevo → llama apply_event(payload) para mapear estado de Stripe a Organization
  7. Guarda resultado (status, org_id, timestamp) y responde 200
  8. En caso de error → status=error, responde 500 para que Stripe reintente

Comportamientos notables

Configuración (settings)

STRIPE_WEBHOOK_SECRET = os.getenv("STRIPE_WEBHOOK_SECRET") or ""
# Vacío en dev/test; en PROD solo se activa en PR-4 tras ir-live en test mode

Eventos manejados

Mapeados en billing/services.py:apply_event():

Otros tipos → skipped (200 sin error)

Tests

tests/billing/test_stripe_webhook.py (12 tests):

Véase también

Subir