Salta al contingut
WooRescueHQ

WooCommerce / Integracions

Webhooks de WooCommerce que fallen: com diagnosticar-los

Resposta curta

Revisa primer l’estat del webhook i els seus registres de lliurament. WooCommerce lliura els webhooks en segon pla mitjançant Action Scheduler i desactiva un webhook després de diversos lliuraments fallits consecutius: qualsevol resposta fora del rang 2xx, o un timeout, compta com a fallada. Els lliuraments tardans apunten a Action Scheduler o WP-Cron; les fallades, a l’endpoint receptor (errors, lentitud, comprovació de signatura, tallafocs); els duplicats, a receptors que no són idempotents.

Símptomes

  • El sistema receptor no rep alguns esdeveniments, o cap.
  • Els esdeveniments arriben amb minuts o hores de retard.
  • L’estat del webhook ha passat a Desactivat sense que ningú el toqués.
  • El receptor processa la mateixa comanda dues vegades.
  • El receptor rebutja els lliuraments perquè no estan autenticats.

Causes més habituals

  1. El receptor falla: retorna 4xx/5xx per les seves pròpies fallades, les seves regles d’autenticació o la seva validació de payloads inesperats.
  2. El receptor és massa lent: fa tota la feina abans de respondre i la petició supera el temps.
  3. Alguna cosa bloqueja el lliurament: el tallafoc, el WAF o la llista d’IPs permeses del receptor; o el hosting de la botiga bloqueja les peticions sortints.
  4. La verificació de la signatura està mal feta: calculada sobre el JSON ja interpretat en lloc del cos en brut, o amb un secret antic.
  5. El processament en segon pla està encallat: Action Scheduler o WP-Cron no s’executen, i els lliuraments s’acumulen.
  6. Els receptors no són idempotents: order.updated es dispara en molts desaments i els reintents reenvien esdeveniments, així que la mateixa comanda arriba diverses vegades.

Diagnosi

1. Revisa l’estat i els registres de lliurament

A WooCommerce → Paràmetres → Avançat → Webhooks, revisa l’estat (Actiu, En pausa, Desactivat), el tema i la URL de lliurament. Després busca a WooCommerce → Estat → Registres el registre de lliuraments de webhooks, que anota cada lliurament amb el seu codi de resposta i la seva durada.

Què mostra el registre Què vol dir
Cap lliurament per a esdeveniments recents L’esdeveniment no s’ha disparat, o els lliuraments encara són a la cua
2xx Lliurat; el problema és al costat receptor
3xx La URL de lliurament redirigeix; fes servir la URL final
401 / 403 El receptor o el seu tallafoc rebutgen la petició
5xx El receptor ha fallat en processar-la
Timeout / error de connexió El receptor és massa lent o no és accessible

2. Revisa la cua

Els lliuraments s’executen com a accions woocommerce_deliver_webhook_async. A Eines → Accions programades, busca aquest hook: moltes accions Pendents o amb data passada volen dir que la cua no es processa; les accions Fallides contenen l’error.

3. Revisa el receptor

Al costat receptor, registra la petició en brut, les capçaleres i la resposta que retorna per a un lliurament de prova. WooCommerce envia capçaleres útils: X-WC-Webhook-Topic, X-WC-Webhook-Resource, X-WC-Webhook-ID, X-WC-Webhook-Delivery-ID i X-WC-Webhook-Signature.

Registres i comprovacions tècniques

  • Paràmetres del webhook: estat, tema, URL de lliurament, secret, versió de l’API.
  • Registres de WooCommerce per als lliuraments de webhooks.
  • Eines → Accions programades: accions de lliurament pendents, vençudes i fallides.
  • Registres del receptor: cos en brut, capçaleres, codi de resposta, temps de processament.
  • Tallafocs als dos costats: peticions sortints des de la botiga, entrants al receptor.

Solucions

  • Respon ràpid, processa després: el receptor ha de verificar la signatura, desar l’esdeveniment i retornar 200 immediatament, i processar-lo després a la seva pròpia cua.
  • Verifica les signatures sobre el cos en 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;
}

// Desa l’esdeveniment, retorna 200 ara i processa’l de manera asíncrona.
  • Accepta el ping que WooCommerce envia en desar un webhook (dades de formulari amb webhook_id) i retorna 200.
  • Fes el processament idempotent: fes servir l’ID de lliurament i l’ID del recurs juntament amb la seva data de modificació per ometre els esdeveniments ja aplicats.
  • Mantén la cua en marxa: assegura’t que WP-Cron s’executa, preferiblement des d’un cron real del servidor, i buida qualsevol acumulació d’Action Scheduler.
  • Reactiva el webhook després d’arreglar el receptor: torna’l a posar a Actiu.

Què no s’ha de fer

  • No et saltis la verificació de la signatura al receptor; qualsevol li podria enviar comandes falses.
  • No executis feina lenta (crides a l’ERP, correus, generació de PDF) abans de respondre al webhook.
  • No reactivis una vegada i una altra un webhook desactivat sense arreglar el receptor; es tornarà a desactivar.
  • No esborris accions de lliurament pendents per «netejar»: són esdeveniments que el receptor encara no ha vist.

Quan recórrer a un expert

Recorre a un enginyer quan la integració perd o duplica comandes, quan només controles un costat de la integració i necessites evidències per a l’altre, o quan cal reconstruir el receptor perquè sigui ràpid, verificat i idempotent.

Preguntes freqüents

Per què s’ha desactivat el meu webhook de WooCommerce?

WooCommerce desactiva un webhook després d’un nombre de lliuraments fallits consecutius. Un lliurament falla quan el receptor respon fora del rang 2xx o no respon a temps. Arregla el receptor i torna a posar el webhook a Actiu.

Per què els webhooks arriben tard?

Els lliuraments s’encuen com a accions en segon pla. Si WP-Cron o el runner d’Action Scheduler no processen la cua (poc trànsit, WP-Cron desactivat sense un cron real que el substitueixi, o acumulació d’accions), els lliuraments esperen.

Com verifico la signatura d’un webhook?

Calcula un HMAC-SHA256 en base64 del cos en brut de la petició amb el secret del webhook i compara’l amb la capçalera X-WC-Webhook-Signature mitjançant una comparació de temps constant.

Per què el meu receptor rep una petició que no és JSON?

En desar un webhook, WooCommerce envia un ping que només conté webhook_id com a dades de formulari. Els receptors l’han d’acceptar i respondre 200; si no, el primer lliurament ja compta com a fallada.

$ descriu el problema

Tens un problema amb WooCommerce?Sol·licita una diagnosi.

Explica'ns què falla, què ha canviat darrerament i com afecta el negoci. Revisem cada sol·licitud i et recomanem el pas següent.

Sol·licitar una diagnosi Veure serveis i preus

No enviïs mai contrasenyes, claus d'API ni dades de targetes a través del formulari.

Diagnosi des de299 €

Sol·licitar una diagnosi