Kartenzahlungen ohne Webhooks akzeptieren
Erfahren Sie, wie Sie eine Kartenzahlung auf Ihrem Server bestätigen und Anfragen zur Kartenauthentifizierung abwickeln.
Vorsicht
Stripe empfiehlt anstelle des Card Element das neuere Payment Element zu verwenden. Wenn Sie nur das Payment Element verwenden, können Sie mehrere Zahlungsmethoden akzeptieren. Erfahren Sie mehr über das Card Element und das Payment Element.
Wenn Sie mehr Support und Zukunftssicherheit wünschen, nutzen Sie die Standard-Integration für asynchrone Zahlungen.
Mit dieser Integration können Sie auf die Antwort des Clients warten und eine Zahlung auf dem Server abschließen, ohne Webhooks verwenden oder Offline-Ereignisse verarbeiten zu müssen. Auch wenn es zunächst einfacher erscheint, lässt sich diese Integration nur schwer skalieren, wenn Ihr Unternehmen wächst. Es gelten mehrere Beschränkungen:
- Unterstützt nur Karten – Sie müssen mehr programmieren, um ACH und andere beliebte regionale Zahlungsmethoden separat zu unterstützen.
- Risiko der doppelten Abbuchung: Wenn bei jedem Zahlungsversuch Ihrer Kundinnen/Kunden gleichzeitig ein neuer PaymentIntent erstellt wird, laufen Sie Gefahr, das Kundenkonto aus Versehen doppelt zu belasten. Beachten Sie dazu die Best Practices.
- Zusätzlicher Trip zum Client: Für Karten mit 3D Secure oder solche, die Vorschriften wie denen zur starken Kundenauthentifizierung (SCA) unterliegen, sind zusätzliche Schritte auf dem Client erforderlich.
Beachten Sie diese Beschränkungen, wenn Sie die Integration durchführen möchten. Verwenden Sie andernfalls die Standard-Integration.
Stripe einrichten
Zunächst benötigen Sie ein Stripe-Konto. Registrieren Sie sich jetzt.
Nutzen Sie unsere offiziellen Bibliotheken für den Zugriff auf die Stripe-API über Ihre Anwendung:
Kartenangaben erfassenClientseitig
Erfassen Sie Kartendaten auf dem Client mit Stripe.js und Stripe Elements. Elements beinhaltet vorgefertigte Komponenten der Nutzeroberfläche zur Erfassung und Validierung von Kartennummern, Postleitzahlen und Ablaufdaten.
Ein Stripe Element enthält ein iframe, dass die Zahlungsdaten über eine HTTPS-Verbindung sicher an Stripe sendet. Die Adresse der Bezahlseite muss ebenfalls mit https:// beginnen, nicht mit http://, damit Ihre Integration funktioniert.
Sie können Ihre Integration ohne HTTPS testen. Dann müssen Sie das Protokoll aber aktivieren, bevor Sie Ihre ersten Live-Zahlungen empfangen.
PaymentMethod an Ihren Server übermittelnClientseitig
Wenn die PaymentMethod erfolgreich erstellt wurde, senden Sie ihre ID an den Server.
const stripePaymentMethodHandler = async (result) => { if (result.error) { // Show error in payment form } else { // Otherwise send paymentMethod.id to your server (see Step 4) const res = await fetch('/pay', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ payment_method_id: result.paymentMethod.id, }), }) const paymentResponse = await res.json(); // Handle server response (see Step 4) handleServerResponse(paymentResponse); } }
PaymentIntent erstellenServerseitig
Richten Sie auf Ihrem Server einen Endpoint für den Empfang der Anfrage ein. Dieser Endpoint wird auch später verwendet, um Karten zu verarbeiten, die einen zusätzlichen Authentifizierungsschritt erfordern.
Erstellen Sie einen neuen PaymentIntent mit der ID der auf Ihrem Client erstellten PaymentMethod. Sie können den PaymentIntent bestätigen, indem Sie die Eigenschaft Bestätigen auf „true“ festlegen, wenn der PaymentIntent erstellt wird oder indem Sie nach der Erstellung Bestätigen aufrufen. Die separate Autorisierung und Erfassung wird für Kartenzahlungen ebenfalls unterstützt.
Wenn für die Zahlung weitere Aktionen wie 3D Secure-Authentifizierung erforderlich sind, wird der Status des PaymentIntent auf requires_
gesetzt. Wenn die Zahlung fehlschlägt, wird der Status wieder auf requires_
gesetzt und Sie sollten dem/der Nutzer/in eine Fehlermeldung anzeigen. Wenn für die Zahlung keine zusätzliche Authentifizierung erforderlich ist, wird eine Abbuchung erstellt und der Status des PaymentIntent wird auf succeeded
gesetzt.
Notiz
In Versionen der API vor dem 11.02.2019 wird requires_
als requires_
und requires_
als requires_
angezeigt.
Wenn Sie die Karte für die spätere Wiederverwendung speichern möchten, erstellen Sie ein Customer-Objekt, um die PaymentMethod zu speichern, und übergeben Sie beim Erstellen der PaymentIntent die folgenden zusätzlichen Parameter:
- customer. Legen Sie die Eigenschaft auf die ID des/der Kunden/Kundin fest.
- setup_future_usage. Legen Sie die Eigenschaft auf
off_
fest, damit Stripe darüber informiert wird, dass Sie diese PaymentMethod für Off-Session-Zahlungen wiederverwenden möchten, wenn die Kundin/der Kunde nicht anwesend ist. Wenn Sie diese Eigenschaft festlegen, wird die PaymentMethod nach der Bestätigung des PaymentIntent und nach Durchführung aller erforderlichen Aktionen der Nutzerin/des Nutzers für die Kundin/den Kunden gespeichert. Mehr dazu finden Sie im Code-Beispiel unter Karten nach einer Zahlung speichern.session
Mögliche weitere Aktionen handhabenClientseitig
Schreiben Sie Code für Situationen, in denen Ihre Kundinnen/Kunden handeln müssen. In der Regel werden Zahlungen erfolgreich durchgeführt, nachdem Sie sie in Schritt 4 auf dem Server bestätigt haben. Wenn der PaymentIntent allerdings weitere Schritte von der Kundin/dem Kunden verlangt, wie etwa die Authentifizierung mit 3D Secure, kommt dieser Code zum Einsatz.
Verwenden Sie stripe.handleCardAction, um die Nutzeroberfläche für die Bearbeitung von Kundenaktionen und den Abschluss der Zahlung auszulösen. Bei erfolgreicher Authentifizierung erhält der PaymentIntent den Status requires_
. Bestätigen Sie den PaymentIntent erneut auf Ihrem Server, um die Zahlung abzuschließen.
Verwenden Sie beim Testen eine Testkartennummer, die eine Authentifizierung erfordert (zum Beispiel ), um diesen Ablauf zu erzwingen. Wenn Sie eine Karte verwenden, die keine Authentifizierung erfordert (zum Beispiel ), wird dieser Teil des Ablaufs übersprungen und mit Schritt 4 abgeschlossen.
const handleServerResponse = async (response) => { if (response.error) { // Show error from server on payment form } else if (response.requires_action) { // Use Stripe.js to handle the required card action const { error: errorAction, paymentIntent } = await stripe.handleCardAction(response.payment_intent_client_secret); if (errorAction) { // Show error from Stripe.js in payment form } else { // The card action has been handled // The PaymentIntent can be confirmed again on the server const serverResponse = await fetch('/pay', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ payment_intent_id: paymentIntent.id }) }); handleServerResponse(await serverResponse.json()); } } else { // Show success message } }
Notiz
Die Ausführung von stripe.
kann einige Sekunden dauern. Während dieser Zeit sollten Sie Ihr Formular deaktivieren, damit keine erneute Absendung erfolgen kann. Lassen Sie stattdessen ein Wartesymbol einblenden, wie beispielsweise eine Sanduhr. Tritt ein Fehler auf, lassen Sie eine Fehlermeldung für die Kundin/den Kunden anzeigen, aktivieren Sie das Formular erneut und blenden Sie das Wartesymbol aus. Falls die Kundin/der Kunde weitere Schritte (z. B. eine Authentifizierung) für den Abschluss der Zahlung durchführen muss, führt Stripe.js durch diesen Prozess.
PaymentIntent erneut bestätigenServerseitig
Dieser Code wird nur ausgeführt, wenn für eine Zahlung – wie bei der Vorgehensweise im vorherigen Schritt – eine zusätzliche Authentifizierung erforderlich ist. Der Code selbst ist nicht optional, da jede Zahlung diesen zusätzlichen Schritt erfordern kann.
Bestätigen Sie den PaymentIntent erneut mit demselben Endpoint, den Sie zuvor eingerichtet haben, um die Zahlung abzuschließen und die Bestellung abzuwickeln. Stellen Sie sicher, dass diese Bestätigung innerhalb einer Stunde nach dem Zahlungsversuch erfolgt. Andernfalls schlägt die Zahlung fehl und der Status wird auf requires_
zurückgesetzt.
Integration testen
Ihnen stehen mehrere Testkarten zur Verwendung in einer Sandbox zur Verfügung, um sicherzustellen, dass diese Integration bereit ist. Sie können sie mit einer beliebigen Prüfziffer/CVC und einem Ablaufdatum in der Zukunft verwenden.
Nummer | Beschreibung |
---|---|
Zahlung ist erfolgreich und wird sofort verarbeitet. | |
Erfordert Authentifizierung. Stripe veranlasst ein Modal, das den Kunden um Authentifizierung bittet. | |
Zahlung schlägt immer mit dem Ablehnungscode insufficient_ fehl. |
Eine vollständige Liste der Testkarten finden Sie in unserem Leitfaden zum Testbetrieb.