Bonnes pratiques pour les Webhooks
Sécurité, idempotence et monitoring des webhooks Jèko
Sécurité
Vérification de la signature
Toujours vérifier la signature de chaque webhook avant de le traiter. Ne traitez jamais un webhook sans vérifier son authenticité.
// Exemple de vérification (voir samples pour implémentations complètes)
const signature = request.headers['jeko-signature'];
const expectedSignature = calculateHMAC(rawBody, webhookSecret);
if (signature !== expectedSignature) {
return response.status(401).send('Invalid signature');
}HTTPS obligatoire
- Utilisez uniquement HTTPS pour vos endpoints webhook
- Ne configurez jamais une URL HTTP en production
- Utilisez des certificats SSL valides
Secret webhook
- Gardez votre secret webhook sécurisé : Ne le commitez jamais dans votre code
- Utilisez des variables d'environnement pour stocker le secret
- Ne partagez jamais votre secret via des canaux non sécurisés
- Régénérez votre secret si vous suspectez une compromission
Performance
Réponse rapide
Le délai d'attente est de 5 secondes. Accusez réception avant d'avoir fini votre traitement, sinon le webhook est réessayé :
- Acceptez immédiatement : Retournez un code HTTP 200 dès la réception
- Traitement asynchrone : Traitez le webhook en arrière-plan si nécessaire
- Queue : Utilisez une queue pour les traitements longs
Exemple : Traitement asynchrone
// Acceptez le webhook immédiatement
app.post('/webhook', async (req, res) => {
// Vérifier la signature
if (!verifySignature(req)) {
return res.status(401).send('Invalid signature');
}
// Retourner immédiatement
res.status(200).send('OK');
// Traiter en arrière-plan
await processWebhookAsync(req.body);
});Idempotence
Pourquoi l'idempotence est importante
Les webhooks peuvent être livrés plusieurs fois (lors des retries). Assurez-vous que le traitement d'un webhook est idempotent.
Stratégies d'idempotence
- ID de transaction : Utilisez le champ
iddu payload comme clé unique - Référence : Utilisez
transactionDetails.referencesi vous en avez fourni une à la création - Base de données : Stockez les transactions déjà traitées
Exemple : Vérification d'idempotence
async function processWebhook(transaction) {
const transactionId = transaction.id;
// Vérifier si la transaction a déjà été traitée
const existing = await db.findTransaction(transactionId);
if (existing) {
console.log('Transaction already processed:', transactionId);
return; // Déjà traitée, ignorer
}
await handleTransaction(transaction);
// Enregistrer la transaction comme traitée
await db.saveTransaction(transactionId, transaction);
}Gestion d'erreurs
Codes de statut appropriés
Retournez toujours un code HTTP approprié :
- 200-299 : Succès - webhook traité
- 400-499 : Erreur client - ne sera pas réessayé
- 500-599 : Erreur serveur - sera réessayé
Gestion gracieuse des erreurs
- Logging : Enregistrez toutes les erreurs pour le débogage
- Alertes : Configurez des alertes pour les erreurs critiques
- Fallback : Ayez un mécanisme de fallback si le webhook échoue
Logging et monitoring
Logs recommandés
Enregistrez les informations suivantes pour chaque webhook :
- Date de réception
idde la transactiontransactionTypeetstatus- Statut de votre traitement (succès/échec)
- Temps de traitement
Monitoring
Surveillez :
- Taux de succès/échec des webhooks
- Temps de réponse moyen
- Nombre de retries
- Erreurs récurrentes
Tests
Endpoint de test
Créez un endpoint de test pour valider votre intégration :
app.post('/webhook/test', (req, res) => {
console.log('Test webhook received:', req.body);
res.status(200).send('OK');
});Tests locaux
Utilisez des outils comme ngrok ou localtunnel pour tester vos webhooks localement.
Checklist d'intégration
- Endpoint HTTPS configuré
- Vérification de signature implémentée
- Secret webhook stocké de manière sécurisée
- Réponse immédiate, traitement en arrière-plan
- Traitement idempotent implémenté
- Codes de statut corrects en cas d'erreur
- Logging et monitoring configurés
- Tests effectués
Support
Si vous rencontrez des problèmes avec vos webhooks, contactez le support Jèko à hello@jeko.africa avec :
- L'
idde la transaction - La valeur de
executedAt - Les logs de votre endpoint
- Le code de statut retourné