Kartenzahlungen einziehen
Bereiten Sie Ihre Anwendung und Ihr Backend auf das Einziehen von Kartenzahlungen mit Stripe Terminal vor.
Für die Lesegeräte BBPOS WisePOS E und Stripe Reader S700 empfehlen wir eine serverseitige Integration, da sie die Stripe API anstelle eines Terminal-SDK verwendet, um Zahlungen einzuziehen.
Zum Einziehen von Zahlungen mit Stripe Terminal müssen Sie einen Zahlungsablauf in Ihrer Anwendung programmieren. Verwenden Sie das Stripe Terminal SDK, um einen PaymentIntent zu erstellen und zu aktualisieren. Bei einem PaymentIntent handelt es sich um ein Objekt, das eine einzelne Zahlungssitzung darstellt.
Während die Kernkonzepte SDK-basierten Integrationen ähneln, sehen die Schritte bei der servergesteuerten Integration etwas anders aus:
- PaymentIntent erstellen Sie können definieren, ob Ihre Zahlungen automatisch oder manuell erfasst werden sollen.
- Zahlung verarbeiten Die Autorisierung der Kundenkarte erfolgt, wenn das Lesegerät die Zahlung verarbeitet.
- (Optional) PaymentIntent erfassen.
Notiz
Diese Integrationsform unterstützt keine Offline-Kartenzahlungen.
PaymentIntent erstellen
Der erste Schritt beim Einziehen von Zahlungen ist das Starten des Zahlungsablaufs. Wenn Kundinnen/Kunden den Bestellvorgang abschließen, muss Ihr Backend ein PaymentIntent-Objekt erstellen. Dieses Objekt stellt eine neue Zahlungssitzung bei Stripe dar. Bei der servergestützten Integration erstellen Sie den PaymentIntent serverseitig.
In einer Sandbox können Sie Testbeträge verwenden, um verschiedene Fehlerszenarien zu simulieren. Im Live-Modus wird der Betrag des PaymentIntent zum Bezahlen auf dem Lesegerät angezeigt.
Für Terminal-Zahlungen muss der Parameter payment_
card_
enthalten.
Um Interac-Zahlungen in Kanada anzunehmen, müssen Sie außerdem interac_
zu Ihren payment_
hinzufügen. Hier erfahren Sie mehr zum Thema regionale Aspekte für Kanada.
Um in unterstützten Ländern kartenlose Zahlungsmethoden zu akzeptieren, müssen Sie auch Ihre bevorzugten Arten in payment_
angeben. Erfahren Sie mehr über zusätzliche Zahlungsmethoden.
Sie können den Zahlungsablauf wie folgt steuern:
- Um den Zahlungsablauf für
card_
-Zahlungen vollständig zu steuern, setzen Sie diepresent capture_
aufmethod manual
. Dadurch können Sie vor der endgültigen Finalisierung der Zahlung einen Abgleichschritt hinzufügen. - Um Zahlungen in einem Schritt zu autorisieren und zu erfassen, setzen Sie
capture_
aufmethod automatic
.
Zahlung abwickeln
Sie können eine Zahlung sofort mit der von einer Kundin/einem Kunden vorgelegten Karte abwickeln oder stattdessen die Kartenangaben überprüfen, bevor Sie mit der Zahlungsabwicklung fortfahren. Für die meisten Anwendungsszenarien empfehlen wir eine sofortige Verarbeitung, da es sich um eine einfachere Integration mit weniger API-Aufrufen und Webhook-Ereignissen handelt. Wenn Sie jedoch Ihre eigene Geschäftslogik hinzufügen möchten, bevor die Karte autorisiert wird, können Sie die Erfassung und Bestätigung in zwei Schritten verwenden.
Wenn Sie ein simuliertes Lesegerät nutzen, verwenden Sie den Endpoint present_payment_method, um zu simulieren, dass Karteninhaber/innen ihre Karte auf das Lesegerät auflegen oder in diesen einführen. Verwenden Sie Testkarten, um verschiedene Erfolgs- oder Fehlerszenarien zu simulieren.
Erfassen Sie die Zahlung
Wenn Sie bei der Erstellung des PaymentIntent in Schritt 1 capture_
als manual
definiert haben, gibt das SDK einen autorisierten, aber nicht erfassten PaymentIntent an Ihre Anwendung zurück. Erfahren Sie mehr über den Unterschied zwischen Autorisierung und Erfassung. Wenn Ihre Anwendung einen bestätigten PaymentIntent erhält, sollten Sie sicherstellen, dass diese ihr Backend benachrichtigt, um den PaymentIntent zu erfassen. Erstellen Sie dazu einen Endpoint in Ihrem Backend, der eine PaymentIntent-ID akzeptiert und zwecks Erfassung eine Anfrage an die Stripe-API sendet.
War der Aufruf zur Erfassung erfolgreich, ist der Status eines PaymentIntent succeeded
.
Achtung
Sie müssen PaymentIntents
innerhalb von zwei Tagen manuell erfassen. Andernfalls läuft die Autorisierung ab und die Gelder werden für den/die Kund/in freigegeben.
Status des Lesegeräts verifizieren
Um sicherzustellen, dass das Lesegerät eine Aktion abgeschlossen hat, muss Ihre Anwendung den Status des Geräts überprüfen, bevor Sie eine neue Lesegeräte-Aktion veranlassen oder mit der Erfassung fortfahren können. In den meisten Fällen können Sie mit dieser Verifizierung eine erfolgreiche (genehmigte) Zahlung bestätigen und Ihrem Betreiber jede relevante Nutzererfahrung anzeigen, damit er die Transaktion abschließen kann. In anderen Fällen müssen Sie möglicherweise Fehler beheben, wie zum Beispiel abgelehnte Zahlungen.
Verwenden Sie eine der folgenden Methoden, um den Status des Lesegeräts zu überprüfen:
Webhooks überwachen Empfohlen
Für maximale Ausfallsicherheit empfehlen wir, dass Ihre Anwendung Webhooks von Stripe überwacht, um in Echtzeit Benachrichtigungen über den Status des Lesegeräts zu erhalten. Stripe sendet drei Webhooks, um Ihre Anwendung über den Aktionsstatus eines Lesegeräts zu informieren:
Status | Beschreibung |
---|---|
terminal. | Wird gesendet, wenn eine Lesegerät-Aktion erfolgreich war, zum Beispiel wenn eine Zahlung erfolgreich autorisiert wurde. |
terminal. | Wird gesendet, wenn eine Aktion eines Lesegerätes fehlschlägt, zum Beispiel wenn eine Karte aufgrund unzureichender Deckung abgelehnt wird. |
terminal. Vorschau | Wird gesendet, wenn eine Aktion eines Lesegerätes aktualisiert wird, zum Beispiel wenn eine Zahlungsmethode eingezogen wird (wird nur für die Aktion collect_ ausgelöst). |
Um diese Webhooks zu überwachen, erstellen Sie einen Webhook-Endpoint. Wir empfehlen, einen speziellen Webhook-Endpoint nur für diese Ereignisse einzurichten, da sie hohe Priorität haben und sich im kritischen Zahlungspfad befinden.
Die Stripe-API abfragen
Bei Problemen mit der Webhook-Zustellung können Sie die Stripe-API abfragen, indem Sie Ihrer Point-of-Sale-Schnittstelle die Schaltfläche check status
hinzufügen, die der Bediener bei Bedarf aufrufen kann.
PaymentIntent verwenden
Sie können den PaymentIntent abrufen, den Sie zur Verarbeitung an das Lesegerät übergeben haben. Wenn Sie einen PaymentIntent erstellen, befindet dieser sich zunächst im Status requires_
. Nachdem Sie die Zahlungsmethode erfolgreich erfasst haben, wird der Status auf requires_
aktualisiert. Nachdem die Zahlung erfolgreich verarbeitet wurde, wird der Status auf requires_
aktualisiert.
Das Lesegerät-Objekt verwenden
Sie können das Lesegeräte-Objekt verwenden, das ein Aktions-Attribut enthält, das die letzte vom Lesegerät empfangene Aktion und ihren Status anzeigt. Ihre Anwendung kann ein Lesegerät abrufen, um zu prüfen, ob sich der Status der Lesegerät-Aktion geändert hat.
Das Reader-Objekt wird ebenfalls als Antwort auf den Zahlungsvorgangsschritt zurückgegeben. Der action
-Typ beim Verarbeiten einer Zahlung ist process_
.
Der action.
wird bei erfolgreicher Zahlung auf succeeded
aktualisiert. Das bedeutet, Sie können mit dem Abschluss der Transaktion fortfahren. Andere mögliche Werte für action.
sind failed
oder in_
.
Umgang mit Fehlern
Die folgenden Fehler sind die häufigsten Typen, die Ihre Anwendung verarbeiten muss:
- Doppelte Abbuchungen vermeiden
- Fehlgeschlagene Zahlungen
- Zeitüberschreitung der Zahlung
- Stornierung der Zahlung
- Lesegerät bereits in Nutzung
- Zeitüberschreitung des Lesegeräts
- Lesegerät offline
- Fehlende Webhooks
- Verzögerte Webhooks
Doppelte Abbuchungen vermeiden
Das PaymentIntent-Objekt ermöglicht Geldbewegungen bei Stripe – verwenden Sie einen einzigen PaymentIntent, um eine Transaktion darzustellen.
Verwenden Sie denselben PaymentIntent, nachdem eine Karte abgelehnt wurde (z. B. wenn sie nicht ausreichend gedeckt ist), damit Ihre Kundin/Ihr Kunde es mit einer anderen Karte erneut versuchen kann.
Wenn Sie den PaymentIntent bearbeiten, müssen Sie process_payment_intent aufrufen, um die Zahlungsinformationen auf dem Lesegerät zu aktualisieren.
Ein PaymentIntent muss sich im Status requires_
befinden, bevor Stripe ihn verarbeiten kann. Ein autorisierter, erfasster oder stornierter PaymentIntent kann nicht von einem Lesegerät verarbeitet werden und resultiert im Fehler intent_
:
{ "error": { "code": "intent_invalid_state", "doc_url": "https://docs.stripe.com/error-codes#intent-invalid-state", "message": "Payment intent must be in the requires_payment_method state to be processed by a reader.", "type": "invalid_request_error" } }
Fehlgeschlagene Zahlungen
Zu den häufigsten Zahlungsfehlern gehört eine fehlgeschlagene Zahlung. (Zum Beispiel, wenn eine Zahlung von der Bank des/der Kund/in aufgrund unzureichender Deckung abgelehnt wird).
Wenn die Autorisierung einer Zahlung fehlschlägt, sendet Stripe den Webhook terminal.
. Überprüfen Sie die Attribute action.failure_code und action.failure_message, um herauszufinden, ob eine Zahlung abgelehnt wurde:
{ "id": "tmr_xxx", "object": "terminal.reader", "action": { "failure_code": "card_declined", "failure_message": "Your card has insufficient funds.", "process_payment_intent": { "payment_intent": "pi_xxx" }, "status": "failed", "type": "process_payment_intent" }, ... }
Fordern Sie Kundinnen/Kunden im Falle einer abgelehnten Karte auf, eine alternative Zahlungsmethode anzugeben. Verwenden Sie denselben PaymentIntent in einer anderen Anfrage an den Endpoint process_payment_intent. Wenn Sie einen neuen PaymentIntent erstellen, müssen Sie den fehlgeschlagenen PaymentIntent stornieren, um doppelte Zahlungen zu vermeiden.
Bei Kartenlesefehlern (z. B. Fehler beim Lesen des Chips) fordert das Lesegerät Kundinnen/Kunden automatisch zu einem Wiederholungsversuch auf, ohne dass Ihre Anwendung benachrichtigt wird. Wenn mehrere Wiederholungsversuche fehlschlagen, können Sie durch Stellen einer weiteren process_payment_intent-Anfrage eine andere Zahlungsmethode anfordern.
Zeitüberschreitung bei der Zahlung
Ein Lesegerät mit unzuverlässiger Internetverbindung kann aufgrund einer Netzwerkanfrage bei der Autorisierung der Karte eine Zahlung nicht verarbeiten. Das Lesegerät zeigt einige Sekunden lang einen Verarbeitungsbildschirm an, gefolgt von einer Fehlermeldung, und Sie erhalten terminal.
-Webhook mit dem failure_
connection_
:
{ "id": "tmr_xxx", "object": "terminal.reader", "action": { "failure_code": "connection_error", "failure_message": "Could not connect to Stripe.", "process_payment_intent": { "payment_intent": "pi_xxx" }, "status": "failed", "type": "process_payment_intent" }, ... }
Die Zahlungsbestätigungsanfrage wurde möglicherweise von den Backend-Systemen von Stripe verarbeitet, aber das Lesegerät hat die Verbindung möglicherweise getrennt, bevor es die Antwort von Stripe erhalten hat. Wenn Sie einen Webhook mit diesem Fehlercode erhalten, rufen Sie den PaymentIntent-status
ab, um zu überprüfen, ob die Zahlung erfolgreich autorisiert wurde.
Stellen Sie sicher, dass Ihr Netzwerk unsere Netzwerkanforderungen erfüllt, um Zeitüberschreitungen zu vermeiden.
Stornierung der Zahlung
Programmgesteuerte Stornierung
Möglicherweise müssen Sie eine Zahlung, die bereits unterwegs ist, stornieren. Beispielsweise wenn Kundinnen/Kunden Artikel zu ihrem Kauf hinzufügen, nachdem Ihre Integration die Erfassung der Zahlung auf dem Lesegerät bereits eingeleitet hat. Verwenden Sie den Endpoint cancel_action, um das Lesegerät zurückzusetzen:
Notiz
Es ist nicht möglich, eine Lesegeräteaktion mitten in einer Zahlungsautorisierung zu stornieren. Wenn Kundinnen/Kunden ihre Karte bereits zur Zahlung am Lesegerät vorgelegt haben, müssen Sie warten, bis die Verarbeitung abgeschlossen ist. Eine Autorisierung dauert in der Regel ein paar Sekunden. Der Aufruf von cancel_action während einer Autorisierung führt zu einem Fehler vom Typ terminal_
.
Kundenseitig initiierte Stornierung
Nutzer/innen können den Wert von enable_
auf diesen Endpoints festlegen:
Wenn „true“, sehen Nutzer/innen intelligenter Kartenlesegeräte eine Schaltfläche zum Stornieren.

Zahlungseinzug mit aktivierter Stornierung
Durch Tippen auf die Schaltfläche „Abbrechen“ wird die aktive Transaktion abgebrochen. Stripe sendet einen Webhook terminal.
mit dem failure_code customer_
.
{ "action": { "failure_code": "customer_canceled", "failure_message": "This action could not be completed due to an error on the card reader.", "process_payment_intent": { "payment_intent": "pi_xxx", "process_config": { "enable_customer_cancellation": true } }, "status": "failed", "type": "process_payment_intent" } }
Lesegerät beschäftigt
Ein Lesegerät kann jeweils nur eine Zahlung verarbeiten. Während eine Zahlung verarbeitet wird, schlägt der Versuch einer neuen Zahlung mit einem terminal_
-Fehler fehl:
{ "error": { "code": "terminal_reader_busy", "doc_url": "https://docs.stripe.com/error-codes#terminal-reader-timeout", "message": "Reader is currently busy processing another request. Please reference the integration guide at https://stripe.com/docs/terminal/payments/collect-card-payment?terminal-sdk-platform=server-driven#handle-errors for details on how to handle this error.", "type": "invalid_request_error" } }
Zahlungen, deren Bearbeitung noch nicht begonnen hat, können durch neue ersetzt werden.
Ein Lesegerät lehnt eine API-Anfrage auch ab, wenn es Aktualisierungen durchführt oder Einstellungen ändert.
Timeout des Lesegeräts
In seltenen Fällen kann es vorkommen, dass ein Lesegerät aufgrund von temporären Netzwerkproblemen nicht rechtzeitig auf eine API-Anfrage reagiert. In diesem Fall erhalten Sie den Fehlercode terminal_
:
{ "error": { "code": "terminal_reader_timeout", "doc_url": "https://docs.stripe.com/error-codes#terminal-reader-timeout", "message": "There was a timeout when sending this command to the reader. Please reference the integration guide at https://stripe.com/docs/terminal/payments/collect-card-payment?terminal-sdk-platform=server-driven#handle-errors for details on how to handle this error.", "type": "invalid_request_error" } }
In diesem Fall empfehlen wir Ihnen, die API-Anfrage erneut durchzuführen. Stellen Sie sicher, dass Ihr Netzwerk unsere Netzwerkanforderungen erfüllt, um Zeitüberschreitungen zu vermeiden.
In seltenen Fällen ist der Fehlercode terminal_
falsch negativ. In diesem Szenario erhalten Sie, wie oben beschrieben, den Fehler terminal_
von der API, das Lesegerät hat den Befehl jedoch empfangen. Falsch negative Ergebnisse treten auf, wenn Stripe eine Nachricht an das Lesegerät sendet, aber aufgrund vorübergehender Netzwerkfehler keine Bestätigung vom Lesegerät erhält.
Lesegerät offline
Wenn an einem Standort die Internetverbindung unterbrochen wird, kann dies zu einer Unterbrechung der Kommunikation zwischen dem Lesegerät und Stripe führen. In diesem Fall reagieren ein Lesegeräte möglicherweise nicht auf Ereignisse, die von Ihrer Point-of-Sale-Anwendung und Backend-Infrastruktur ausgelöst werden.
Ein Lesegerät, das regelmäßig nicht auf API-Anfragen reagiert, ist höchstwahrscheinlich ausgeschaltet (z. B. das Netzkabel ist nicht angeschlossen oder der Akku leer) oder nicht korrekt mit dem Internet verbunden.
Ein Lesegerät gilt als offline, wenn Stripe in den letzten 2 Minuten kein Signal von diesem Lesegerät erhalten hat. Der Versuch, API-Methoden auf einem Offline-Lesegerät aufzurufen, führt zu einem terminal_
-Fehlercode:
{ "error": { "code": "terminal_reader_offline", "doc_url": "https://docs.stripe.com/error-codes#terminal-reader-offline", "message": "Reader is currently offline, please ensure the reader is powered on and connected to the internet before retrying your request. Reference the integration guide at https://stripe.com/docs/terminal/payments/collect-card-payment?terminal-sdk-platform=server-driven#handle-errors for details on how to handle this error.", "type": "invalid_request_error" } }
Halten Sie sich an unsere Netzwerkanforderungen, um sicherzustellen, dass ein Lesegerät korrekt mit dem Internet verbunden ist.
Fehlende Webhooks
Wenn ein Lesegerät während einer Zahlung die Verbindung trennt, kann es seinen Aktionsstatus in der API nicht aktualisieren. In diesem Szenario zeigt das Lesegerät nach dem Vorzeigen einer Karte einen Fehlerbildschirm an. Das Lesegerät-Objekt in der API wird jedoch nicht so aktualisiert, dass der Fehler auf dem Gerät widergespiegelt wird, und Sie erhalten auch keine Webhooks für die Lesegerätaktion. Ein Lesegerät kann in diesem Fall den Aktionsstatus in_
haben. Kassierer/innen müssen dann eingreifen, indem sie den Endpoint cancel_action zum Zurücksetzen des Lesegerätstatus aufrufen.
Verzögerte Webhooks
In seltenen Fällen kann es bei einem Stripe-Ausfall zu Verzögerungen bei den Webhooks für Lesegerätaktionen kommen. Sie können den Status der Reader- oder PaymentIntent-Objekte abfragen, um den aktuellen Status zu ermitteln.
Webhook-Ereignisse
Webhook | Beschreibung |
---|---|
terminal. | Wird gesendet, wenn eine asynchrone Aktion erfolgreich ist. Wird für Aktionen gesendet, die eine vorgelegte Karte benötigen, beispielsweise process_ , confirm_ , process_ und refund_ . |
terminal. | Wird gesendet, wenn eine asynchrone Aktion fehlschlägt. Wird für Aktionen gesendet, bei denen eine Karte vorgelegt werden muss, wie process_ , process_ und refund_ . Für die Aktionen set_ und cancel_ wird kein Webhook gesendet. Ihre Integration muss diese Fehler beheben. |
terminal. | Wird gesendet, wenn eine asynchrone Aktion aktualisiert wird. Wird für Aktionen wie collect_ gesendet. |