Aller au contenu
WooRescueHQ

WooCommerce / Intégrations

Webhooks WooCommerce en échec : comment les diagnostiquer

Réponse courte

Vérifiez d’abord le statut du webhook et ses journaux de livraison. WooCommerce livre les webhooks en arrière-plan via Action Scheduler et désactive un webhook après plusieurs échecs de livraison consécutifs : toute réponse hors de la plage 2xx, ou un timeout, compte comme un échec. Les livraisons tardives pointent vers Action Scheduler ou WP-Cron ; les échecs, vers le point d’accès destinataire (erreurs, lenteur, vérification de signature, pare-feu) ; les doublons, vers des destinataires non idempotents.

Symptômes

  • Le système destinataire ne reçoit jamais certains événements, ou aucun.
  • Les événements arrivent avec des minutes ou des heures de retard.
  • Le statut du webhook est passé à Désactivé sans que personne n’y touche.
  • Le destinataire traite deux fois la même commande.
  • Le destinataire rejette les livraisons comme non authentifiées.

Causes les plus fréquentes

  1. Le destinataire échoue : il renvoie 4xx/5xx à cause de ses propres bugs, de règles d’authentification ou d’une validation de payloads inattendus.
  2. Le destinataire est trop lent : il fait tout son travail avant de répondre et la requête expire.
  3. Quelque chose bloque la livraison : le pare-feu, le WAF ou la liste d’IP autorisées du destinataire ; ou l’hébergeur de la boutique qui bloque les requêtes sortantes.
  4. La vérification de signature est fausse : calculée sur le JSON déjà décodé au lieu du corps brut, ou avec un ancien secret.
  5. Le traitement de fond est bloqué : Action Scheduler ou WP-Cron ne s’exécute pas, et les livraisons s’accumulent.
  6. Les destinataires ne sont pas idempotents : order.updated se déclenche à de nombreux enregistrements et les reprises renvoient des événements, donc la même commande arrive plusieurs fois.

Diagnostic

1. Vérifiez le statut et les journaux de livraison

Dans WooCommerce → Réglages → Avancé → Webhooks, vérifiez le statut (Actif, En pause, Désactivé), le sujet et l’URL de livraison. Consultez ensuite WooCommerce → État → Journaux pour le journal de livraison des webhooks, qui enregistre chaque livraison avec son code de réponse et sa durée.

Ce que montre le journal Ce que cela signifie
Aucune livraison pour des événements récents Événement non déclenché, ou livraisons encore en file
2xx Livré ; le problème est du côté destinataire
3xx L’URL de livraison redirige ; utilisez l’URL finale
401 / 403 Le destinataire ou son pare-feu rejette la requête
5xx Le destinataire a échoué pendant le traitement
Timeout / erreur de connexion Le destinataire est trop lent ou injoignable

2. Vérifiez la file

Les livraisons s’exécutent comme actions woocommerce_deliver_webhook_async. Dans Outils → Actions planifiées, cherchez ce hook : beaucoup d’actions En attente ou en retard signifient que la file n’est pas traitée ; les actions Échouées contiennent l’erreur.

3. Vérifiez le destinataire

Côté destinataire, journalisez la requête brute, les en-têtes et la réponse renvoyée pour une livraison de test. WooCommerce envoie des en-têtes utiles : X-WC-Webhook-Topic, X-WC-Webhook-Resource, X-WC-Webhook-ID, X-WC-Webhook-Delivery-ID et X-WC-Webhook-Signature.

Journaux et vérifications techniques

  • Réglages du webhook : statut, sujet, URL de livraison, secret, version de l’API.
  • Journaux WooCommerce pour les livraisons de webhooks.
  • Outils → Actions planifiées : actions de livraison en attente, en retard et échouées.
  • Journaux du destinataire : corps brut, en-têtes, code de réponse, temps de traitement.
  • Pare-feu des deux côtés : requêtes sortantes de la boutique, entrantes chez le destinataire.

Solutions

  • Répondez vite, traitez ensuite : le destinataire doit vérifier la signature, stocker l’événement et renvoyer 200 immédiatement, puis le traiter dans sa propre file.
  • Vérifiez les signatures sur le corps brut :
PHPreceiver/webhook.php
$payload   = file_get_contents( 'php://input' );
$signature = $_SERVER['HTTP_X_WC_WEBHOOK_SIGNATURE'] ?? '';
$expected  = base64_encode( hash_hmac( 'sha256', $payload, WEBHOOK_SECRET, true ) );

if ( ! hash_equals( $expected, $signature ) ) {
    http_response_code( 401 );
    exit;
}

// Stocker l’événement, renvoyer 200 tout de suite, le traiter en asynchrone.
  • Acceptez le ping que WooCommerce envoie à l’enregistrement d’un webhook (données de formulaire avec webhook_id) et renvoyez 200.
  • Rendez le traitement idempotent : utilisez l’identifiant de livraison et l’identifiant de la ressource avec sa date de modification pour ignorer les événements déjà appliqués.
  • Faites avancer la file : assurez-vous que WP-Cron s’exécute, de préférence depuis une vraie tâche cron du serveur, et résorbez toute accumulation d’Action Scheduler.
  • Réactivez le webhook après avoir corrigé le destinataire : repassez son statut en Actif.

Ce qu’il ne faut pas faire

  • Ne sautez pas la vérification de signature côté destinataire ; n’importe qui pourrait lui envoyer de fausses commandes.
  • N’exécutez pas de travail lent (appels ERP, e-mails, génération de PDF) avant de répondre au webhook.
  • Ne réactivez pas sans cesse un webhook désactivé sans corriger le destinataire ; il sera de nouveau désactivé.
  • Ne supprimez pas les actions de livraison en attente pour « faire le ménage » : ce sont des événements que le destinataire n’a pas encore vus.

Quand faire appel à un expert

Faites appel à un ingénieur quand l’intégration perd ou duplique des commandes, quand vous ne contrôlez qu’un côté de l’intégration et avez besoin de preuves pour l’autre, ou quand le destinataire doit être reconstruit pour être rapide, vérifié et idempotent.

Questions fréquentes

Pourquoi mon webhook WooCommerce a-t-il été désactivé ?

WooCommerce désactive un webhook après un certain nombre d’échecs de livraison consécutifs. Une livraison échoue quand le destinataire répond hors de la plage 2xx ou ne répond pas à temps. Corrigez le destinataire, puis repassez le webhook en Actif.

Pourquoi les webhooks arrivent-ils en retard ?

Les livraisons sont mises en file comme actions de fond. Si WP-Cron ou le runner d’Action Scheduler ne traite pas la file (peu de trafic, WP-Cron désactivé sans vraie tâche cron, ou accumulation), les livraisons attendent.

Comment vérifier la signature d’un webhook ?

Calculez un HMAC-SHA256 encodé en base64 du corps brut de la requête avec le secret du webhook, et comparez-le à l’en-tête X-WC-Webhook-Signature avec une comparaison à temps constant.

Pourquoi mon destinataire reçoit-il une requête qui n’est pas du JSON ?

À l’enregistrement d’un webhook, WooCommerce envoie un ping qui ne contient que webhook_id en données de formulaire. Les destinataires doivent l’accepter et répondre 200, sinon la première livraison compte déjà comme un échec.

$ décrivez le problème

Un problème avec WooCommerce ?Demandez un diagnostic.

Dites-nous ce qui ne fonctionne pas, ce qui a changé récemment et l'impact sur votre activité. Nous examinons chaque demande et vous recommandons la marche à suivre.

Demander un diagnostic Voir les services et les tarifs

N'envoyez jamais de mots de passe, de clés API ni de données de carte via le formulaire.

Diagnostic à partir de299 €

Demander un diagnostic