POST /api/webhooks/stripe
Endpoint para recibir y procesar webhooks de Stripe relacionados con suscripciones, pagos y eventos de facturación.Autenticación
No usa autenticación Bearer tradicional. Stripe autentica las solicitudes usando:- Header
stripe-signaturecon la firma del webhook - Verificación mediante
STRIPE_WEBHOOK_SECRETconfigurado en el servidor
Headers Requeridos
Firma criptográfica generada por Stripe para verificar la autenticidad del webhook.
Debe ser
application/json. Stripe envía el body en formato JSON.Body
El body es un objeto de evento de Stripe con la siguiente estructura:ID único del evento de Stripe (ej:
evt_1234567890).Tipo de evento. Eventos soportados:
checkout.session.completed- Pago de suscripción completadocustomer.subscription.updated- Suscripción actualizadacustomer.subscription.deleted- Suscripción canceladainvoice.payment_succeeded- Pago mensual exitosoinvoice.payment_failed- Pago mensual fallido
Objeto que contiene los datos del evento según su tipo.
Eventos Procesados
checkout.session.completed
Se ejecuta cuando un usuario completa el pago exitosamente. Crea o actualiza la suscripción en la base de datos. Datos requeridos en metadata:userId- UUID del usuarioplan- Plan contratado:BASIC,PRO, oENTERPRISEpromotionCodeId(opcional) - ID del código promocional usado
customer.subscription.updated
Se ejecuta cuando una suscripción se actualiza (cambio de plan, renovación, etc.). Actualiza:- Plan actual
- Precio
- Estado de la suscripción
- Fechas del período actual
customer.subscription.deleted
Se ejecuta cuando una suscripción es cancelada. Acciones:- Marca la suscripción como
CANCELLED - Crea automáticamente una suscripción
FREEpara el usuario
invoice.payment_succeeded
Se ejecuta cuando un pago mensual es exitoso. Actualiza:- Fechas del período actual
- Estado a
ACTIVE
invoice.payment_failed
Se ejecuta cuando un pago falla. Actualiza:- Estado a
PAST_DUE
Response
Siempre
true si el webhook fue recibido.Mensaje de advertencia si el webhook secret no está configurado (solo en desarrollo).
Códigos de Estado
200- Webhook procesado exitosamente400- Falta headerstripe-signatureo firma inválida500- Error al procesar el webhook
Configuración
Para configurar este webhook en Stripe:- Ve a Stripe Dashboard → Developers → Webhooks
- Haz clic en “Add endpoint”
- URL del endpoint:
https://api.contafy.com/api/webhooks/stripe - Selecciona los eventos a escuchar:
checkout.session.completedcustomer.subscription.updatedcustomer.subscription.deletedinvoice.payment_succeededinvoice.payment_failed
- Copia el “Signing secret” y configúralo como
STRIPE_WEBHOOK_SECRETen las variables de entorno
Auditoría
Todos los eventos recibidos se registran en la tablaPaymentEvent con:
stripe_event_id- ID del eventostripe_event_type- Tipo de eventoevent_data- Datos completos del eventoprocessed_at- Fecha y hora de procesamiento