Desarrolladores
Webhooks

Webhooks

WizPay notifica a tu backend los eventos del ciclo de vida del pago con un POST JSON a la URL que configures. Los webhooks se administran desde tu panel (Webhooks), por evento y por sistema.

Formato del envío

POST https://tuservidor.com/webhooks/wizpay
Content-Type: application/json
Authorization: Bearer <key_auth>     ← solo si configuraste key_auth en el webhook

Todos los eventos comparten esta envolvente:

{
  "id_event": 2,
  "event": "payment.card.success",
  "id_system": 7,
  "timestamp": "2026-07-16T14:30:00.000Z",
  "...campos específicos del evento": "..."
}
  • Timeout: 10 segundos. Responde 2xx rápido (encola el trabajo pesado).
  • Autenticación: si configuraste key_auth, verifica el header Authorization: Bearer <key_auth> en tu receptor y rechaza lo demás.
  • Un fallo del webhook no afecta la transacción (es fire-and-forget).
⚠️

Los webhooks pueden llegar fuera de orden o (ante reintentos de red) duplicados. Usa reference como clave de idempotencia.

Catálogo de eventos

Pagos con tarjeta

EventoCuándo
payment.card.beforeJusto antes de enviar el cobro al procesador.
payment.card.successCobro aprobado.
payment.card.failedCobro rechazado o con error.
payment.card.fraud_blockedTarjeta bloqueada por antifraude antes de intentar el cobro.
payment.card.success
{
  "event": "payment.card.success",
  "reference": "WP-1784169095747-578AFA46",
  "order_id": "ORD-1042",
  "amount": 350.0,
  "currency": "BOB",
  "card_last4": "1111",
  "card_type": "001",
  "cybersource_id": "7364298471236458210433",
  "auth_code": "831000"
}
payment.card.failed
{
  "event": "payment.card.failed",
  "reference": "WP-...",
  "order_id": "ORD-1042",
  "amount": 350.0,
  "currency": "BOB",
  "card_last4": "1111",
  "card_type": "001",
  "reason": "DECLINED"
}

Tarjetas guardadas

EventoCuándo
payment.saved_card.beforeAntes de un cobro con tarjeta tokenizada.
payment.saved_card.successCobro con tarjeta guardada aprobado.
payment.saved_card.failedCobro con tarjeta guardada rechazado/fallido.

QR

EventoCuándo
payment.qr.beforeAntes de confirmar el pago QR.
payment.qr.successPago QR confirmado.
payment.qr.failedPago QR rechazado o expirado.

Transacciones (agregados, cualquier método)

EventoCuándo
transaction.successCualquier transacción aprobada.
transaction.failedCualquier transacción rechazada/fallida.
transaction.success
{
  "event": "transaction.success",
  "reference": "WP-...",
  "amount": 350.0,
  "currency": "BOB",
  "payment_method": "CARD",
  "cybersource_id": "7364298471236458210433"
}

Si solo quieres marcar pedidos como pagados, suscríbete únicamente a transaction.success — cubre tarjeta, tarjeta guardada y QR.

Suscripciones

EventoCuándo
subscription.createdSe creó una suscripción.
subscription.charge.beforeAntes del cobro automático del ciclo.
subscription.charge.successRenovación cobrada.
subscription.charge.failedCobro del ciclo falló (habrá reintento).
subscription.expiredSuperó los intentos fallidos → EXPIRED.
subscription.cancelledCancelada (manual o por enlace firmado).
subscription.created
{
  "event": "subscription.created",
  "reference": "sub_a1b2c3d4e5f6a7b8c9d0",
  "plan_name": "Plan Pro",
  "amount": 99.9,
  "currency": "BOB",
  "frequency": "MONTHLY",
  "next_charge_at": "2026-08-16 12:00:00"
}

Reembolsos

EventoCuándo
refund.requestedSe registró la solicitud de reembolso.
refund.completedEl procesador ejecutó el reembolso.

Receptor de ejemplo (Express)

app.post('/webhooks/wizpay', express.json(), (req, res) => {
  // 1) autenticar
  const auth = req.headers.authorization
  if (auth !== `Bearer ${process.env.WIZPAY_WEBHOOK_KEY}`) return res.sendStatus(401)
 
  // 2) responder YA (WizPay corta a los 10 s)
  res.sendStatus(200)
 
  // 3) procesar con idempotencia por reference
  const { event, reference } = req.body
  if (alreadyProcessed(reference, event)) return
  if (event === 'transaction.success') markOrderPaid(req.body)
})