WooCommerce-REST-API-Adapter
Kompatibel zu v3
Zuletzt aktualisiert: 5. September 2026
Eine unmittelbar einsetzbare, kompatible REST-API für STOAR, die das Protokollformat von WooCommerce v3 nachbildet — dieselben URL-Pfade (/wp-json/wc/v3/...), dieselbe flache Query-Parameter-Syntax, dieselben JSON-Feldnamen in der Antwort, dieselben Auth-Optionen. Bestehende WooCommerce-Client-Bibliotheken (z. B. automattic/woocommerce PHP/JS, klarna/woocommerce-rest-api Node) sprechen ohne Änderung mit STOAR.
Der Adapter ist die zweite Implementierung von STOARs erweiterbarem API-Adapter-Framework (die erste war Magento). Er zeigt, wie eine grundlegend andere Anbietervariante — flache Query-Parameter statt verschachteltem searchCriteria[…], Basic Auth statt ausschließlich Bearer, das Statusvokabular processing/completed statt paid/delivered — auf derselben Datenschicht neben Magento steht.
Inhaltsverzeichnis #
- Schnellstart
- Authentifizierung
- Endpunkte
- Query-Parameter
- Feld-Mapping (WooCommerce ↔ STOAR)
- Statusübersetzung
- Antwortstruktur
- Praxisbeispiel
- Fehlerstruktur
- Rate-Limiting
Schnellstart #
# 1. Get a Sanctum token with woocommerce:admin ability — issued via /manager/api-tokens
# or via the Magento token endpoint (POST /rest/V1/integration/admin/token), then
# grant the woocommerce:admin ability inside /manager.
TOKEN="2|L5pXj63e881lkgtHPK7Hjozyq7Pb3trHCy0iaDRf76405f72"
# 2. List the last 5 orders (Bearer auth — STOAR extension; works alongside Basic)
curl -s "https://app.stoar.ai/wp-json/wc/v3/orders?per_page=5&orderby=date&order=desc" \
-H "Authorization: Bearer $TOKEN" \
| jq '.[] | {id, status, total, currency}'
# 3. Use HTTP Basic just like a real WooCommerce store
curl -s "https://app.stoar.ai/wp-json/wc/v3/products?per_page=3" \
-u "any-key:$TOKEN"
# 4. Or stuff credentials into the query string (still over HTTPS only)
curl -s "https://app.stoar.ai/wp-json/wc/v3/products?consumer_key=any&consumer_secret=$TOKEN"
Authentifizierung #
WooCommerce kennt drei Auth-Varianten; der Adapter akzeptiert alle und überführt sie intern in dieselbe Prüfung eines Sanctum-Personal-Access-Tokens. Tokens werden auf STOARs Seite /manager/api-tokens ausgestellt (oder programmatisch über AdminUser::createToken('label', ['woocommerce:admin'])).
| Methode | Format | Anwendungsfall |
|---|---|---|
| HTTP Basic | Authorization: Basic base64(consumer_key:consumer_secret) |
Standard für die meisten WC-Client-Bibliotheken — nur über HTTPS |
| Query-Parameter | ?consumer_key=…&consumer_secret=… |
Schnelltest mit curl — nur über HTTPS |
| Bearer (STOAR-Erweiterung) | Authorization: Bearer <token> |
Natives Sanctum — austauschbar mit dem Magento-Adapter |
Abbildung auf Sanctum
Der Adapter ignoriert consumer_key (du kannst jede beliebige Zeichenkette übergeben — "any-key" funktioniert). consumer_secret MUSS ein gültiges Sanctum-Personal-Access-Token sein, dessen abilities-Array woocommerce:admin enthält.
Diese Abbildung ist reine Interpretationsschicht; aus Sicht von STOAR ist jede WC-Anfrage lediglich eine per Bearer authentifizierte Sanctum-Anfrage. Dieselbe Personal-Access-Token-Zeile trägt beides:
- einen Magento-Client, der
/rest/V1/ordersnutzt (benötigt die Abilitymagento:admin) - einen WooCommerce-Client, der
/wp-json/wc/v3/ordersnutzt (benötigt die Abilitywoocommerce:admin)
Du kannst ein einzelnes Token mit beiden Abilities ausstellen oder getrennte — ganz wie du möchtest.
Kunden-Tokens
Kundenbezogene Endpunkte sind noch nicht verfügbar. Die Ability woocommerce:customer ist für die künftige Nutzung reserviert.
Endpunkte #
Alle Pfade sind relativ zu /wp-json/wc/v3 (wortgleich der WordPress-REST-Namespace).
GET /wp-json/wc/v3/orders
Bestellungen auflisten.
Autorisierung: Bearer / Basic / Query, mit der Ability woocommerce:admin.
Query-Parameter: siehe Query-Parameter.
Antwort (200): flaches JSON-Array mit Bestellungen. Die Pagination steckt in den Headern, NICHT im Body:
HTTP/1.1 200 OK
X-WP-Total: 150
X-WP-TotalPages: 8
Content-Type: application/json
[
{ /* order */ },
{ /* order */ }
]
Warum Header statt Hülle? Genau das ist die tatsächliche Konvention von WooCommerce — anders als Magentos
{items, search_criteria, total_count}-Wrapper. WC-Client-Bibliotheken (die offiziellen PHP-/JS-Clients von Automattic) lesenX-WP-Total, um ihre Pagination-Cursor zu steuern.
GET /wp-json/wc/v3/orders/{id}
Einzelne Bestellung anhand der numerischen id.
Antwort (200): siehe Antwortstruktur.
Fehler:
{
"code": "woocommerce_rest_shop_order_invalid_id",
"message": "Invalid shop_order ID.",
"data": { "status": 404, "id": 99999 }
}
GET /wp-json/wc/v3/orders/{id}/notes
Listet die Statusverlaufseinträge der Bestellung, aufbereitet als WooCommerce-Notizen.
Antwort (200):
[
{
"id": 42,
"author": "system",
"date_created": "2026-04-10T12:00:00+00:00",
"date_created_gmt": "2026-04-10T12:00:00+00:00",
"note": "Payment received",
"customer_note": false,
"_links": { "self": [...], "collection": [...], "up": [...] }
}
]
customer_note ist immer false, weil Stoar auf Datenebene nicht zwischen kundensichtbaren und rein internen Notizen unterscheidet.
POST /wp-json/wc/v3/orders/{id}/notes
Fügt eine Notiz hinzu (in Stoar auf eine neue OrderStatusLog-Zeile abgebildet).
Anfrage:
{ "note": "Customer phoned to confirm delivery slot" }
customer_note (bool) wird akzeptiert, hat derzeit aber keine Wirkung.
Antwort (201): die neue Notiz in derselben Struktur wie die Einträge von GET .../notes.
Fehler:
400rest_invalid_param—notefehlt404— unbekannte Bestell-id
GET /wp-json/wc/v3/orders/{id}/refunds
Listet die Erstattungen einer Bestellung. Stoar hat keine separate Erstattungstabelle — der Adapter liefert entweder:
[], wennrefunded_amount === 0, oder[{...}]mit einer synthetischen Erstattungszeile, derenid === parent_id === order.idist
[
{
"id": 123,
"parent_id": 123,
"date_created": "2026-04-12T08:00:00+00:00",
"amount": "30.00",
"reason": "",
"refunded_by": 0,
"refunded_payment": true,
"meta_data": [],
"line_items": [],
"api_refund": true
}
]
POST /wp-json/wc/v3/orders/{id}/refunds
Löst eine Erstattung aus. Delegiert an Stoars vorhandenes Order::processRefund(), das Stripe über StripeService::processRefund() aufruft. Bei einer vollständigen Erstattung markiert Stoar die Bestellung als refunded, bei Teilerstattungen wird refunded_amount aufsummiert.
Anfrage:
{ "amount": 30, "reason": "Customer changed mind" }
Beide Felder sind optional. Fehlt amount, erstattet Stoar den gesamten noch erstattungsfähigen Restbetrag.
Antwort (201): die Erstattungszeile in der oben gezeigten Struktur.
Fehler:
404— unbekannte Bestell-id422woocommerce_rest_invalid_state— Bestellung ist nicht erstattungsfähig (kein Stripe Payment Intent, Status nicht paid/processing/shipped/delivered)
GET /wp-json/wc/v3/products
Produkte auflisten.
Query-Parameter: siehe Query-Parameter.
Antwort (200): flaches Array, mit den Headern X-WP-Total / X-WP-TotalPages.
GET /wp-json/wc/v3/products/{id}
Einzelnes Produkt anhand der numerischen id (NICHT über die SKU wie bei Magento).
Antwort (200): siehe Antwortstruktur.
Fehler: 404 woocommerce_rest_product_invalid_id.
Query-Parameter #
WooCommerce nutzt flache Query-String-Parameter — deutlich einfacher als Magentos verschachtelte searchCriteria[…]-Grammatik. Die Übersetzung in dieselben herstellerneutralen Wertobjekte OrderQuery / ProductQuery findet in den Adapter-Klassen Search/OrderQueryParser und Search/ProductQueryParser statt.
Gemeinsame Parameter (Bestellungen + Produkte)
| Parameter | Standard | Zweck |
|---|---|---|
per_page |
10 |
Ergebnisse pro Seite (max. 100) |
page |
1 |
Seitenzahl, 1-basiert |
orderby |
date |
Sortierfeld — siehe die Listen je Ressource weiter unten |
order |
desc |
asc oder desc |
include |
— | Kommagetrennte id-Liste (?include=1,2,3) |
exclude |
— | Kommagetrennte id-Liste zum Ausschließen |
search |
— | Teilstring-Treffer — siehe die Hinweise je Ressource |
Nur Bestellungen
| Parameter | Beispiel | Wirkung |
|---|---|---|
status |
processing,completed |
CSV — in Stoar-Statuswerte übersetzt; innerhalb der Gruppe ODER-verknüpft |
customer |
42 |
Nach customer_id filtern |
after |
2024-01-01T00:00:00 |
created_at >= … |
before |
2024-12-31T23:59:59 |
created_at <= … |
search |
jane |
LIKE auf customer_email |
orderby-Werte |
date (Standard), id, include, title |
date→created_at, title→customer_email |
Nur Produkte
| Parameter | Beispiel | Wirkung |
|---|---|---|
status |
publish, draft |
In Stoars active / inactive übersetzt |
type |
simple, variable |
variable wird zu Stoars configurable |
featured |
true / false |
Filtert auf is_featured |
category |
5 |
Einzelne Kategorie-id |
sku |
WID-1 |
Exakter Treffer |
slug |
widget-pro |
Exakter Treffer |
min_price |
10 |
price >= … |
max_price |
100 |
price <= … |
search |
widget |
LIKE auf den Produkt-name |
orderby-Werte |
date, id, include, title, price, slug |
title→name, slug→slug |
Unbekannte Parameter werden stillschweigend ignoriert (wie bei WC). Filterwerte, die sich in nichts Sinnvolles übersetzen lassen (z. B. ?status=on-hold bei Produkten), ergeben eine leere Gruppe, keinen 400er.
Feld-Mapping (WooCommerce ↔ STOAR) #
Bestellung
| WooCommerce-Feld | STOAR-Quelle | Hinweise |
|---|---|---|
id |
id |
numerisch |
number |
id (in String umgewandelt) |
WC-Konvention |
order_key |
lookup_token |
Stoars Magic-Link-Token je Bestellung |
status |
status (übersetzt) |
siehe Statusübersetzung |
currency |
currency (in Großbuchstaben) |
eur → EUR |
total |
total_amount |
String mit 2 Nachkommastellen |
cart_tax, total_tax |
tax_amount |
String mit 2 Nachkommastellen |
shipping_total |
shipping_amount |
String mit 2 Nachkommastellen |
discount_total |
discount_amount |
String mit 2 Nachkommastellen |
customer_id |
customer_id ?? 0 |
Gäste erhalten 0 |
customer_note |
customer_notes |
|
billing.* |
JSON-Spalte billing_info |
flache WC-Struktur |
shipping.* |
JSON-Spalte shipping_info |
flache WC-Struktur |
payment_method |
erstes nicht archiviertes OrderPayment.gateway |
fällt auf Order.payment_method zurück |
payment_method_title |
aus dem Gateway-Key abgeleitet | stripe → „Credit / Debit Card“ usw. |
transaction_id |
stripe_payment_intent_id |
|
date_created, date_modified |
created_at, updated_at |
ISO8601 |
date_paid |
erstes erfolgreiche OrderPayment.created_at |
null, wenn keine Zahlung erfasst ist |
date_completed |
updated_at, wenn status === delivered |
sonst null |
line_items[] |
Order.items (mit Variante + Produkt) |
siehe unten |
coupon_lines[] |
abgeleitet aus coupon_code + discount_amount |
leer, wenn kein Gutscheincode vorliegt |
refunds[] |
ein synthetischer Eintrag, wenn refunded_amount > 0 |
siehe Erstattungs-Endpunkte |
meta_data[] |
enthält immer _stoar_status und _stoar_lookup_token |
Erweiterungsdaten |
Bestellposition line_item
| WC-Feld | Stoar-Quelle |
|---|---|
id |
OrderItem.id |
name |
OrderItem.name |
product_id |
OrderItem.product_id ?? 0 |
variation_id |
OrderItem.variant_id ?? 0 |
quantity |
OrderItem.quantity |
subtotal, total |
price * quantity (String mit 2 Nachkommastellen) |
subtotal_tax, total_tax |
OrderItem.tax_amount |
sku |
zuerst die Varianten-SKU, ersatzweise die Produkt-SKU |
price |
OrderItem.price |
Produkt
| WC-Feld | STOAR-Quelle | Hinweise |
|---|---|---|
id |
id |
|
name, slug, sku, description, short_description |
direkt übernommen | |
permalink |
url('/product/' . slug) |
|
type |
type (übersetzt) |
configurable ↔ variable |
status |
status (übersetzt) |
active ↔ publish |
featured |
is_featured |
bool |
regular_price |
price (roh) |
String mit 2 Nachkommastellen |
sale_price |
special_price (oder "", wenn null) |
String mit 2 Nachkommastellen |
price |
min(regular, sale) | String mit 2 Nachkommastellen |
on_sale |
special_price !== null && special_price < price |
|
purchasable |
stock > 0 && status === 'active' |
|
manage_stock |
immer true |
|
stock_quantity |
stock; bei configurable die Summe der Variantenbestände |
|
stock_status |
instock / outofstock |
|
weight |
weight (String) |
|
tax_class |
tax_class_id (String) |
|
categories[] |
ein Element aus der category-Relation |
Stoar kennt genau eine Hauptkategorie |
images[] |
image_path + Array gallery_paths |
der erste Eintrag ist das Hauptbild |
variations[] |
Varianten-ids (nur bei variable-Produkten) |
|
meta_data[] |
enthält immer _stoar_id, _stoar_low_stock_threshold, _stoar_image_prompt |
|
attributes[], default_attributes[] |
[] |
Stoar hat kein globales Attributsystem |
tags[], related_ids[], upsell_ids[], cross_sell_ids[] |
[] |
in Stoar nicht modelliert |
dimensions |
leer | wird nicht erfasst |
average_rating, rating_count |
"0.00", 0 |
auf dieser Ebene nicht aggregiert |
Statusübersetzung #
WooCommerce und Stoar verwenden unterschiedliche Statusvokabulare. Der Adapter übersetzt bidirektional: beim Filtern (?status=processing) werden WC-Werte auf Stoar abgebildet, beim Serialisieren der Antworten wird Stoars status zurück auf WC abgebildet.
Bestellstatus
| WooCommerce | Stoar | Hinweise |
|---|---|---|
pending |
pending |
unbezahlt, wartet auf Zahlung |
processing |
paid (gerendert) / akzeptiert paid (Filter) |
„Zahlung eingezogen, Fulfillment läuft“ |
processing |
processing, shipped (gerendert) |
Stoars processing und shipped werden beide als WC-processing gerendert |
completed |
delivered |
|
cancelled |
cancelled |
|
refunded |
refunded |
|
on-hold |
pending (nur Filter) |
Stoar hat keinen expliziten On-hold-Status |
failed |
cancelled (nur Filter) |
beste Näherung; Stoar hat keinen expliziten Failed-Status |
Produktstatus
| WooCommerce | Stoar |
|---|---|
publish |
active |
draft, pending, private |
inactive |
Produkttyp
| WooCommerce | Stoar |
|---|---|
simple |
simple |
variable |
configurable |
grouped, external |
(nicht unterstützt — in Stoar nicht vorhanden) |
Filterwerte, die auf null abbilden (z. B. ?status=trash bei Produkten), werden stillschweigend ignoriert — sie erzeugen keinen Fehler.
Antwortstruktur #
Bestellung — kommentiertes Beispiel
{
"id": 456,
"parent_id": 0,
"number": "456",
"order_key": "abc123…",
"created_via": "checkout",
"version": "8.5.0",
"status": "processing",
"currency": "EUR",
"date_created": "2026-04-10T09:00:00+00:00",
"date_modified": "2026-04-10T09:30:00+00:00",
"discount_total": "0.00",
"discount_tax": "0.00",
"shipping_total": "5.00",
"shipping_tax": "0.00",
"cart_tax": "10.00",
"total": "115.00",
"total_tax": "10.00",
"prices_include_tax": false,
"customer_id": 45,
"customer_note": "",
"billing": { /* WC address shape (flat) */ },
"shipping": { /* WC address shape (flat) */ },
"payment_method": "stripe",
"payment_method_title": "Credit / Debit Card",
"transaction_id": "pi_test_…",
"date_paid": "2026-04-10T09:05:00+00:00",
"date_completed": null,
"cart_hash": "",
"meta_data": [
{ "id": 0, "key": "_stoar_status", "value": "paid" },
{ "id": 0, "key": "_stoar_lookup_token", "value": "abc123…" }
],
"line_items": [
{
"id": 456,
"name": "Widget",
"product_id": 789,
"variation_id": 12,
"quantity": 2,
"tax_class": "",
"subtotal": "100.00",
"subtotal_tax": "10.00",
"total": "100.00",
"total_tax": "10.00",
"taxes": [],
"meta_data": [],
"sku": "WID-1-A",
"price": 50
}
],
"tax_lines": [],
"shipping_lines": [
{
"id": 0,
"method_title": "Standard",
"method_id": "flat_rate",
"instance_id": "",
"total": "5.00",
"total_tax": "0.00",
"taxes": [],
"meta_data": []
}
],
"fee_lines": [],
"coupon_lines": [],
"refunds": [],
"_links": {
"self": [{ "href": "https://app.stoar.ai/wp-json/wc/v3/orders/456" }],
"collection": [{ "href": "https://app.stoar.ai/wp-json/wc/v3/orders" }]
}
}
Produkt — gekürztes Beispiel
{
"id": 789,
"name": "Widget",
"slug": "widget",
"permalink": "https://app.stoar.ai/product/widget",
"type": "simple",
"status": "publish",
"featured": true,
"catalog_visibility": "visible",
"description": "<p>A great widget</p>",
"short_description": "Great widget",
"sku": "WID-1",
"price": "79.99",
"regular_price": "99.99",
"sale_price": "79.99",
"on_sale": true,
"purchasable": true,
"manage_stock": true,
"stock_quantity": 42,
"stock_status": "instock",
"weight": "1.5",
"categories": [{ "id": 5, "name": "Widgets", "slug": "widgets" }],
"images": [
{ "id": 0, "src": "products/widget.webp", "name": "primary", "position": 0, "alt": "" },
{ "id": 0, "src": "products/g1.webp", "name": "gallery-1", "position": 1, "alt": "" }
],
"attributes": [],
"variations": [],
"meta_data": [
{ "id": 0, "key": "_stoar_id", "value": "789" },
{ "id": 0, "key": "_stoar_low_stock_threshold", "value": "3" }
],
"_links": {
"self": [{ "href": "https://app.stoar.ai/wp-json/wc/v3/products/789" }],
"collection": [{ "href": "https://app.stoar.ai/wp-json/wc/v3/products" }]
}
}
Bei einem konfigurierbaren bzw. variablen Produkt ist variations mit Varianten-ids gefüllt, und stock_quantity ist die Summe der Variantenbestände.
Praxisbeispiel #
Live-Antwort aus der Produktion für GET /wp-json/wc/v3/orders/10126 (USD 936,98, zwei Positionen mit einfachen Produkten, bezahlt per PayID). Personenbezogene Daten anonymisiert.
Anfrage
GET /wp-json/wc/v3/orders/10126
Authorization: Bearer 2|L5pXj63e881lkgtHPK7Hjozyq7Pb3trHCy0iaDRf76405f72
Antwort
{
"id": 10126,
"parent_id": 0,
"number": "10126",
"order_key": "REDACTED-FOR-DOCS",
"created_via": "checkout",
"version": "8.5.0",
"status": "processing",
"currency": "USD",
"date_created": "2025-06-03T04:56:43+00:00",
"date_modified": "2025-06-03T04:56:43+00:00",
"discount_total": "0.00",
"discount_tax": "0.00",
"shipping_total": "0.00",
"shipping_tax": "0.00",
"cart_tax": "0.00",
"total": "936.98",
"total_tax": "0.00",
"prices_include_tax": false,
"customer_id": 5794,
"customer_note": "",
"billing": {
"first_name": "Jane",
"last_name": "Doe",
"company": "",
"address_1": "1 Example Street",
"address_2": "",
"city": "Phoenix",
"state": "AZ",
"postcode": "85001",
"country": "US",
"email": "",
"phone": "+1-555-0100"
},
"shipping": { /* same shape as billing */ },
"payment_method": "payid",
"payment_method_title": "PayID",
"transaction_id": "",
"date_paid": null,
"date_completed": null,
"cart_hash": "",
"meta_data": [
{ "id": 0, "key": "_stoar_status", "value": "paid" },
{ "id": 0, "key": "_stoar_lookup_token", "value": "REDACTED-FOR-DOCS" }
],
"line_items": [
{
"id": 30219,
"name": "Reloop Terminal Mix 8",
"product_id": 112238,
"variation_id": 95589,
"quantity": 3,
"tax_class": "",
"subtotal": "897.00",
"subtotal_tax": "0.00",
"total": "897.00",
"total_tax": "0.00",
"taxes": [],
"meta_data": [],
"sku": "RELOOP_TERMINALMIX8_025-DEF",
"price": 299
},
{
"id": 30220,
"name": "Premium Skateboard Socks",
"product_id": 51706,
"variation_id": 33857,
"quantity": 2,
"tax_class": "",
"subtotal": "39.98",
"subtotal_tax": "0.00",
"total": "39.98",
"total_tax": "0.00",
"taxes": [],
"meta_data": [],
"sku": "SK8-SOCK-027-DEF",
"price": 19.99
}
],
"tax_lines": [],
"shipping_lines": [
{
"id": 0,
"method_title": "Free Shipping",
"method_id": "flat_rate",
"instance_id": "",
"total": "0.00",
"total_tax": "0.00",
"taxes": [],
"meta_data": []
}
],
"fee_lines": [],
"coupon_lines": [],
"refunds": [],
"_links": {
"self": [{ "href": "https://app.stoar.ai/wp-json/wc/v3/orders/10126" }],
"collection": [{ "href": "https://app.stoar.ai/wp-json/wc/v3/orders" }]
}
}
Fallstricke, die Integratoren kennen sollten
Sie überschneiden sich mit denen von Magento — die zugrunde liegenden Stoar-Daten sind dieselben, nur in einer anderen Hülle gerendert:
| Feld | Beobachtet | Grund |
|---|---|---|
transaction_id, date_paid |
"" / null bei bezahlten Bestellungen |
Stammen aus Stoars OrderPayment-Audit-Log; Altbestellungen vor Einführung des Logs erscheinen leer |
payment_method |
"payid" |
Das ist der STOAR-Gateway-Key (stripe / bank_transfer / cash_on_delivery / payid / invoice) — kein WC-kanonischer Methodenname |
payment_method_title |
aus dem Gateway-Key abgeleitet | fest hinterlegtes Mapping — zum Erweitern OrderResource::paymentMethodTitle() anpassen |
version |
immer "8.5.0" |
fest hinterlegt — nicht die tatsächlich laufende WC-Version |
created_via |
immer "checkout" |
Stoar hat noch keinen Anlageweg über die API |
customer_ip_address, customer_user_agent |
immer "" |
nicht an der Bestellung gespeichert |
cart_hash |
immer "" |
nicht gespeichert |
tax_lines |
immer [] |
Stoar erfasst Steuern nur auf Bestellebene, nicht je Steuergebiet |
attributes, default_attributes (Produkte) |
immer [] |
Stoar hat keine globale Attributtaxonomie |
meta_data._stoar_lookup_token |
Magic-Link-Token je Bestellung | Dieselbe Sicherheitswarnung wie bei Magento — der bloße Besitz genügt, um die Bestellung ohne Authentifizierung einzusehen. Gib ihn niemals an clientseitigen Code oder in Logs weiter. |
Fehlerstruktur #
WooCommerce-Fehler sehen so aus:
{
"code": "machine_readable_code",
"message": "Human-readable message",
"data": { "status": 404, "id": 99999 }
}
… also NICHT wie Magentos {message, parameters, trace}.
| HTTP | Auslöser | code |
|---|---|---|
| 400 | fehlerhafter Query-Parameter / fehlender Pflichtinhalt im Body | rest_invalid_param |
| 401 | fehlendes oder ungültiges Token | woocommerce_rest_cannot_view |
| 403 | Token mit falscher Ability (z. B. Token nur mit magento:admin oder Kunden-Token) |
woocommerce_rest_authorization_required |
| 404 | unbekannte Ressourcen-id | woocommerce_rest_shop_order_invalid_id / woocommerce_rest_product_invalid_id |
| 422 | Vorbedingung nicht erfüllt (Erstattung einer nicht erstattungsfähigen Bestellung, …) | woocommerce_rest_invalid_state |
| 429 | Rate-Limit überschritten | woocommerce_rest_too_many_requests |
| 500 | unerwarteter Serverfehler | woocommerce_rest_internal_error |
data.status spiegelt stets den HTTP-Code. Ressourcenspezifische Schlüssel (data.id) kommen hinzu, wo sie sinnvoll sind.
Rate-Limiting #
Dieselbe per Sanctum-Token gekennzeichnete Drosselung, die Magento schützt (api-rest, standardmäßig 60 Anfragen/Minute), schützt auch die WC-Routen. Beides konfigurierst du global unter /manager/api-settings. Beim Auslösen nutzt die Antwort die WC-Fehlerhülle:
{
"code": "woocommerce_rest_too_many_requests",
"message": "Too many requests. Please retry after a short pause.",
"data": { "status": 429 }
}
Die Oberfläche zur Konfiguration ist im Abschnitt Rate-Limiting der Magento-Dokumentation Schritt für Schritt beschrieben.
Siehe auch #
app/Api/Core/OrderRepository.php,app/Api/Core/ProductRepository.php— die Abstraktionsgrenze, auf die sich jeder Adapter stütztapp/Api/Adapters/WooCommerce/Support/StatusTranslator.php— bidirektionales Vokabular-Mapping- WooCommerce-REST-API-Referenz — die Upstream-Spezifikation, die dieser Adapter nachbildet