Le verdict en trois phrases
Le webhook est la seule source de vérité d'un paiement Wave : ne validez jamais une commande sur le retour navigateur, toujours sur l'événement serveur. Trois mécanismes le rendent fiable : vérifier la signature HMAC pour authentifier Wave, une table d'idempotence indexée sur event_id pour ne traiter chaque événement qu'une fois, et répondre 200 immédiatement (< 10 s) puis traiter en queue. Sans ces trois piliers, vous risquez double-crédit, fausses confirmations et commandes fantômes.
Les événements webhook Wave à gérer
Wave envoie plusieurs types d'événements ; votre handler doit les router proprement. Ordres de grandeur 2026 (estimation, vérifier la doc Wave Business) :
| Événement | Statut | Action recommandée |
|---|---|---|
| checkout.session.completed | completed | Valider commande, débloquer livraison |
| checkout.session.failed | failed | Notifier client, proposer autre wallet |
| checkout.session.processing | processing | Attendre, ne rien débloquer |
| refund.completed | refunded | Annuler commande, mettre à jour stock |
| refund.failed | failed | Alerter le support |
| balance.payout | settled | Marquer settlement T+1 reçu |
Signature, idempotence et retries
Wave signe chaque payload (HMAC) et retente en cas d'échec. Paramètres de référence 2026 :
| Mécanisme | Valeur de référence | Pourquoi |
|---|---|---|
| Algorithme de signature | HMAC-SHA256 | Authentifier l'origine Wave |
| Header de signature | Wave-Signature | À comparer au calcul local |
| Nombre de retries | 5 tentatives sur 24 h | Tolérer une panne temporaire |
| Backoff | Exponentiel (1m, 5m, 30m, 2h, 6h) | Éviter le martèlement |
| Timeout attendu | 10 s max | Au-delà, Wave considère l'échec |
| Réponse attendue | HTTP 200 rapide | Confirme la réception |
La table d'idempotence stocke chaque event_id avec une contrainte d'unicité : si l'événement arrive deux fois (retry après timeout), l'insertion échoue et le traitement est ignoré — le crédit n'a lieu qu'une fois.
Un handler Next.js robuste
`ts
export async function POST(req: Request) {
const raw = await req.text();
const sig = req.headers.get("Wave-Signature");
if (!verifyHmac(raw, sig, process.env.WAVE_SECRET))
return new Response("invalid signature", { status: 401 });
const event = JSON.parse(raw);
const inserted = await db.insertIfAbsent("wave_events", event.id);
Besoin d'un site web professionnel ?
Kolonell crée des sites web qui attirent des clients, optimisés pour le marché sénégalais. Devis gratuit en 2 minutes.
// Répondre 200 tout de suite, traiter ensuite en queue
if (inserted) await queue.enqueue("wave", event);
return new Response("ok", { status: 200 });
}
`
Le handler fait trois choses et rend la main : vérifier la signature, dédupliquer via insertIfAbsent, répondre 200. Tout le métier (validation commande, e-mail, stock) part en queue asynchrone pour rester sous les 10 s.
Mini cas pratique
Ibrahim, restaurateur à Dakar avec livraison, recevait 2 % de commandes payées mais jamais confirmées car son handler validait sur le retour navigateur — coupé quand le client fermait l'app. Sur 1 500 commandes/mois à 6 500 FCFA, cela représentait 30 commandes perdues, soit 195 000 FCFA/mois de litiges et remboursements manuels. En basculant sur le webhook signé + idempotent, le taux de confirmation est passé à 99,7 % et les litiges ont quasiment disparu.
FAQ
Pourquoi répondre 200 avant de traiter ?
Si votre traitement dépasse 10 s, Wave considère l'envoi en échec et déclenche un retry, ce qui crée des doublons. Répondre 200 vite puis traiter en queue casse ce cercle.
Que faire si la signature ne correspond pas ?
Renvoyer un 401 et ne rien traiter : un payload non signé correctement n'est pas authentifié et pourrait être une tentative de fraude.
Combien de temps Wave réessaie-t-il ?
En général 5 tentatives réparties sur 24 h avec un backoff exponentiel (estimation 2026). Votre table d'idempotence garantit qu'aucun de ces retries ne double-crédite.
Faut-il stocker tous les événements ?
Oui, au minimum l'event_id, le statut et l'horodatage. C'est indispensable pour la réconciliation comptable et pour rejouer un événement en cas de bug.
Discutons de votre projet. Nous livrons des webhooks Wave signés, idempotents et monitorés, prêts pour la production. WhatsApp +221 77 596 93 33.
Mohamed Bah
Fondateur, Kolonell
Passionné par le digital et l'entrepreneuriat en Afrique, Mohamed accompagne les entreprises sénégalaises dans leur transformation digitale depuis 2020. Fondateur de Kolonell, il croit que chaque PME mérite une présence en ligne professionnelle et accessible.

