# Bestellungen ausführen Erfahren Sie, wie Sie mit der Checkout Sessions API erhaltene Zahlungen abwickeln. # Gehostete Seite > This is a Gehostete Seite for when payment-ui is stripe-hosted. View the full page at https://docs.stripe.com/checkout/fulfillment?payment-ui=stripe-hosted. Wenn Sie eine Zahlung mit der Checkout Sessions API (einschließlich Payment Links) erhalten, müssen Sie möglicherweise Maßnahmen ergreifen, um Ihren Kundinnen/Kunden das zur Verfügung zu stellen, wofür sie bezahlt haben. Beispielsweise müssen Sie ihnen möglicherweise Zugang zu einer Dienstleistung gewähren oder ihnen physische Waren zusenden. Dieser Vorgang wird als Ausführung bezeichnet und Sie haben zwei Möglichkeiten, diesen Prozess abzuwickeln: - **Manuell**: Sie können Bestellungen anhand der Informationen, die Stripe Ihnen zur Verfügung stellt, manuell ausführen. Sie können beispielsweise das [Dashboard](https://docs.stripe.com/dashboard/basics.md) überwachen, Zahlungsbenachrichtigungs-E-Mails prüfen oder Berichte einsehen und dann Bestellungen ausführen. - **Automatisch**: Sie können ein automatisches Ausführungssystem entwickeln. (Recommended) Die erste Option eignet sich für kleine Mengen oder experimentelle Projekte, aber für die meisten Situationen empfehlen wir die Automatisierung der Ausführung. Im restlichen Teil dieses Leitfadens erfahren Sie, wie Sie ein automatisches Ausführungssystem entwickeln können. ## Automatische Ausführung Das nachfolgend beschriebene automatische Ausführungssystem nutzt eine Kombination aus *Webhooks* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) und einer Weiterleitung zu Ihrer Website, um die Ausführung auszulösen. Sie müssen Webhooks verwenden, um sicherzustellen, dass die Ausführung bei jeder Zahlung erfolgt. Die Weiterleitung ermöglicht Ihren Kundinnen/Kunden den Zugriff auf Dienstleistungen oder Ausführungsdetails unmittelbar nach der Zahlung. > Payment Links nutzt Checkout, daher gelten alle folgenden Informationen sowohl für Payment Links als auch für Checkout, sofern nicht anders angegeben. ## Ausführungsfunktion erstellen [Serverseitig] Erstellen Sie eine Funktion auf Ihrem Server, um erfolgreiche Zahlungen auszuführen. Webhooks lösen diese Funktion aus und sie wird aufgerufen, wenn Kundinnen/Kunden nach Abschluss des Bezahlvorgangs auf Ihre Website geleitet werden. In diesem Leitfaden wird diese Funktion als `fulfill_checkout` bezeichnet, aber Sie können die Funktion beliebig benennen. Nehmen Sie die Ausführung nur einmal pro Zahlung vor. Aufgrund der Funktionsweise dieser Integration und des Internets kann es vorkommen, dass Ihre Funktion `fulfill_checkout` für dieselbe Checkout-Sitzung mehrere Male, möglicherweise auch gleichzeitig, aufgerufen wird. Durch die einmalige Ausführung des Bezahlvorgangs wird sichergestellt, dass dies nicht zu unerwünschtem Verhalten führt. Ihre `fulfill_checkout`-Funktion muss: 1. Korrekte Verarbeitung eines mehrfachen Aufrufs mit derselben Checkout-Sitzungs-ID. 1. Akzeptieren Sie eine *Checkout-Sitzungs* (A Checkout Session represents your customer's session as they pay for one-time purchases or subscriptions through Checkout. After a successful payment, the Checkout Session contains a reference to the Customer, and either the successful PaymentIntent or an active Subscription)-ID als Argument. 1. Rufen Sie die Checkout-Sitzung von der API mit der [line_items](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-line_items)-Eigenschaft [„erweitert“](https://docs.stripe.com/api/expanding_objects.md) ab. 1. Überprüfen Sie die Eigenschaft [payment_status](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-payment_status), um festzustellen, ob sie ausgeführt werden muss. 1. Setzen Sie die Ausführung der Posten um. 1. Zeichnen Sie den Ausführungsstatus für die angegebene Checkout-Sitzung auf. Verwenden Sie den folgenden Code als Ausgangspunkt für Ihre `fulfill_checkout`-Funktion. Die `TODO`-Kommentare geben alle Funktionen an, die Sie implementieren müssen. > Die folgenden Code-Snippets benennen die `fulfill_checkout`-Funktion möglicherweise mit `fulfillCheckout` oder `FulfillCheckout`, je nach ausgewählter Sprache. Sie repräsentieren jedoch alle dieselbe Funktion. #### Ruby ```ruby def fulfill_checkout(session_id) # Don't put any keys in code. See https://docs.stripe.com/keys-best-practices. # Find your keys at https://dashboard.stripe.com/apikeys. Stripe.api_key = '<>' puts "Fullfilling Checkout Session #{session_id}" # TODO: Make this function safe to run multiple times, # even concurrently, with the same session ID # TODO: Make sure fulfillment hasn't already been # performed for this Checkout Session # Retrieve the Checkout Session from the API with line_items expanded checkout_session = Stripe::Checkout::Session.retrieve({ id: session_id, expand: ['line_items'], }) # Check the Checkout Session's payment_status property # to determine if fulfillment should be performed if checkout_session.payment_status != 'unpaid' # TODO: Perform fulfillment of the line items # TODO: Record/save fulfillment status for this # Checkout Session end end ``` > Wenn eine Checkout-Sitzung viele Posten enthält, verwenden Sie die [automatische Paginierung](https://docs.stripe.com/api/pagination/auto.md) mit der [API für Checkout-Posten](https://docs.stripe.com/api/checkout/sessions/line_items.md), um alle Posten abzurufen. Je nachdem, welche Zahlungsmethoden Sie akzeptieren und welche Anforderungen Ihr Unternehmen an Sie stellt, sollte Ihre Funktion `fulfill_checkout` folgende Aufgaben ausführen: - Stellen Sie den Zugriff auf Dienstleistungen bereit. - Lösen Sie den Versand von Waren aus. - Speichern Sie eine Kopie der Zahlungsdetails und Posten in Ihrer eigenen Datenbank. - Senden Sie dem Kunden/der Kundin eine individuelle Beleg-E-Mail, wenn Sie [Belege von Stripe](https://docs.stripe.com/receipts.md) nicht aktiviert haben. - Gleichen Sie Einzelposten und gekaufte Mengen ab, wenn Sie Kundinnen/Kunden gestatten, die Mengen in Checkout anzupassen. - Aktualisieren Sie Inventar- oder Bestandsaufzeichnungen. ## Einen Ereignis-Handlers für Zahlungen erstellen [Serverseitig] Um die Ausführung auszulösen, erstellen Sie einen Webhook-Ereignis-Handler, der auf Zahlungsereignisse wartet und Ihre `fulfill_checkout`-Funktion auslöst. Wenn jemand Sie bezahlt, wird das Ereignis `checkout.session.completed` erstellt. Richten Sie auf Ihrem Server einen Endpoint ein, um diese Ereignisse zu akzeptieren, zu verarbeiten und den Empfang zu bestätigen. ### Zahlungsmethoden mit sofortiger oder verzögerter Zahlung Einige Zahlungsmethoden werden nicht [sofort](https://docs.stripe.com/payments/payment-methods.md#payment-notification) durchgeführt, z. B. [ACH Direct Debit](https://docs.stripe.com/payments/ach-direct-debit.md) und andere Banküberweisungsmethoden. Das bedeutet, dass die Gelder nicht sofort verfügbar sind, wenn der Bezahlvorgang abgeschlossen wird. Zahlungsmethoden mit Verzögerung generieren ein [checkout.session.async_payment_succeeded](https://docs.stripe.com/api/events/types.md#event_types-checkout.session.async_payment_succeeded)-Ereignis, wenn die Zahlung später erfolgreich durchgeführt wird. Das Objekt befindet sich so lange in Bearbeitung, bis der Zahlungsstatus entweder „Erfolgreich“ oder „Fehlgeschlagen“ ist. > Der im folgenden Code angezeigte Webhook-Geheimschlüssel (`whsec_...`) stammt entweder von der Stripe-CLI oder von Ihrem Webhook-Endpoint. Sie können die Stripe-CLI für lokale Tests verwenden und Stripe verwendet einen Webhook-Endpoint, um Ereignisse an Ihren Handler zu senden, wenn dieser auf einem Server ausgeführt wird. Im nächsten Abschnitt finden Sie weitere Details. #### Ruby ```ruby require 'sinatra' # Use the secret provided by Stripe CLI for local testing # or your webhook endpoint's secret. endpoint_secret = 'whsec_...' post '/webhook' do event = nil # Verify webhook signature and extract the event # See https://stripe.com/docs/webhooks#verify-events for more information. begin sig_header = request.env['HTTP_STRIPE_SIGNATURE'] payload = request.body.read event = Stripe::Webhook.construct_event(payload, sig_header, endpoint_secret) rescue JSON::ParserError => e # Invalid payload return status 400 rescue Stripe::SignatureVerificationError => e # Invalid signature return status 400 end if event['type'] == 'checkout.session.completed' || event['type'] == 'checkout.session.async_payment_succeeded' fulfill_checkout(event['data']['object']['id']) end status 200 end ``` Es empfiehlt sich auch, `checkout.session.async_payment_failed`-Ereignisse zu überwachen und zu verarbeiten. Sie können beispielsweise eine E-Mail an Ihre Kundinnen und Kunden senden, wenn eine verzögerte Zahlung fehlschlägt. ## Ihren Ereignis-Handler lokal testen Am schnellsten lässt sich Ihr Webhook-Ereignis-Handler mit der [Stripe-CLI](https://docs.stripe.com/stripe-cli.md) entwickeln und testen. Wenn Sie die Stripe-CLI nicht haben, befolgen Sie die [Installationsanleitung](https://docs.stripe.com/stripe-cli/install.md), um zu starten. Wenn die Stripe-CLI installiert ist, können Sie Ihren Ereignis-Handler lokal testen. Führen Sie Ihren Server aus (zum Beispiel auf `localhost:4242`) und führen Sie dann den Befehl [Stripe-Überwachung](https://docs.stripe.com/cli/listen) aus, damit die Stripe-CLI Ereignisse an Ihren lokalen Server weiterleitet: ```bash stripe listen --forward-to localhost:4242/webhook Ready! Your webhook signing secret is 'whsec_' (^C to quit) ``` Fügen Sie das Webhook-Geheimnis (`whsec_...`) zu Ihrem Code für die Verarbeitung von Ereignissen hinzu und testen Sie dann die Ausführung, indem Sie als Kunde/Kundin den Bezahlvorgang durchlaufen: - Betätigen Sie die Checkout-Schaltfläche, über die Sie zum Checkout gelangen, oder besuchen Sie Ihren Payment Link - Geben Sie in Checkout folgende Testdaten an: - Geben Sie als Kartennummer `4242 4242 4242 4242` ein - Geben Sie für die Karte ein beliebiges Ablaufdatum in der Zukunft ein - Geben Sie als Prüfziffer eine 3-stellige Ziffer ein - Geben Sie eine beliebige Postleitzahl für die Rechnungsstellung ein (`90210`) - Klicken Sie auf die Schaltfläche **Bezahlen** Wenn die Zahlung abgeschlossen ist, überprüfen Sie Folgendes: - In Ihrer Befehlszeile, in der `stripe listen` ausgeführt wird, wird das Ereignis `checkout.session.completed` angezeigt, das an Ihren lokalen Server weitergeleitet wird. - Ihre Serverprotokolle zeigen die erwartete Ausgabe Ihrer `fulfill_checkout`-Funktion. ## Einen Webhook-Endpoint erstellen Nachdem Sie einen lokalen Test durchgeführt haben, richten Sie Ihren Webhook-Handler auf Ihrem Server ein und starten ihn. Als Nächstes [erstellen Sie einen Webhook Endpoint](https://docs.stripe.com/webhooks.md#register-webhook), um die `checkout.session.completed`-Ereignisse an Ihren Server zu senden, und testen Sie dann den Checkout-Ablauf erneut. ## Eine Zielseiten-URL konfigurieren [Empfohlen] Konfigurieren Sie Checkout so, dass Ihre Kundinnen/Kundin nach Abschluss des Bezahlvorgangs zu eine Seite auf Ihrer Website geleitet werden. Fügen Sie den Platzhalter `{CHECKOUT_SESSION_ID}` in die URL Ihrer Seite ein. Dieser wird durch die ID der Checkout-Sitzung ersetzt, wenn Ihr Kunde/Ihre Kundin von Checkout weitergeleitet wird. ### Gehosteter Bezahlvorgang For Checkout Sessions with the default [ui_mode](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-ui_mode) of `hosted_page`, set the `success_url`. ```curl curl https://api.stripe.com/v1/checkout/sessions \ -u "<>:" \ -d "line_items[0][price]={{PRICE_ID}}" \ -d "line_items[0][quantity]=1" \ -d mode=payment \ --data-urlencode "success_url=https://example.com/after-checkout?session_id={CHECKOUT_SESSION_ID}" ``` Wenn Sie einen Webhook-Endpoint eingerichtet haben, der auf `checkout.session.completed`-Ereignisse hört und eine `success_url` festgelegt haben, wartet Checkout bis zu 10 Sekunden auf die Antwort Ihres Servers auf die Zustellung des Webhook-Ereignisses, bevor die Kundin/der Kunde weitergeleitet wird. Wenn Sie diesen Ansatz verwenden, stellen Sie sicher, dass Ihr Server so schnell wie möglich auf `checkout.session.completed`-Ereignisse reagiert. Wenn Sie die Stripe CLI für lokale Tests verwenden, leitet Checkout sofort zur `success_url` weiter. Dieses Verhalten wird für Webhook-Endpoints, die in einem [Organisationskonto](https://docs.stripe.com/get-started/account/orgs.md) registriert sind, nicht unterstützt. Stripe wartet nicht auf Antworten von Organisations-Webhook-Endpoints, die auf `checkout.session.completed` hören, wenn Checkout-Kundinnen und -Kunden weitergeleitet werden. ### Payment Links Legen Sie für Zahlungslinks, die Sie mit der API erstellen, die [after_completion.redirect.url](https://docs.stripe.com/api/payment-link/create.md#create_payment_link-after_completion-redirect-url) fest. ```curl curl https://api.stripe.com/v1/payment_links \ -u "<>:" \ -d "line_items[0][price]={{PRICE_ID}}" \ -d "line_items[0][quantity]=1" \ -d "after_completion[type]=redirect" \ --data-urlencode "after_completion[redirect][url]=https://example.com/after-checkout?session_id={CHECKOUT_SESSION_ID}" ``` Für Payment Links, die Sie [im Dashboard erstellen](https://dashboard.stripe.com/payment-links/create): 1. Gehen Sie zur Registerkarte **Nach der Zahlung**. 1. Wählen Sie **Sie Bestätigungsseite nicht anzeigen** aus. 1. Geben Sie die URL Ihrer Zielseite an, die den Platzhalter `{CHECKOUT_SESSION_ID}` enthält (zum Beispiel `https://example.com/after-checkout?session_id={CHECKOUT_SESSION_ID}`) ## Ausführung auf Ihrer Zielseite auslösen [Empfohlen] Die [Überwachung von Webhooks](https://docs.stripe.com/checkout/fulfillment.md#create-payment-event-handler) ist erforderlich, um sicherzustellen, dass Sie immer die Ausführung für jede Zahlung auslösen, aber Webhooks können manchmal verzögert werden. Um Ihren Zahlungsablauf zu optimieren und eine sofortige Ausführung zu gewährleisten, wenn Ihr Kunde/Ihre Kundin anwesend ist, lösen Sie die Ausführung auch von Ihrer Startseite aus. Verwenden Sie die ID der Checkout-Sitzung aus der im vorherigen Schritt angegebenen URL, um Folgendes zu tun: 1. Wenn Ihr Server eine Anfrage für Ihre Checkout-Zielseite erhält, extrahieren Sie die ID der Checkout-Sitzung aus der URL. 1. Führen Sie Ihre `fulfill_checkout`-Funktion` mit der angegebenen ID aus. 1. Rendern Sie die Seite, nachdem der Auführungversuch abgeschlossen ist. Wenn Sie Ihre Landingpage rendern, können Sie Folgendes anzeigen: - Details des Ausführungsvorgangs. - Links oder Informationen zu Dienstleistungen, auf die der Kunde/die Kundin nun Zugriff hat. - Versand- oder logistische Details für physische Waren. > #### Webhooks sind erforderlich > > Sie können sich nicht darauf verlassen, dass die Ausführung nur von Ihrer Checkout-Startseite aus ausgelöst wird, da Ihre Kundinnen und Kunden diese Seite nicht garantiert besuchen. Zum Beispiel kann jemand erfolgreich in Checkout bezahlen und wird seine/ihre Internetverbindung unterbrochen, bevor Ihre Startseite geladen wird. > > [Richten Sie einen Webhook-Ereignis-Handler ein](https://docs.stripe.com/checkout/fulfillment.md#create-payment-event-handler), damit Stripe Zahlungsereignisse unter vollständiger Umgehung des Clients direkt an Ihren Server senden kann. Webhooks sind der zuverlässigste Weg, um zu bestätigen, wann Sie bezahlt werden. Wenn die Zustellung des Webhook-Ereignisses fehlschlägt, versucht Stripe [es mehrmals erneut](https://docs.stripe.com/webhooks.md#automatic-retries). # Eingebettete Seite > This is a Eingebettete Seite for when payment-ui is embedded-form. View the full page at https://docs.stripe.com/checkout/fulfillment?payment-ui=embedded-form. Wenn Sie eine Zahlung mit der Checkout Sessions API (einschließlich Payment Links) erhalten, müssen Sie möglicherweise Maßnahmen ergreifen, um Ihren Kundinnen/Kunden das zur Verfügung zu stellen, wofür sie bezahlt haben. Beispielsweise müssen Sie ihnen möglicherweise Zugang zu einer Dienstleistung gewähren oder ihnen physische Waren zusenden. Dieser Vorgang wird als Ausführung bezeichnet und Sie haben zwei Möglichkeiten, diesen Prozess abzuwickeln: - **Manuell**: Sie können Bestellungen anhand der Informationen, die Stripe Ihnen zur Verfügung stellt, manuell ausführen. Sie können beispielsweise das [Dashboard](https://docs.stripe.com/dashboard/basics.md) überwachen, Zahlungsbenachrichtigungs-E-Mails prüfen oder Berichte einsehen und dann Bestellungen ausführen. - **Automatisch**: Sie können ein automatisches Ausführungssystem entwickeln. (Recommended) Die erste Option eignet sich für kleine Mengen oder experimentelle Projekte, aber für die meisten Situationen empfehlen wir die Automatisierung der Ausführung. Im restlichen Teil dieses Leitfadens erfahren Sie, wie Sie ein automatisches Ausführungssystem entwickeln können. ## Automatische Ausführung Das nachfolgend beschriebene automatische Ausführungssystem nutzt eine Kombination aus *Webhooks* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) und einer Weiterleitung zu Ihrer Website, um die Ausführung auszulösen. Sie müssen Webhooks verwenden, um sicherzustellen, dass die Ausführung bei jeder Zahlung erfolgt. Die Weiterleitung ermöglicht Ihren Kundinnen/Kunden den Zugriff auf Dienstleistungen oder Ausführungsdetails unmittelbar nach der Zahlung. ## Ausführungsfunktion erstellen [Serverseitig] Erstellen Sie eine Funktion auf Ihrem Server, um erfolgreiche Zahlungen auszuführen. Webhooks lösen diese Funktion aus und sie wird aufgerufen, wenn Kundinnen/Kunden nach Abschluss des Bezahlvorgangs auf Ihre Website geleitet werden. In diesem Leitfaden wird diese Funktion als `fulfill_checkout` bezeichnet, aber Sie können die Funktion beliebig benennen. Nehmen Sie die Ausführung nur einmal pro Zahlung vor. Aufgrund der Funktionsweise dieser Integration und des Internets kann es vorkommen, dass Ihre Funktion `fulfill_checkout` für dieselbe Checkout-Sitzung mehrere Male, möglicherweise auch gleichzeitig, aufgerufen wird. Durch die einmalige Ausführung des Bezahlvorgangs wird sichergestellt, dass dies nicht zu unerwünschtem Verhalten führt. Ihre `fulfill_checkout`-Funktion muss: 1. Korrekte Verarbeitung eines mehrfachen Aufrufs mit derselben Checkout-Sitzungs-ID. 1. Akzeptieren Sie eine *Checkout-Sitzungs* (A Checkout Session represents your customer's session as they pay for one-time purchases or subscriptions through Checkout. After a successful payment, the Checkout Session contains a reference to the Customer, and either the successful PaymentIntent or an active Subscription)-ID als Argument. 1. Rufen Sie die Checkout-Sitzung von der API mit der [line_items](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-line_items)-Eigenschaft [„erweitert“](https://docs.stripe.com/api/expanding_objects.md) ab. 1. Überprüfen Sie die Eigenschaft [payment_status](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-payment_status), um festzustellen, ob sie ausgeführt werden muss. 1. Setzen Sie die Ausführung der Posten um. 1. Zeichnen Sie den Ausführungsstatus für die angegebene Checkout-Sitzung auf. Verwenden Sie den folgenden Code als Ausgangspunkt für Ihre `fulfill_checkout`-Funktion. Die `TODO`-Kommentare geben alle Funktionen an, die Sie implementieren müssen. > Die folgenden Code-Snippets benennen die `fulfill_checkout`-Funktion möglicherweise mit `fulfillCheckout` oder `FulfillCheckout`, je nach ausgewählter Sprache. Sie repräsentieren jedoch alle dieselbe Funktion. #### Ruby ```ruby def fulfill_checkout(session_id) # Don't put any keys in code. See https://docs.stripe.com/keys-best-practices. # Find your keys at https://dashboard.stripe.com/apikeys. Stripe.api_key = '<>' puts "Fullfilling Checkout Session #{session_id}" # TODO: Make this function safe to run multiple times, # even concurrently, with the same session ID # TODO: Make sure fulfillment hasn't already been # performed for this Checkout Session # Retrieve the Checkout Session from the API with line_items expanded checkout_session = Stripe::Checkout::Session.retrieve({ id: session_id, expand: ['line_items'], }) # Check the Checkout Session's payment_status property # to determine if fulfillment should be performed if checkout_session.payment_status != 'unpaid' # TODO: Perform fulfillment of the line items # TODO: Record/save fulfillment status for this # Checkout Session end end ``` > Wenn eine Checkout-Sitzung viele Posten enthält, verwenden Sie die [automatische Paginierung](https://docs.stripe.com/api/pagination/auto.md) mit der [API für Checkout-Posten](https://docs.stripe.com/api/checkout/sessions/line_items.md), um alle Posten abzurufen. Je nachdem, welche Zahlungsmethoden Sie akzeptieren und welche Anforderungen Ihr Unternehmen an Sie stellt, sollte Ihre Funktion `fulfill_checkout` folgende Aufgaben ausführen: - Stellen Sie den Zugriff auf Dienstleistungen bereit. - Lösen Sie den Versand von Waren aus. - Speichern Sie eine Kopie der Zahlungsdetails und Posten in Ihrer eigenen Datenbank. - Senden Sie dem Kunden/der Kundin eine individuelle Beleg-E-Mail, wenn Sie [Belege von Stripe](https://docs.stripe.com/receipts.md) nicht aktiviert haben. - Gleichen Sie Einzelposten und gekaufte Mengen ab, wenn Sie Kundinnen/Kunden gestatten, die Mengen in Checkout anzupassen. - Aktualisieren Sie Inventar- oder Bestandsaufzeichnungen. ## Einen Ereignis-Handlers für Zahlungen erstellen [Serverseitig] Um die Ausführung auszulösen, erstellen Sie einen Webhook-Ereignis-Handler, der auf Zahlungsereignisse wartet und Ihre `fulfill_checkout`-Funktion auslöst. Wenn jemand Sie bezahlt, wird das Ereignis `checkout.session.completed` erstellt. Richten Sie auf Ihrem Server einen Endpoint ein, um diese Ereignisse zu akzeptieren, zu verarbeiten und den Empfang zu bestätigen. ### Zahlungsmethoden mit sofortiger oder verzögerter Zahlung Einige Zahlungsmethoden werden nicht [sofort](https://docs.stripe.com/payments/payment-methods.md#payment-notification) durchgeführt, z. B. [ACH Direct Debit](https://docs.stripe.com/payments/ach-direct-debit.md) und andere Banküberweisungsmethoden. Das bedeutet, dass die Gelder nicht sofort verfügbar sind, wenn der Bezahlvorgang abgeschlossen wird. Zahlungsmethoden mit Verzögerung generieren ein [checkout.session.async_payment_succeeded](https://docs.stripe.com/api/events/types.md#event_types-checkout.session.async_payment_succeeded)-Ereignis, wenn die Zahlung später erfolgreich durchgeführt wird. Das Objekt befindet sich so lange in Bearbeitung, bis der Zahlungsstatus entweder „Erfolgreich“ oder „Fehlgeschlagen“ ist. > Der im folgenden Code angezeigte Webhook-Geheimschlüssel (`whsec_...`) stammt entweder von der Stripe-CLI oder von Ihrem Webhook-Endpoint. Sie können die Stripe-CLI für lokale Tests verwenden und Stripe verwendet einen Webhook-Endpoint, um Ereignisse an Ihren Handler zu senden, wenn dieser auf einem Server ausgeführt wird. Im nächsten Abschnitt finden Sie weitere Details. #### Ruby ```ruby require 'sinatra' # Use the secret provided by Stripe CLI for local testing # or your webhook endpoint's secret. endpoint_secret = 'whsec_...' post '/webhook' do event = nil # Verify webhook signature and extract the event # See https://stripe.com/docs/webhooks#verify-events for more information. begin sig_header = request.env['HTTP_STRIPE_SIGNATURE'] payload = request.body.read event = Stripe::Webhook.construct_event(payload, sig_header, endpoint_secret) rescue JSON::ParserError => e # Invalid payload return status 400 rescue Stripe::SignatureVerificationError => e # Invalid signature return status 400 end if event['type'] == 'checkout.session.completed' || event['type'] == 'checkout.session.async_payment_succeeded' fulfill_checkout(event['data']['object']['id']) end status 200 end ``` Es empfiehlt sich auch, `checkout.session.async_payment_failed`-Ereignisse zu überwachen und zu verarbeiten. Sie können beispielsweise eine E-Mail an Ihre Kundinnen und Kunden senden, wenn eine verzögerte Zahlung fehlschlägt. ## Ihren Ereignis-Handler lokal testen Am schnellsten lässt sich Ihr Webhook-Ereignis-Handler mit der [Stripe-CLI](https://docs.stripe.com/stripe-cli.md) entwickeln und testen. Wenn Sie die Stripe-CLI nicht haben, befolgen Sie die [Installationsanleitung](https://docs.stripe.com/stripe-cli/install.md), um zu starten. Wenn die Stripe-CLI installiert ist, können Sie Ihren Ereignis-Handler lokal testen. Führen Sie Ihren Server aus (zum Beispiel auf `localhost:4242`) und führen Sie dann den Befehl [Stripe-Überwachung](https://docs.stripe.com/cli/listen) aus, damit die Stripe-CLI Ereignisse an Ihren lokalen Server weiterleitet: ```bash stripe listen --forward-to localhost:4242/webhook Ready! Your webhook signing secret is 'whsec_' (^C to quit) ``` Fügen Sie das Webhook-Geheimnis (`whsec_...`) zu Ihrem Code für die Verarbeitung von Ereignissen hinzu und testen Sie dann die Ausführung, indem Sie als Kunde/Kundin den Bezahlvorgang durchlaufen: - Betätigen Sie die Checkout-Schaltfläche, über die Sie zum Checkout gelangen, oder besuchen Sie Ihren Payment Link - Geben Sie in Checkout folgende Testdaten an: - Geben Sie als Kartennummer `4242 4242 4242 4242` ein - Geben Sie für die Karte ein beliebiges Ablaufdatum in der Zukunft ein - Geben Sie als Prüfziffer eine 3-stellige Ziffer ein - Geben Sie eine beliebige Postleitzahl für die Rechnungsstellung ein (`90210`) - Klicken Sie auf die Schaltfläche **Bezahlen** Wenn die Zahlung abgeschlossen ist, überprüfen Sie Folgendes: - In Ihrer Befehlszeile, in der `stripe listen` ausgeführt wird, wird das Ereignis `checkout.session.completed` angezeigt, das an Ihren lokalen Server weitergeleitet wird. - Ihre Serverprotokolle zeigen die erwartete Ausgabe Ihrer `fulfill_checkout`-Funktion. ## Einen Webhook-Endpoint erstellen Nachdem Sie einen lokalen Test durchgeführt haben, richten Sie Ihren Webhook-Handler auf Ihrem Server ein und starten ihn. Als Nächstes [erstellen Sie einen Webhook Endpoint](https://docs.stripe.com/webhooks.md#register-webhook), um die `checkout.session.completed`-Ereignisse an Ihren Server zu senden, und testen Sie dann den Checkout-Ablauf erneut. ## Eine Zielseiten-URL konfigurieren [Empfohlen] Konfigurieren Sie Checkout so, dass Ihre Kundinnen/Kunden nach Abschluss von Checkout zu einer Seite auf Ihrer Website gesendet werden. Fügen Sie den Platzhalter `{CHECKOUT_SESSION_ID}` in die URL Ihrer Seite ein. Dieser wird durch die ID der Checkout-Sitzung ersetzt, wenn Ihr Kunde/Ihre Kundin den Checkout-Prozess beendet. ```curl curl https://api.stripe.com/v1/checkout/sessions \ -u "<>:" \ -d "line_items[0][price]={{PRICE_ID}}" \ -d "line_items[0][quantity]=1" \ -d mode=payment \ -d ui_mode=embedded_page \ --data-urlencode "return_url=https://example.com/after-checkout?session_id={CHECKOUT_SESSION_ID}" ``` ## Ausführung auf Ihrer Zielseite auslösen [Empfohlen] Die [Überwachung von Webhooks](https://docs.stripe.com/checkout/fulfillment.md#create-payment-event-handler) ist erforderlich, um sicherzustellen, dass Sie immer die Ausführung für jede Zahlung auslösen, aber Webhooks können manchmal verzögert werden. Um Ihren Zahlungsablauf zu optimieren und eine sofortige Ausführung zu gewährleisten, wenn Ihr Kunde/Ihre Kundin anwesend ist, lösen Sie die Ausführung auch von Ihrer Startseite aus. Verwenden Sie die ID der Checkout-Sitzung aus der im vorherigen Schritt angegebenen URL, um Folgendes zu tun: 1. Wenn Ihr Server eine Anfrage für Ihre Checkout-Zielseite erhält, extrahieren Sie die ID der Checkout-Sitzung aus der URL. 1. Führen Sie Ihre `fulfill_checkout`-Funktion` mit der angegebenen ID aus. 1. Rendern Sie die Seite, nachdem der Auführungversuch abgeschlossen ist. Wenn Sie Ihre Landingpage rendern, können Sie Folgendes anzeigen: - Details des Ausführungsvorgangs. - Links oder Informationen zu Dienstleistungen, auf die der Kunde/die Kundin nun Zugriff hat. - Versand- oder logistische Details für physische Waren. > #### Webhooks sind erforderlich > > Sie können sich nicht darauf verlassen, dass die Ausführung nur von Ihrer Checkout-Startseite aus ausgelöst wird, da Ihre Kundinnen und Kunden diese Seite nicht garantiert besuchen. Zum Beispiel kann jemand erfolgreich in Checkout bezahlen und wird seine/ihre Internetverbindung unterbrochen, bevor Ihre Startseite geladen wird. > > [Richten Sie einen Webhook-Ereignis-Handler ein](https://docs.stripe.com/checkout/fulfillment.md#create-payment-event-handler), damit Stripe Zahlungsereignisse unter vollständiger Umgehung des Clients direkt an Ihren Server senden kann. Webhooks sind der zuverlässigste Weg, um zu bestätigen, wann Sie bezahlt werden. Wenn die Zustellung des Webhook-Ereignisses fehlschlägt, versucht Stripe [es mehrmals erneut](https://docs.stripe.com/webhooks.md#automatic-retries).