Integrationen

Zustandsübergänge einer Bestellung — und was 6.7 daran ändert

Drei Aktionsnamen für Zahlungszustände sind in 6.7 verschwunden. Wer sie benutzt, bekommt keinen Fehler beim Update, sondern beim nächsten Zahlungseingang.

Pixup MediaVeröffentlicht am 9 Min. Lesezeit

Eine Shopware-Bestellung hat nicht einen Zustand, sondern fünf. Und einer davon hat sich in 6.7 verändert — auf eine Art, die kein Update-Log meldet.

Die fünf Automaten

AutomatZuständeÜbergänge (6.7)
order.state46
order_delivery.state616
order_transaction.state1262
order_transaction_capture.state34
order_transaction_capture_refund.state510
Summe3098

Die Zustände sind in 6.6.10.6 und 6.7.13.1 identisch: fünf Automaten, 30 Zustände. Die Übergänge nicht — 103 in 6.6, 98 in 6.7.

Alle fünf Änderungen stecken im Zahlungsautomaten.

Was genau passiert ist

Ein Übergang hat einen Aktionsnamen. Über diesen Namen wird er ausgelöst — über die API, aus einem Plugin, aus einer Flow-Aktion.

Aktionsname6.6.10.66.7.13.1
authorize44
cancel99
chargeback22
do_pay4— entfallen
fail55
paid79
paid_partially67
pay4— entfallen
pay_partially4— entfallen
process— nicht vorhanden4
process_unconfirmed55
refund44
refund_partially33
remind22
reopen88

Drei Namen sind weg, einer ist neu:

  • do_payprocess. Eine reine Umbenennung, die vier Übergänge ziehen mit.
  • pay → geht in paid auf. paid wächst von 7 auf 9 Übergänge; zwei Ziele gab es unter diesem Namen schon.
  • pay_partially → geht in paid_partially auf. Von 6 auf 7.

Unter dem Strich: 12 Übergänge entfernt, 7 hinzugefügt, netto fünf weniger.

Warum das gefährlich ist

Das Update meldet nichts. Die Migration läuft durch, der Shop startet, alle Seiten laden. Die Tabelle ist einfach anders befüllt.

Der Fehler entsteht erst, wenn etwas einen Übergang mit einem entfallenen Namen auslösen will. Und das passiert nicht beim Testen der Startseite, sondern beim ersten echten Zahlungseingang.

Typische Stellen, an denen so ein Aufruf steckt:

  1. Ein Zahlungsanbieter-Plugin, das nach einer erfolgreichen Zahlung den Zustand setzt.
  2. Eine Warenwirtschaft, die Zahlungseingänge zurückmeldet.
  3. Ein eigenes Skript für den Bankabgleich.
  4. Eine Flow-Aktion, die einen Zahlungszustand setzt — was der Flow Builder dabei kann und wo seine Grenzen liegen, steht in Flow Builder: Auslöser, Aktionen und Grenzen.

Die Prüfung, die fünf Minuten dauert

Vor dem Sprung auf 6.7 den eigenen Code und die Konfiguration nach drei Zeichenketten durchsuchen:

do_pay
pay_partially
"pay"

Beim dritten ist Vorsicht nötig: pay ist ein kurzes Wort und kommt in paid, payment und payable vor. Sinnvoll ist die Suche nach dem vollständigen Aufruf, etwa transaction.state/pay oder actionName: 'pay'.

Findet sich nichts, ist die Sache erledigt. Findet sich etwas, ist es eine Änderung von zwei Zeichen — solange sie vor dem Update passiert.

Der Zusammenhang mit der primären Transaktion

Beide Befunde betreffen dieselbe Stelle: wie eine Integration an die richtige Zahlungstransaktion kommt und was sie damit tun darf. Dass 6.7 einen expliziten Verweis auf die maßgebliche Transaktion einführt, ihn aber noch nicht füllt, steht in Die primäre Transaktion einer Bestellung.

Zusammen ergibt das eine kleine Prüfliste für jede Bestellintegration vor 6.7:

PrüfungFundstelle
Aktionsnamen do_pay, pay, pay_partiallydieser Text
Zugriff auf „die letzte Transaktion"primäre Transaktion
Vollständiges Zurückschreiben gelesener Datensätzeschreibgeschützte Felder
Schreiben auf customer.default_payment_method_idSchema-Delta

Grenzen dieser Messung

Verglichen wurden die Zustandstabellen zweier frisch aufgesetzter Installationen. Nicht gemessen wurde, wie sich ein echtes Update auf einen Bestand auswirkt — insbesondere, ob eine Migration bestehende Verweise auf die alten Aktionsnamen irgendwo mitzieht.

Nicht gemessen wurde außerdem das Verhalten zur Laufzeit: Wir haben die Tabellen gelesen, nicht versucht, einen Übergang mit einem entfallenen Namen auszulösen. Dass ein solcher Aufruf scheitert, folgt aus dem Datenmodell, nicht aus einem Testlauf.

Wenn eine Integration daran angepasst werden muss, gehört das zu App- und Plugin-Entwicklung.

Häufige Fragen

Wie viele Zustandsautomaten hat eine Bestellung?
Fünf: die Bestellung selbst, die Lieferung, die Zahlungstransaktion sowie Einzug und Erstattung. Zusammen 30 Zustände — in 6.6 und 6.7 identisch.
Welche Aktionsnamen sind in 6.7 entfallen?
do_pay, pay und pay_partially. An die Stelle von do_pay tritt process; pay und pay_partially gehen in den bereits vorhandenen Namen paid und paid_partially auf.
Merke ich das beim Update?
Nein. Das Update läuft durch. Der Fehler entsteht erst, wenn etwas versucht, einen Übergang mit einem entfallenen Namen auszulösen — also beim nächsten Zahlungsvorgang.
Wo kann so ein Aufruf stecken?
In einem Zahlungsanbieter-Plugin, in einer ERP-Anbindung, die Zahlungen zurückmeldet, in einem eigenen Skript oder in einer Flow-Aktion, die einen Zustand setzt.
WeiterführendApp- und Plugin-Entwicklung