WooCommerce Webhook Einrichtung¶
Diese Anleitung zeigt, wie Sie den WooCommerce-Webhook für HostAdmin einrichten. Der Webhook ermöglicht es WooCommerce, HostAdmin automatisch über abgeschlossene Bestellungen zu informieren.
Übersicht¶
Webhook-Endpunkt: /api/woocommerce/webhook
Verarbeitetes Event: Topic order.updated, nur wenn status == completed. Alle anderen Topics/Status werden ignoriert.
Asynchrone Zustellung über WP-Cron
WooCommerce liefert Webhooks nicht sofort bei der Statusänderung aus, sondern über den Action Scheduler (Hook woocommerce_deliver_webhook_async) als geplante Hintergrundaufgabe. Läuft WP-Cron auf der WooCommerce-Installation nicht zuverlässig (z. B. weil die Seite selten besucht wird und wp-cron.php nur bei Seitenaufrufen getriggert wird), stauen sich die Zustellungen und kommen erst verzögert — teils erst nach mehreren Minuten oder gar nicht, bis WP-Cron wieder läuft — bei HostAdmin an. Für produktive Installationen empfiehlt sich ein echter System-Cronjob (z. B. alle 1–5 Minuten wp cron event run --due-now) statt des Standard-Pseudo-Cron. Zum Prüfen des Zustellstatus: WooCommerce → Status → Geplante Aktionen zeigt alle geplanten/ausgeführten/fehlgeschlagenen Webhook-Zustellversuche mit Zeitstempel.
Schritt 1: Webhook in WooCommerce anlegen¶
- WordPress-Adminbereich öffnen → WooCommerce → Einstellungen → Erweitert → Webhooks
- "Webhook hinzufügen" klicken
- Felder ausfüllen:
- Name: z. B. "HostAdmin Bestellungen"
- Status: Aktiv
- Thema:
Bestellung aktualisiert(order.updated) - Zustellungs-URL:
- Secret: Ein zufälliges, sicheres Secret generieren (z. B.
openssl rand -hex 32) und notieren - API-Version: WP REST API Integration v3 (aktuellste verfügbare Version)
- Speichern
Secret geheim halten
Das Webhook-Secret ist wie ein Passwort. Teilen Sie es niemals öffentlich und committen Sie es nicht in Git.
Kein festes Format
Anders als Stripe (whsec_...) gibt WooCommerce für das Secret kein Format oder Präfix vor — es ist ein beliebiger String, der 1:1 als HMAC-SHA256-Schlüssel für die Signaturberechnung verwendet wird. openssl rand -hex 32 ist lediglich eine Empfehlung für einen ausreichend langen, zufälligen Wert, keine WooCommerce-Vorgabe. Wichtig ist nur, dass exakt derselbe String sowohl im WooCommerce-Webhook-Feld "Secret" als auch in WOOCOMMERCE_WEBHOOK_SECRET (.env) hinterlegt wird.
Schritt 2: Webhook in HostAdmin konfigurieren¶
.env im src/-Verzeichnis öffnen oder Docker Env ergänzen:
Standardwert für WOOCOMMERCE_WEBHOOK_ENABLED
Fehlt die Variable, gilt true. Setzen Sie sie explizit auf false, um den Endpunkt gezielt zu deaktivieren (z. B. während Wartungsarbeiten) — der Endpunkt antwortet dann auf jeden Request mit 403 Forbidden, unabhängig von der Signatur.
Docker-Installation: Änderungen werden nach docker exec hostadmin-app php artisan config:clear und docker-compose restart app übernommen.
Schritt 3: Artikelnummern abgleichen¶
Der Webhook matcht die WooCommerce-SKU jedes Bestellpositions gegen die Artikelnummer (article_number) einer ServiceDefinition in HostAdmin. Stellen Sie sicher, dass:
- jedes WooCommerce-Produkt eine SKU gesetzt hat,
- diese SKU exakt der
article_numberder entsprechenden ServiceDefinition in HostAdmin entspricht (Admin → Service-Definitionen).
Passt eine SKU zu keiner ServiceDefinition, wird die Position übersprungen und als Fehler geloggt — die Bestellung wird trotzdem für die übrigen, gematchten Positionen angelegt.
Schritt 4: Webhook testen¶
Eine Testbestellung in einer WooCommerce-Testinstallation durchführen und auf Status "Abgeschlossen" setzen. Anschließend Logs prüfen:
Erwartete Log-Einträge bei Erfolg:
[...] local.INFO: WooCommerce webhook received {"topic":"order.updated","order_id":123,"status":"completed"}
[...] local.INFO: WooCommerce order processed {"order_id":123,"customer_id":45,"services_created":1}
Die Bestellung sollte danach im Admin-Panel unter Bestellungen (/admin/bestellungen) auftauchen.
Troubleshooting¶
Webhook wird mit 403 abgelehnt¶
Ursache: WOOCOMMERCE_WEBHOOK_ENABLED=false gesetzt.
Lösung: Variable entfernen oder auf true setzen, dann config:clear + Container-Neustart.
Webhook wird mit 400 abgelehnt ("Invalid signature")¶
Mögliche Ursachen:
WOOCOMMERCE_WEBHOOK_SECRETfehlt oder stimmt nicht mit dem in WooCommerce hinterlegten Secret überein.- Ein Reverse Proxy (nginx, Cloudflare) verändert den Request-Body, bevor er HostAdmin erreicht — die Signaturprüfung benötigt den unveränderten Raw-Body.
Lösung:
docker exec hostadmin-app grep WOOCOMMERCE_WEBHOOK_SECRET .env
docker exec hostadmin-app php artisan config:clear
docker-compose restart app
Bestellung wird empfangen, aber keine CustomerService angelegt¶
Ursache: Keine SKU im Bestellposten gesetzt, oder keine ServiceDefinition mit passender article_number gefunden.
Lösung: Logs prüfen (grep -i "SKU" storage/logs/laravel.log), Artikelnummern in WooCommerce und HostAdmin abgleichen.
Bestellung kommt gar nicht an (oder deutlich verzögert)¶
Zuerst prüfen: WooCommerce → Status → Geplante Aktionen — läuft dort noch eine Zustellung als "Ausstehend"? Dann liegt es an WP-Cron (siehe Hinweis "Asynchrone Zustellung" oben), nicht an HostAdmin. Ein Seitenaufruf auf der WordPress-Seite triggert den Pseudo-Cron und liefert die gestauten Zustellungen nach.
Erst wenn dort kein ausstehender Eintrag mehr existiert und trotzdem nichts bei HostAdmin ankommt: WooCommerce wiederholt fehlgeschlagene Zustellungen nicht automatisch (anders als Stripe). Bei Ausfällen (Endpunkt nicht erreichbar, 5xx-Fehler) muss die Bestellung manuell in HostAdmin nacherfasst werden. Zustellstatus lässt sich in WooCommerce unter WooCommerce → Einstellungen → Erweitert → Webhooks → Ihr Webhook → Zustellungsprotokoll einsehen.
Checkliste¶
WooCommerce¶
- Webhook angelegt, Thema
order.updated, Status Aktiv - Zustellungs-URL korrekt (HTTPS für Produktion)
- Secret generiert und notiert
- Zuverlässiges WP-Cron eingerichtet (System-Cronjob empfohlen, siehe Hinweis oben), sonst verzögerte Zustellung
HostAdmin¶
-
WOOCOMMERCE_WEBHOOK_SECRETin.envgesetzt (identisch zum WooCommerce-Secret) -
WOOCOMMERCE_WEBHOOK_ENABLED=truegesetzt (oder Variable weggelassen) - Artikelnummern zwischen WooCommerce-SKUs und ServiceDefinitions abgeglichen
- Middleware-Ausnahmen in
bootstrap/app.phpvorhanden (api/woocommerce/webhookbei CSRF/TrimStrings/ConvertEmptyStrings)
Testing¶
- Testbestellung durchgeführt und auf "Abgeschlossen" gesetzt
- Log-Eintrag "WooCommerce order processed" vorhanden
- Bestellung erscheint unter
/admin/bestellungen - Admin-Benachrichtigungs-E-Mail erhalten (falls
notify_email_activeaktiviert)
Siehe auch: WooCommerce Webhook API-Referenz