Webhooks
Soyez notifié des événements en temps réel, de serveur à serveur.
Événements
| Événement | Émis quand |
|---|---|
payment.confirmed | Paiement confirmé on-chain. |
payment.failed | Paiement en échec (montant, réseau, délai). |
conversion.settled | Conversion USDT → FCFA verrouillée. |
payout.settled | Versement Mobile Money effectué. |
Vérifier la signature
Vérifier la signature (Node.js)
js
import { createHmac, timingSafeEqual } from "node:crypto";
export function signatureValide(corpsBrut, entete, secret) {
const attendu = createHmac("sha256", secret).update(corpsBrut).digest("hex");
const a = Buffer.from(attendu);
const b = Buffer.from(entete ?? "");
// Longueurs différentes : timingSafeEqual lève au lieu de rendre false.
if (a.length !== b.length) return false;
// Comparaison à temps CONSTANT : un === fuite la position du premier octet
// faux, ce qui suffit à reconstituer la signature par essais successifs.
return timingSafeEqual(a, b);
}Signature obligatoire
Vérifiez TOUJOURS la signature avant de traiter un webhook, et refusez au-delà de la fenêtre d’horodatage. La signature est un HMAC-SHA256 de « timestamp.corps » — le corps BRUT, avant tout parsing — transmis dans X-Coinnective-Signature, l’horodatage dans X-Coinnective-Timestamp. Sans cette vérification, n’importe qui devinant l’URL pourrait forger un événement ; sans la fenêtre, un webhook intercepté resterait rejouable indéfiniment.
