Le verdict en trois phrases
Un client peut fermer son onglet, perdre son réseau ou revenir sur votre page sans avoir payé: le retour navigateur n'est jamais une preuve de paiement. La seule source de vérité est le webhook signé envoyé par Wave ou Paystack directement à votre serveur, vérifié par signature HMAC-SHA256. Encaissez le webhook dans une file d'attente, répondez 200 en moins de 5 secondes, puis traitez la commande de façon asynchrone.
Pourquoi le retour navigateur ment
Le redirect_url sert à l'expérience utilisateur, pas à la comptabilité. Trois scénarios cassent la validation côté client: le client paie mais ne revient jamais (réseau 3G coupé), le client revient sans avoir payé (bouton retour), ou un robot rejoue l'URL de succès. Le webhook, lui, part du serveur de paiement vers le vôtre, indépendamment du navigateur.
| Signal | Fiable ? | Rôle | Risque si utilisé seul |
|---|---|---|---|
| Retour navigateur (redirect) | Non | UX / afficher un message | Commande fantôme, fraude |
| Webhook signé | Oui | Source de vérité | Aucun si signature vérifiée |
| Polling API status | Oui | Secours si webhook perdu | Charge serveur, latence |
| Email de confirmation | Non | Information | Falsifiable |
| Solde marchand (dashboard) | Oui | Réconciliation | Différé (T+1) |
L'architecture webhook + file d'attente
Le pattern gagnant en 2026 tient en cinq étapes: recevoir, vérifier la signature, déduplication par event_id, répondre 200 immédiatement, traiter en tâche de fond. Si le traitement échoue, Wave et Paystack rejouent l'événement — d'où l'importance de l'idempotence.
| Paramètre | Valeur 2026 | Détail |
|---|---|---|
| Algorithme signature | HMAC-SHA256 | Clé secrète webhook du dashboard |
| Header Paystack | x-paystack-signature | Hash du corps brut |
| Événement à traiter | charge.success | Ignorer les autres |
| Tolérance d'horloge | 5 min | Rejeter timestamps trop vieux |
| Délai de réponse | < 5 s | Sinon retry côté fournisseur |
| Nombre de retries | Jusqu'à 5 | Backoff exponentiel |
| Déduplication | Par event_id | TTL 72 h |
| Corps à hasher | Payload brut | Jamais le JSON re-sérialisé |
Règle d'or: calculez la signature sur le corps brut de la requête (raw body), pas sur l'objet JSON reparsé, sinon un espace ou un ordre de clés différent invalide le hash.
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.
Mini cas pratique
Awa, gérante d'une boutique de cosmétiques à Dakar, encaissait 320 commandes/mois via Wave et validait sur le retour navigateur. Résultat: 11 commandes fantômes/mois (clients partis avant paiement) et 4 litiges. En basculant sur le webhook signé + file d'attente, elle tombe à 0 commande fantôme. Sur un panier moyen de 18 000 FCFA, elle récupère la certitude sur 320 × 18 000 = 5 760 000 FCFA/mois de flux, sans plus jamais expédier une commande non payée.
FAQ
Faut-il vérifier la signature à chaque webhook ? Oui, sans exception. Un webhook non signé ou avec une signature invalide doit être rejeté avec un code 401, et jamais traité. C'est la seule barrière contre un attaquant qui simule un charge.success.
Que répondre si mon serveur est lent ? Répondez 200 en moins de 5 secondes après avoir juste enregistré l'événement en file d'attente. Ne faites aucun traitement lourd (email, mise à jour stock) avant le 200, sinon le fournisseur considère l'appel échoué et rejoue jusqu'à 5 fois.
Que faire d'un événement en double ? Déduplication par event_id avec un TTL de 72 h: si l'ID a déjà été traité, répondez 200 sans rien refaire. Environ 0,5 à 2 % des webhooks sont des rejeux légitimes.
Le webhook peut-il arriver avant le retour navigateur ? Oui, très souvent. Votre page de succès doit interroger l'état réel de la commande, pas supposer qu'elle est payée parce que l'utilisateur est revenu.
Comment tester en local ? Utilisez un tunnel (type ngrok) et l'outil de replay du dashboard Paystack/Wave pour rejouer un charge.success réel, puis vérifiez la signature avec votre clé de test.
Discutons de votre projet. Nous câblons vos webhooks Wave et Paystack avec signature vérifiée, file d'attente et idempotence, testés de bout en bout. 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.

