Buenas Prácticas de Integración

Esta página reúne las recomendaciones clave para construir una integración robusta, confiable y segura con los webhooks de Forpay.


Idempotencia

Tu receptor debe distinguir una retransmisión del mismo evento de un nuevo pago o cambio de estado de la misma cuota. Conserva las referencias de mandato, cuota y pago disponibles, el estado y la fecha del evento para contrastarlo con tu registro de recepción.

Una cuota puede tener varios pagos, intentos o transiciones. Deduplicar solo por installment.internalId, o por mandato más cuota, puede descartar eventos válidos. Define el criterio por tipo de evento y conserva el payload recibido para reconciliar los casos ambiguos. El campo signature se usa para verificar el HMAC y no identifica de forma única el evento.

Al reintentar tu procesamiento interno, reutiliza el registro de recepción y haz que las escrituras de negocio sean idempotentes.

Renotificaciones

Una misma cuota puede aparecer en notificaciones de pagos, rechazos, cobro en proceso o reversas. Conserva el historial de eventos, sus referencias y sus fechas para aplicar cada transición según corresponda.

La repetición del estado por sí sola no demuestra que se trate del mismo evento. Contrasta los eventos ambiguos o recibidos fuera de orden con las consultas de estado de la API antes de sobrescribir información conciliada.

Respuesta rápida al webhook

Valida el HMAC, guarda durablemente el evento y responde con HTTP 2xx, idealmente en menos de dos segundos. Este tiempo es una recomendación para el acuse de recepción. Realiza el procesamiento pesado mediante una cola o un worker después de confirmar el guardado.

app.post('/webhook/forpay', async (req, res) => {
  if (!validateHmac(req.body, HMAC_SECRET, req.body.signature)) {
    return res.status(401).json({ error: 'Invalid signature' });
  }
  try {
    // La implementación debe confirmar persistencia antes de devolver éxito.
    await inbox.saveForProcessing(req.body);
    return res.sendStatus(204);
  } catch (error) {
    return res.sendStatus(500);
  }
});

El ejemplo requiere una bandeja de entrada durable y un worker propios de tu integración.

Validar siempre la firma HMAC

Verifica signature antes de aceptar y procesar el evento, también en desarrollo. El HMAC autentica el conjunto de campos y el orden definidos en la receta correspondiente. Comprueba además la estructura y los valores que tu integración utiliza.

Si la firma no coincide, rechaza la solicitud y conserva el diagnóstico necesario para investigarla. El ejemplo de recepción anterior muestra el orden de validación, guardado y acuse. Ver Verificación HMAC.

No confiar únicamente en el webhook para confirmar pagos

El webhook es el mecanismo principal de notificación, pero pueden ocurrir demoras, pérdidas de conectividad o fallos temporales en tu servidor. Por eso se recomienda implementar una conciliación periódica consultando el estado de las cuotas directamente a la API de Forpay (GET /mandate/{mandateTypeId}/{mandateId}), especialmente para cuotas críticas o de alto monto.


Manejo de errores y reintentos en tu lado

Implementa un registro durable de recepción y de fallos de procesamiento para poder reintentar las tareas de tu integración. Complementa la recuperación con consultas de estado y la coordinación con Forpay cuando falten eventos.

async function processWebhookAsync(payload) {
  try {
    await upsertInstallmentState(payload);
  } catch (err) {
    // Registrar el fallo para revisión o reprocesamiento manual
    await db.failedWebhooks.create({
      payload: JSON.stringify(payload),
      error: err.message,
      receivedAt: new Date(),
    });
  }
}

Seguridad del endpoint

  • Usa HTTPS en tu URL de webhook como requisito de integración.
  • Evita exponer en logs el contenido completo del payload, ya que puede contener datos sensibles del cliente (RUT, número de cuenta).
  • Si es posible, restringe el acceso al endpoint a las IPs de Forpay (consulta a tu ejecutivo de integración la lista de IPs permitidas).

Resumen de buenas prácticas

PrácticaDescripción
IdempotenciaDistingue eventos y pagos de una misma cuota mediante sus referencias, estado y fecha.
Aceptar renotificacionesNo bloquees estados repetidos ni limites a un solo tipo de estado.
Responder rápidoValida el HMAC y guarda el evento antes del acuse 2xx, idealmente en menos de dos segundos.
Validar HMACSiempre verifica signature antes de procesar el evento.
Conciliación activaConsulta el estado de cuotas por API como respaldo ante fallos de webhook.
Registro de fallosAlmacena notificaciones no procesadas para reprocesamiento manual.
HTTPS y seguridadUsa HTTPS, evita loguear datos sensibles, restringe IPs si es posible.