Abrechnungs- und Zahlungs-APIs sauber anbinden

Andreas Kunisch, , 5 Min. Lesezeit

Wer eine Abrechnungs- oder Zahlungs-API in eine PHP-Anwendung integriert, verbindet zwei Systeme, die unabhängig voneinander ausfallen, sich verzögern oder doppelt antworten können. Das Ziel ist eine Integration, die auch bei Netzwerkproblemen, Timeouts und doppelten Zustellungen korrekte Buchungen garantiert. Wie schnell sie gebaut ist, zählt dabei weniger.

Dieser Ratgeber fasst die technischen Bausteine zusammen, auf die es bei der Anbindung externer Abrechnungs-APIs ankommt, unabhängig davon, welcher Anbieter konkret eingesetzt wird. Die Reihenfolge entspricht dem, was in der Praxis zuerst geklärt werden sollte.

Was bedeutet Idempotenz bei Zahlungs-APIs und warum ist sie unverzichtbar?

Idempotenz bedeutet, dass eine Anfrage mit demselben Idempotenz-Schlüssel beliebig oft wiederholt werden kann, ohne dass sie mehrfach wirkt. Bei einer Zahlung verhindert das doppelte Abbuchungen, wenn eine Antwort verloren geht oder ein automatischer Retry ausgelöst wird.

In der Praxis erzeugt die Anwendung pro Geschäftsvorgang einen eindeutigen Schlüssel, meist eine UUID, und sendet ihn bei jedem Versuch mit. Der Zahlungsanbieter erkennt die wiederholte Anfrage am Schlüssel und liefert das ursprüngliche Ergebnis zurück, statt die Aktion erneut auszuführen.

Ohne diesen Mechanismus wird aus jedem automatischen Retry ein Risiko für eine zweite Buchung. Idempotenz ist deshalb die Grundvoraussetzung, bevor überhaupt über Wiederholungen nachgedacht wird.

Wie gehören Timeouts und Wiederholungen mit Backoff zusammen?

Timeouts und Backoff gehören zusammen, weil eine Anfrage ohne klares Zeitlimit die Anwendung blockiert und ein sofortiger erneuter Versuch die Gegenseite zusätzlich belastet. Jede Anfrage an eine externe API braucht ein explizites Timeout, das kürzer ist als das Zeitlimit des aufrufenden Kontexts.

Nach einem Fehler oder Timeout sollte nicht sofort erneut gesendet werden. Ein exponentielles Backoff mit zufälligem Zuschlag verteilt mehrere gleichzeitige Fehler über die Zeit und vermeidet synchronisierte Lastspitzen beim Anbieter.

Typische Wartezeiten zwischen den Versuchen:

  1. Eine Sekunde nach dem ersten Fehlschlag.
  2. Zwei Sekunden nach dem zweiten Fehlschlag.
  3. Vier bis acht Sekunden nach dem dritten Fehlschlag, danach Abbruch und manuelle Prüfung.

Worauf kommt es bei der Verifizierung von Webhooks an?

Ein Webhook muss anhand seiner Signatur geprüft werden, bevor die Anwendung ihm vertraut. Die meisten Anbieter signieren den übertragenen Inhalt mit einem gemeinsamen Geheimnis; die Anwendung berechnet die Signatur selbst und vergleicht sie zeitkonstant mit der übermittelten.

Dazu gehört eine Prüfung auf Wiederholung: Jeder Webhook sollte eine eindeutige Event-ID tragen, die protokolliert wird, damit dieselbe Nachricht nicht zweimal verarbeitet wird. Ohne Verifizierung kann jeder, der die URL kennt, gefälschte Zahlungsereignisse einspielen.

Die Antwort auf den Webhook sollte innerhalb weniger Sekunden erfolgen. Die eigentliche Verarbeitung passiert danach, getrennt von der Zustellung.

Warum sollte die Verarbeitung asynchron über Queues laufen?

Weil ein Webhook-Endpunkt innerhalb weniger Sekunden antworten muss, sonst wertet der Anbieter die Zustellung als fehlgeschlagen und wiederholt sie. Die eigentliche Verarbeitung, etwa Datenbank aktualisieren, Benachrichtigungen versenden oder Folgeaktionen auslösen, gehört in einen Queue-Job.

Der Webhook-Handler validiert die Signatur, speichert das Event und reiht den Job in die Queue ein; die Antwort geht sofort zurück. Schlägt die Verarbeitung fehl, übernimmt die Queue mit eigenen Wiederholungs- und Backoff-Mechanismen, ohne den Anbieter erneut zu belasten.

Welche Rolle spielen Protokollierung und Nachvollziehbarkeit?

Jede Anfrage an eine Abrechnungs-API und jede eingehende Antwort oder jeder Webhook sollten protokolliert werden, inklusive Idempotenz-Schlüssel, Statuscode und der relevanten Nutzlast ohne sensible Felder wie vollständige Kartennummern. Nur so lässt sich im Streitfall rekonstruieren, was wann passiert ist.

Für Support und Buchhaltung ist entscheidend, eine interne Transaktion mit der ID des Zahlungsanbieters zu verknüpfen. Ohne diese Zuordnung dauert die Klärung eines einzelnen strittigen Falls häufig länger als die gesamte technische Integration.

Wie testet man Abrechnungs-APIs, ohne reale Zahlungen auszulösen?

Über die Sandbox- oder Testumgebung des jeweiligen Anbieters, die reale Endpunkte simuliert, ohne echtes Geld zu bewegen. Dort lassen sich typische Fehlerfälle gezielt auslösen: abgelehnte Zahlung, abgelaufene Karte, Timeout oder doppelte Anfrage.

Automatisierte Tests sollten diese Fehlerfälle ebenso abdecken wie den Erfolgsfall. Ein Mock der eigenen Abstraktionsschicht erleichtert das, weil er ohne Netzwerkzugriff läuft; vor dem Wechsel in den Live-Betrieb lohnt sich zusätzlich ein Testlauf mit einem echten, minimalen Betrag, sofern der Anbieter das vorsieht.

Wie geht man mit Fehlerfällen, Abgleich und Monitoring um?

Fehlerfälle gehören in einen klaren, eindeutigen Zustand: offen, fehlgeschlagen, erfolgreich oder zurückerstattet, nie unbekannt. Ein regelmäßiger Abgleich zwischen den eigenen Datensätzen und den Berichten des Zahlungsanbieters deckt Abweichungen auf, etwa Zahlungen, die beim Anbieter erfolgreich waren, in der eigenen Datenbank aber fehlen.

Monitoring sollte Fehlerquote, Latenz und die Länge der Warteschlange der Queue-Jobs im Blick behalten und bei Auffälligkeiten aktiv benachrichtigen. Niemand sollte zufällig im Log darüber stolpern müssen. Ein Alarm, wenn die Fehlerquote eines Zahlungsanbieters plötzlich steigt, ist wichtiger als ein Dashboard, das niemand ansieht.

Warum lohnt sich eine eigene Schnittstelle vor dem Zahlungsanbieter?

Weil der eigene Code dann gegen eine selbst definierte Schnittstelle programmiert, etwa ein PHP-Interface mit Methoden wie charge, refund und getStatus. Das SDK eines Anbieters ruft er nicht direkt auf. Der konkrete Anbieter steckt danach in einer austauschbaren Implementierung dahinter.

Bei einer Reise-Buchungsplattform, die ich über mehrere Jahre mitbetreut habe, gehörte die Anbindung neuer Abrechnungs-APIs zu meinen Aufgaben. Das passierte im laufenden Betrieb, in kleinen, einzeln testbaren Schritten und mit der Möglichkeit, bei Problemen zurückzurollen.

Diese Kapselung schützt zudem vor einer zu engen Bindung an einen Anbieter. Ändern sich Preisstruktur oder Konditionen, lässt sich eine zweite Implementierung ergänzen, ohne den Rest der Anwendung zu berühren.

Häufige Fragen

Reicht es, Zahlungsanfragen bei einem Fehler einfach erneut zu senden?
Nein, nicht ohne Idempotenz-Schlüssel. Ohne ihn kann ein erneuter Versuch zu einer zweiten, echten Buchung führen, wenn die erste Anfrage beim Anbieter tatsächlich angekommen ist und nur die Antwort verloren ging.
Wie oft sollte eine fehlgeschlagene Anfrage wiederholt werden?
In der Regel reichen drei bis fünf Versuche mit steigenden Wartezeiten, etwa eine, zwei, vier und acht Sekunden mit einem zufälligen Zuschlag. Danach sollte der Vorgang in einen Fehlerzustand wechseln, der manuell oder über einen Abgleich geprüft wird. Endlos weiterzuversuchen bringt nichts.
Was passiert, wenn ein Webhook mehrfach zugestellt wird?
Das ist normal, da Anbieter bei ausbleibender oder verzögerter Antwort erneut zustellen. Die Anwendung erkennt das Duplikat an der Event-ID und verarbeitet es nur einmal, weitere Zustellungen werden lediglich protokolliert.
Braucht jede Anwendung eine eigene Abstraktionsschicht für Zahlungsanbieter?
Bei einer einfachen, einmaligen Integration ist der Aufwand oft nicht gerechtfertigt. Sobald mehrere Zahlarten im Einsatz sind, ein Anbieterwechsel absehbar ist oder eine eigene Testsuite gewünscht wird, zahlt sich eine eigene Schnittstelle schnell aus.
Wie lässt sich ein Abgleich zwischen eigener Datenbank und Zahlungsanbieter praktisch umsetzen?
Über einen geplanten Job, der periodisch die Berichte oder die Liste der Transaktionen des Anbieters mit den eigenen Datensätzen vergleicht. Abweichungen, etwa fehlende, doppelte oder im Status unterschiedliche Datensätze, werden markiert und zur manuellen Prüfung in eine Warteschlange gestellt.

Weitere Ratgeber