https y resolver a una dirección pública: la comprobamos al guardarlo y
antes de cada entrega.
Los eventos
No existe
verification.created: esa llamada la hiciste tú y tienes la respuesta.
Una verificación enviada a revisión manda verification.decided dos veces. La primera con
decision: "REVIEW"; la segunda cuando una persona resuelve el caso, con APPROVED o DECLINED.
No trates el primero como definitivo.
Un verification.abandoned puede ser seguido por un verification.decided. Damos por perdida
a una persona pasado el plazo, y hoy el enlace que le dimos puede sobrevivir a ese momento: si
vuelve y termina, se decide con normalidad. Aplica el que llegue después.
El payload
Cabeceras
X-FraudEG-Delivery identifica el intento y cambia en cada reintento. X-FraudEG-Event te deja
enrutar antes de parsear.
Verificar la firma
CalculaHMAC-SHA256(timestamp + "." + cuerpo_crudo, secreto) en hexadecimal y compáralo contra
cada valor v1= de la cabecera, en tiempo constante.
- Usa los bytes crudos, antes de parsear el JSON. Pasar por un parser puede reordenar claves o cambiar cómo se escribe un número, y tu firma deja de coincidir por razones que nadie puede depurar.
- Compara en tiempo constante. Un
==entre cadenas filtra la firma byte a byte. - Comprueba el timestamp. Rechaza lo que tenga más de cinco minutos, o una entrega capturada vale para siempre.
Rotar el secreto
La cabecera puede traer más de un valorv1=, y durante una rotación trae dos. Por eso el
ejemplo recorre una lista:
- Rota en el panel. El secreto nuevo se muestra una sola vez; el anterior sigue firmando 24 horas.
- Agrega el nuevo a tu verificador, junto al viejo.
- Cuando lo veas verificar, quita el viejo.
Qué garantizamos, y qué no
- Al menos una vez. Deduplica por
event_id. Dos endpoints de una misma compañía reciben el mismoevent_idpara el mismo hecho. - Sin orden garantizado entre verificaciones. Dentro de una, gana el
occurred_atmás reciente. - Un 2xx es éxito. Cualquier otra cosa se reintenta, incluido un 3xx: no seguimos redirecciones, porque una redirección vieja o un DNS comprometido entregaría payloads firmados a un host que nunca registraste.
- Responde rápido. Una entrega expira a los 10 segundos. Contesta 2xx y haz el trabajo después.
- Los reintentos son acotados. Ocho intentos repartidos en unas 28 horas; después la entrega queda marcada, visible en el panel y se puede reenviar a mano.
- Un endpoint muerto se pausa. Si nada tiene éxito durante 24 horas dejamos de enviar y te avisamos. Lo que te debíamos sigue en cola.
- No garantizamos la entrega. Por eso lo siguiente no es opcional.
Reconcilia igual
Una vez al día, lista las verificaciones del día anterior y compáralas con tus registros. Eso cubre lo que la entrega haya perdido, y es exactamente el caso que un presupuesto acotado de reintentos deja abierto. Es parte del contrato, no un parche.https://sandbox-api.fraudeg.com/api. Ver
GET /verifications y Entornos.