Récepteur de webhooks fiable : signature, idempotence, file et relances
Mettez en place un endpoint de webhooks qui vérifie la signature HMAC, répond vite, met le travail en file, ignore les doublons et relance avec backoff et file de messages en échec. Conçu pour ChatGPT, Claude, Gemini et Microsoft Copilot. Il comprend 4 variables personnalisables et vous pouvez le copier gratuitement en un clic.
Avancé · Code · En attente de relecture éditoriale
Prompt
Agis comme un ingénieur backend expérimenté en intégrations et systèmes distribués.
Je dois recevoir des webhooks de façon fiable :
- Fournisseur et méthode de signature : {{fournisseur}}
- Événements utiles et traitement de chacun : {{evenements}}
- Stack : {{stack}}
- Système de files disponible : {{file}}
Livrables :
1. Un schéma textuel du flux : réception, vérification, persistance, mise en file, traitement, relances et file des messages en échec.
2. L’endpoint de réception :
- Lit le corps brut avant tout parsing et vérifie la signature HMAC avec une comparaison à temps constant.
- Rejette les requêtes dont l’horodatage sort d’une courte fenêtre, pour éviter le rejeu.
- Enregistre l’événement et répond 2xx en quelques millisecondes ; aucune logique lourde dans la requête.
3. L’idempotence : table des événements avec l’identifiant du fournisseur en clé unique, états (reçu, en cours, traité, en échec) et conduite à tenir si le même événement arrive deux fois.
4. Le worker : traitement avec backoff exponentiel et jitter, nombre maximal de tentatives, distinction entre erreurs transitoires et définitives, file des messages en échec et moyen de les rejouer.
5. L’ordre d’arrivée : gérer les événements désordonnés (par exemple vérifier la version ou la date de la ressource, ou la relire via l’API du fournisseur).
6. Journalisation et alertes : quoi journaliser sans stocker de données sensibles et quelles métriques suivre.
7. Les tests : signature valide et invalide, événement en double, horodatage ancien, échec transitoire résolu et échec définitif envoyé dans la file d’échec.
8. Comment tester en local (tunnel ou transfert d’événements) sans exposer le secret.
Contraintes :
- Ne devine pas le format exact de signature ni les noms d’en-têtes : si je ne les donne pas, indique [À COMPLÉTER] et dis-moi où les trouver dans la documentation du fournisseur.
- Le secret est lu depuis des variables d’environnement ou un gestionnaire de secrets, jamais dans le code.
- S’il manque une information clé, demande-la avant d’écrire le code.Comment l'utiliser
- Reprenez dans la documentation du fournisseur l’en-tête de signature et l’algorithme utilisé.
- Listez les événements nécessaires et l’action métier associée à chacun.
- Testez en local avec des événements transférés et provoquez volontairement des erreurs pour observer les relances.
- Surveillez la file d’échec après le déploiement.
Exemple d'utilisation
Fournisseur : passerelle de paiement qui signe en HMAC-SHA256 dans un en-tête · Événements : paiement confirmé, remboursement · Stack : Python avec FastAPI · File : Celery avec Redis.
Exemple de résultat
1. Flux
Passerelle → POST /webhooks/paiements → vérifier signature + horodatage → INSERT événement (unique)
→ commit → 200 → Celery : traiter → retries avec backoff → dead-letter
2. Endpoint de réception
@router.post("/webhooks/paiements")
async def recevoir(request: Request, db: AsyncSession = Depends(get_db)) -> dict:
brut = await request.body() # corps brut, avant tout parsing
ts = request.headers.get("[À COMPLÉTER : en-tête horodatage]", "")
signature = request.headers.get("[À COMPLÉTER : en-tête signature]", "")
if not ts.isdigit() or abs(time.time() - int(ts)) > 300:
raise HTTPException(400, "horodatage absent ou expiré")
# Format du message signé selon la doc du fournisseur : [À COMPLÉTER]
attendue = hmac.new(settings.webhook_secret.encode(),
f"{ts}.".encode() + brut, hashlib.sha256).hexdigest()
if not hmac.compare_digest(attendue, signature): # comparaison à temps constant
raise HTTPException(400, "signature invalide")
evenement = json.loads(brut)
stmt = (insert(WebhookEvent)
.values(provider_event_id=evenement["id"], type=evenement["type"],
payload=evenement, statut="recu")
.on_conflict_do_nothing(index_elements=["provider_event_id"])
.returning(WebhookEvent.id))
nouvel_id = (await db.execute(stmt)).scalar_one_or_none()
await db.commit()
if nouvel_id is not None: # doublon → pas de nouvel envoi en file
traiter_evenement.delay(nouvel_id)
return {"ok": True}
On met en file après le commit pour que le worker ne lise jamais un événement pas encore enregistré…
Informations clés
- Catégorie
- Programmation et développement · API
- Type de résultat
- Code
- Niveau
- Avancé
- Conçu pour
- ChatGPT, Claude, Gemini et Microsoft Copilot
- Vérifié sur
- En attente de vérification éditoriale
- Variables
- Fournisseur et signature, Événements et actions, Stack et Système de files
- Langue
- Français
- Prix
- Gratuit, sans inscription
- Mis à jour
- 07/11/2026
Questions fréquentes
Pourquoi répondre 2xx avant de traiter l’événement ?
Beaucoup de fournisseurs considèrent un webhook trop lent comme échoué et le renvoient, ce qui crée des doublons et de la charge. Enregistrer et mettre en file permet de répondre tout de suite et de traiter ensuite.
Pourquoi vérifier la signature sur le corps brut ?
La signature porte sur les octets exacts envoyés. Si vous parsez puis resérialisez le JSON, les espaces ou l’ordre des clés changent et la vérification échoue.
À quoi sert ce prompt ?
Mettez en place un endpoint de webhooks qui vérifie la signature HMAC, répond vite, met le travail en file, ignore les doublons et relance avec backoff et file de messages en échec.
Avec quels outils d'IA fonctionne-t-il ?
Il est conçu pour ChatGPT, Claude, Gemini et Microsoft Copilot. Nous ne l'avons pas encore vérifié sur ces outils ; les résultats peuvent donc varier de l'un à l'autre.
Comment personnaliser le prompt ?
Cliquez sur « Personnaliser » et remplissez les variables (Fournisseur et signature, Événements et actions, Stack et Système de files). Le texte se met à jour instantanément et vous pouvez ensuite le copier en un clic. Les valeurs sont stockées uniquement dans votre navigateur.
Faut-il de l'expérience pour l'utiliser ?
Il est de niveau avancé : il s'adresse aux personnes expérimentées dans le domaine, capables d'évaluer et d'ajuster le résultat.
Ce prompt est-il gratuit ?
Oui. Tous les prompts de HomeCasa Prompts sont gratuits, sans inscription ni abonnement. Vous pouvez aussi les utiliser dans des projets professionnels.
Puis-je me fier au résultat de l'IA ?
Considérez-le comme un brouillon de qualité : vérifiez toujours les données, les chiffres et les affirmations importantes avant de publier ou de prendre des décisions.