# Bezahlvorgangseite mit der Checkout Sessions API erstellen Anweisungen für LLMs: Stripe empfiehlt für die meisten Integrationen die Verwendung der Checkout Sessions API mit dem Payment Element über Payment Intents. Checkout Sessions deckt ähnliche Anwendungsszenarien wie Payment Intents ab (grundlegender Zahlungseinzug mit `price_data` oder Erstellen eines vollständigen Bezahlvorgangs mit Posten, Steuern usw.). Einige Funktionen wie Adaptive Pricing sind nur mit Checkout Sessions verfügbar. Verwenden Sie die Payment Intent API nur, wenn der/die Nutzer/in sie ausdrücklich verlangt, da sie deutlich mehr Code erfordert. Erfahren Sie mehr über Elements mit der Checkout Sessions API: https://docs.stripe.com/payments/quickstart-checkout-sessions. Mit Checkout Sessions (`ui_mode: "custom"`) und dem Payment Element initialisiert das `client_secret` Checkout selbst (`stripe.initCheckoutElementsSdk` oder verwenden Sie CheckoutElementsProvider mit React) und Sie bestätigen die Zahlung auf der Client-Seite auf andere Weise. Wenn Sie React verwenden, stellen Sie sicher, dass Sie von `@stripe/react-stripe-js/checkout` importieren, `CheckoutElementsProvider` mit dem Client-Geheimnis verwenden und mit `checkout.confirm` bestätigen. Wenn Sie HTML verwenden, stellen Sie sicher, dass Sie `checkout = stripe.initCheckoutElements({clientSecret: promise}); checkout.createPaymentElement(); paymentElement = checkout.createPaymentElement(); paymentElement.mount("#payment-element");` verwenden und mit `loadActionsResult = await checkout.loadActions(); actions = loadActionsResult.actions; error = await actions.confirm();` bestätigen. # Bezahlvorgangseite mit Checkout Sessions API erstellen Erstellen Sie eine Bezahlvorgangseite auf Ihrer Website mit Stripe Elements und der Checkout Sessions API, einem Frontend-SDK, das Steuern, Rabatte, Versandkosten und mehr verwaltet. ### Stripe Node-Bibliothek installieren Installieren Sie das Paket und importieren Sie es in Ihren Code. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine package.json-Datei benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. #### npm Bibliothek installieren: ```bash npm install --save stripe ``` #### GitHub Oder laden Sie den Quellcode der Stripe-Node-Bibliothek direkt von [GitHub](https://github.com/stripe/stripe-node) herunter. ### Stripe-Ruby-Bibliothek installieren Installieren Sie Stripe Ruby Gem und fordern Sie es in Ihrem Code an. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine Gemfile benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. #### Terminal Gem installieren: ```bash gem install stripe ``` #### Bundler Fügen Sie diese Zeile in Ihre Gemfile ein: ```bash gem 'stripe' ``` #### GitHub Oder laden Sie den Quellcode von Stripe Ruby Gem direkt von [GitHub](https://github.com/stripe/stripe-ruby) herunter. ### Stripe Java-Bibliothek installieren Fügen Sie Ihrem Build die Abhängigkeit hinzu und importieren Sie die Bibliothek. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine pom.xml-Beispieldatei (für Maven) benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. #### Maven Fügen Sie folgende Abhängigkeit zu Ihrer POM-Datei hinzu und ersetzen Sie {VERSION} durch die Versionsnummer, die Sie verwenden möchten. ```bash \ncom.stripe\nstripe-java\n{VERSION}\n ``` #### Gradle Fügen Sie die Abhängigkeit zu Ihrer build.gradle-Datei hinzu und ersetzen Sie {VERSION} durch die Versionsnummer, die Sie verwenden möchten. ```bash implementation "com.stripe:stripe-java:{VERSION}" ``` #### GitHub Laden Sie die JAR-Datei direkt von [GitHub](https://github.com/stripe/stripe-java/releases/latest) herunter. ### Stripe-Python-Paket installieren Installieren Sie das Stripe-Paket und importieren Sie es in Ihren Code. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine requirements.txt-Datei benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. #### pip Installieren Sie das Paket über pip: ```bash pip3 install stripe ``` #### GitHub Laden Sie den Quellcode der Stripe-Python-Bibliothek direkt [von GitHub](https://github.com/stripe/stripe-python) herunter. ### Stripe PHP-Bibliothek installieren Installieren Sie die Bibliothek mit Composer und initialisieren Sie sie mit Ihrem geheimen API-Schlüssel. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine composer.csproj-Datei benötigen, laden Sie die Dateien über den Download-Link im Code-Editor herunter. #### Composer Bibliothek installieren: ```bash composer require stripe/stripe-php ``` #### GitHub Oder laden Sie den Quellcode der Stripe-PHP-Bibliothek direkt von [GitHub](https://github.com/stripe/stripe-php) herunter. ### Server einrichten Fügen Sie Ihrem Build die Abhängigkeit hinzu und importieren Sie die Bibliothek. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine go.mod-Datei benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. #### Go Nutzen Sie für die Initialisierung Go-Module: ```bash go get -u github.com/stripe/stripe-go/v85 ``` #### GitHub Oder laden Sie den Quellcode des Stripe-Go-Moduls direkt von [GitHub](https://github.com/stripe/stripe-go) herunter. ### Stripe.net-Bibliothek installieren Installieren Sie das Paket mit .NET oder NuGet. Wenn Sie aber von Grund auf neu beginnen möchten, laden Sie die Dateien herunter, die eine konfigurierte .csproj-Datei enthalten. #### dotnet Bibliothek installieren: ```bash dotnet add package Stripe.net ``` #### NuGet Bibliothek installieren: ```bash Install-Package Stripe.net ``` #### GitHub Oder laden Sie den Quellcode der Stripe.net-Bibliothek direkt von [GitHub](https://github.com/stripe/stripe-dotnet) herunter. ### Stripe-Bibliotheken installieren Installieren Sie die Pakete und importieren Sie sie in Ihren Code. Wenn Sie dagegen von Grund auf neu beginnen möchten und eine `package.json`-Datei benötigen, laden Sie die Projektdateien über den Download-Link im Code-Editor herunter. Bibliotheken installieren: ```bash npm install --save stripe @stripe/stripe-js next ``` ### Checkout-Sitzung erstellen Fügen Sie auf Ihrem Server einen Endpoint hinzu, der eine *Checkout-Sitzung* (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) erstellt und setzen Sie dabei den Parameter [ui_mode](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-ui_mode) auf `elements`. Die Antwort der Checkout-Sitzung enthält ein [client_secret](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-client_secret), das der Client verwendet, um die Zahlung abzuschließen. Geben Sie das Client-Geheimnis in Ihrer Antwort zurück. ### Rückgabe-URL angeben Um zu definieren, wie Stripe Ihre Kundinnen/Kunden nach der Zahlung weiterleitet, geben Sie beim Erstellen der Checkout-Sitzung die URL der Rückgabeseite im Parameter [return_url](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-return_url) an. Nach dem Zahlungsversuch leitet Stripe Ihre Kundinnen/Kunden auf die auf Ihrer Website gehostete Rückgabeseite weiter. Fügen Sie die Vorlagenvariable `{CHECKOUT_SESSION_ID}` in die URL ein. Checkout ersetzt die Variable durch die Checkout-Sitzungs-ID, bevor Ihr Kunde/Ihre Kundin weitergeleitet wird. Sie erstellen und hosten die Rückgabeseite auf Ihrer Website. ### Ein zu verkaufendes Produkt definieren Definieren Sie die [Produkte und Preise](https://docs.stripe.com/products-prices/manage-prices.md) für Ihre Checkout-Sitzung. In der Regel bedeutet dies die Verwendung einer vordefinierten [Produktpreis-ID](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-line_items-price). Wenn Sie jedoch dynamische Preise festlegen müssen, die nicht im Voraus bekannt sein können, verwenden Sie [price_data](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-line_items-price_data). ### Verschiedene Transaktionen verarbeiten Um verschiedene Transaktionen zu verarbeiten, passen Sie den Parameter [mode](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-mode) an: - Für einmalige Zahlungen verwenden Sie `payment`. - Wenn Sie einen oder mehrere [wiederkehrende Preise](https://docs.stripe.com/payments/subscriptions.md) haben, verwenden Sie `subscription`. - Wenn Sie keine anfängliche Zahlung von einer Kundin/einem Kunden einziehen, aber deren Zahlungsdetails speichern möchten, um [sie später zu belasten](https://docs.stripe.com/payments/checkout/save-and-reuse.md?payment-ui=embedded-components), verwenden Sie `setup`. ### Stripe zu Ihrer React-App hinzufügen Um *PCI-konform* (Any party involved in processing, transmitting, or storing credit card data must comply with the rules specified in the Payment Card Industry (PCI) Data Security Standards. PCI compliance is a shared responsibility and applies to both Stripe and your business) zu bleiben, indem Sie sicherstellen, dass die Zahlungsdaten ohne Umweg über Ihren Server direkt an Stripe gesendet werden, installieren Sie [React Stripe.js](https://docs.stripe.com/sdks/stripejs-react.md). ```bash npm install --save @stripe/react-stripe-js @stripe/stripe-js ``` ### Stripe.js laden Um die Stripe-Bibliothek zu konfigurieren, rufen `loadStripe()` mit Ihrem veröffentlichbaren Stripe-API-Schlüssel auf. ### Stripe.js laden Verwenden Sie *Stripe.js* (Use Stripe.js’ APIs to tokenize customer information, collect sensitive card data, and accept payments with browser payment APIs), um *PCI-konform* (Any party involved in processing, transmitting, or storing credit card data must comply with the rules specified in the Payment Card Industry (PCI) Data Security Standards. PCI compliance is a shared responsibility and applies to both Stripe and your business) zu bleiben, indem Sie Zahlungsdetails ohne Umweg über Ihren Server direkt an Stripe senden. Laden Sie Stripe.js immer aus *js.stripe.com*, um die Konformität einzuhalten. Fügen Sie das Skript nicht in ein Paket ein und hosten Sie es nicht selbst. Sie können Stripe.js laden, indem Sie das Skript in Ihre HTML-Datei einbinden oder [loadStripe](https://github.com/stripe/stripe-js/blob/master/README.md#loadstripe) verwenden. ### Zahlungsformular definieren Um die Kundeninformationen sicher zu erfassen, erstellen Sie den leeren Platzhalter `div`. Stripe fügt einen iFrame in `div` ein. Wenn Sie die E-Mail-Adresse der Kundin bzw. des Kunden erfassen möchten, fügen Sie diesem Formular eine E-Mail-Eingabe hinzu. Sie werden dies in einem späteren Schritt mit [updateEmail](https://docs.stripe.com/js/custom_checkout/update_email) einrichten. ### Stripe.js initialisieren Initialisieren Sie Stripe.js mit Ihrem [veröffentlichbaren API-Schlüssel](https://docs.stripe.com/keys.md#obtain-api-keys). ### Client-Geheimnis der Checkout-Sitzung abrufen Stellen Sie eine Anfrage an Ihren Server, um [eine Checkout-Sitzung zu erstellen](https://docs.stripe.com/api/checkout/sessions/create.md) und das Client-Geheimnis abzurufen. ### Bezahlvorgang initialisieren Verwenden Sie `clientSecret`, um Checkout zu initialisieren und übergeben Sie entweder eine Client-Geheimnis-Zeichenfolge oder ein Promise, das diese auflöst. Das [Checkout](https://docs.stripe.com/js/custom_checkout)-Objekt bildet das Rückgrat Ihrer Checkout-Seite und enthält Daten aus der Checkout-Sitzung sowie Methoden zu deren Aktualisierung. ### Bezahlvorgang initialisieren Rendern Sie den [CheckoutElementsProvider](https://docs.stripe.com/js/react_stripe_js/checkout/checkout_provider) und übergeben Sie `clientSecret` – die Client-Geheimnis-Zeichenfolge oder ein Promise, das das Client-Geheimnis auflöst. ### Status einrichten Initialisieren Sie einige Status, um die Zahlung zu verfolgen, Fehler anzuzeigen und die Nutzeroberfläche zu verwalten. ### Verweis auf Checkout speichern Greifen Sie auf das [Checkout](https://docs.stripe.com/js/custom_checkout)-Objekt in Ihrer Komponente CheckoutForm zu, indem Sie den Hook `useCheckout()` verwenden. Das `Checkout`-Objekt fungiert als Rückgrat Ihrer Bezahlseite und enthält Daten aus der Checkout-Sitzung sowie Methoden zu deren Aktualisierung. ### E-Mail-Adresse der Kundin/des Kunden erfassen Bitte geben Sie beim Abschluss einer Checkout-Sitzung eine gültige E-Mail-Adresse an. Diese Anweisungen erstellen eine E-Mail-Eingabe und verwenden [updateEmail](https://docs.stripe.com/js/custom_checkout/update_email) aus dem Objekt `Checkout`. Alternativ können Sie: - Übergeben Sie die [customer_email](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-customer_email) oder [customer](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-customer) beim Erstellen der Checkout-Sitzung. Stripe überprüft die auf diese Weise angegebenen E-Mail-Adressen. - Geben Sie eine E-Mail-Adresse ein, die Sie bereits bei [checkout.confirm](https://docs.stripe.com/js/custom_checkout/confirm) validiert haben. ### E-Mail-Adresse der Kundin/des Kunden erfassen Bitte geben Sie beim Abschluss einer Checkout-Sitzung eine gültige E-Mail-Adresse an. Diese Anweisungen erstellen eine E-Mail-Eingabe und verwenden [updateEmail](https://docs.stripe.com/js/react_stripe_js/checkout/update_email) aus dem Objekt `Checkout`. Alternativ können Sie: - Übergeben Sie die [customer_email](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-customer_email) oder [customer](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-customer) beim Erstellen der Checkout-Sitzung. Stripe überprüft die auf diese Weise angegebenen E-Mail-Adressen. - Geben Sie eine E-Mail-Adresse ein, die Sie bereits auf [confirm](https://docs.stripe.com/js/react_stripe_js/checkout/confirm) validiert haben. ### Payment Element hinzufügen Fügen Sie das [Payment Element](https://docs.stripe.com/js/custom_checkout/create_payment_element) zu Ihrem Zahlungsformular hinzu. Dabei wird ein iFrame mit einem dynamischen Formular eingebettet, das Zahlungsdaten für eine Vielzahl von Zahlungsmethoden sammelt. Ihre Kundinnen und Kunden wählen einfach die gewünschte Zahlungsart aus und das Formular erfasst automatisch alle notwendigen Zahlungsdetails. ### Payment Element erstellen Erstellen Sie ein [Payment Element](https://docs.stripe.com/js/custom_checkout/create_payment_element) und verbinden Sie es mit dem Platzhalter `
` in Ihrem Zahlungsformular. Dadurch wird ein iFrame mit einem dynamischen Formular integriert, das konfigurierte Zahlungsmethodentypen anzeigt, sodass Ihr Kunde/Ihre Kundin eine Zahlungsmethode auswählen kann. Das Formular erfasst automatisch die zugehörigen Zahlungsdetails für die ausgewählte Zahlungsmethode. ### (Optional) Payment Element anpassen Passen Sie die Nutzeroberfläche des Zahlungsoptionselements an, indem Sie ein [Appearance-Objekt](https://docs.stripe.com/elements/appearance-api.md) erstellen und dieses als Option an den CheckoutElementsProvider übergeben. Verwenden Sie das Farbschema und die Schriftart Ihres Unternehmens, damit es mit dem Rest Ihrer Zahlungsseite übereinstimmt. Verwenden Sie benutzerdefinierte Schriftarten (z. B. aus Google Fonts), indem Sie Checkout mit einem [Schriftartensatz](https://docs.stripe.com/js/react_stripe_js/checkout/checkout_provider#react_checkout_provider-options-elementsOptions-fonts) initialisieren. Vergessen Sie nicht, rechts eine Vorschau anzuzeigen, um Ihre Änderungen live zu sehen. > Teile dieser Vorschau-Demo stimmen möglicherweise nicht mit Ihrer tatsächlichen Checkout-Seite überein. Diese Einstellungen stellen nur eine Teilmenge der Variablen des [Erscheinungsbild-Objekts](https://docs.stripe.com/payments/checkout/customization/appearance.md?payment-ui=embedded-components) dar und das [Erscheinungsbild-Objekt](https://docs.stripe.com/payments/checkout/customization/appearance.md?payment-ui=embedded-components) steuert nur bestimmte Attribute von Stripe-Elementen. Sie sind für die Gestaltung der restlichen Checkout-Seite verantwortlich. ### (Optional) Payment Element anpassen Passen Sie die Nutzeroberfläche von Payment Element an, indem Sie ein [Appearance-Objekt](https://docs.stripe.com/elements/appearance-api.md) erstellen und Checkout damit initialisieren. Verwenden Sie das Farbschema und die Schriftart Ihres Unternehmens, damit es mit dem Rest Ihrer Checkout-Seite übereinstimmt. Verwenden Sie benutzerdefinierte Schriftarten, z. B. aus Google Fonts, indem Sie Checkout mit einem [Font-Set](https://docs.stripe.com/js/custom_checkout/init#custom_checkout_init-options-elementsOptions-fonts) initialisieren. Vergessen Sie nicht, rechts eine Vorschau anzuzeigen, um Ihre Änderungen live zu sehen. > Teile dieser Vorschau-Demo stimmen möglicherweise nicht mit Ihrer tatsächlichen Checkout-Seite überein. Diese Einstellungen stellen nur eine Teilmenge der Variablen des [Erscheinungsbild-Objekts](https://docs.stripe.com/payments/checkout/customization/appearance.md?payment-ui=embedded-components) dar und das [Erscheinungsbild-Objekt](https://docs.stripe.com/payments/checkout/customization/appearance.md?payment-ui=embedded-components) steuert nur bestimmte Attribute von Stripe-Elementen. Sie sind für die Gestaltung der restlichen Checkout-Seite verantwortlich. ### Übermittlungsereignis verarbeiten Überwachen Sie das Übermittlungsereignis des Formulars, um zu wissen, wann die Zahlung über die Stripe-API bestätigt werden kann. ### Zahlung abschließen Rufen Sie [bestätigen](https://docs.stripe.com/js/custom_checkout/confirm) auf, wenn die Kundin/der Kunde bereit ist, den Bezahlvorgang abzuschließen, z. B. nachdem sie/er auf eine Schaltfläche zum Bezahlen geklickt hat. ### Umgang mit Fehlern Wenn unmittelbar [Fehler](https://docs.stripe.com/error-codes.md) auftreten (z. B. die Karte einer Kundin/eines Kunden wird abgelehnt), gibt Stripe.js einen Fehler zurück. Lassen Sie diese Fehlermeldung Ihrer Kundin/Ihrem Kunden anzeigen, damit ein neuer Versuch unternommen werden kann. ### Endpoint erstellen, um eine Checkout-Sitzung abzurufen Fügen Sie einen Endpoint hinzu, um den Status einer Checkout-Sitzung abzurufen. ### Rückgabeseite hinzufügen Um Ihren Kundinnen und Kunden Bestellinformationen anzuzeigen, erstellen Sie eine Rückgabeseite für die URL, die Sie als `return_url` der Checkout-Sitzung angegeben haben. Stripe führt die Weiterleitung zu dieser Seite durch, nachdem der Kunde/die Kundin den Bezahlvorgang abgeschlossen hat. ### Rückgabekomponente hinzufügen Um Ihren Kundinnen und Kunden Bestellinformationen anzuzeigen, fügen Sie eine neue Route und eine Rückgabekomponente für die URL hinzu, die Sie als `return_url` der Checkout-Sitzung angegeben haben. Stripe führt die Weiterleitung zu dieser Seite durch, nachdem der Kunde/die Kundin den Bezahlvorgang abgeschlossen hat. ### Eine Checkout-Sitzung abrufen Sobald Ihre Rückgabeseite geladen ist, stellen Sie sofort eine Anfrage an den Endpoint auf Ihrem Server. Verwenden Sie die Checkout Session-ID in der URL, um den Status der Checkout-Sitzung abzurufen. ### Sitzung verarbeiten Handhaben Sie das Ergebnis der Sitzung anhand des Status: - `complete`: Die Zahlung war erfolgreich. Verwenden Sie die Informationen aus der Checkout-Sitzung, um eine Bestätigungsseite zu rendern. - `open`: Die Zahlung ist fehlgeschlagen oder wurde storniert. Stellen Sie erneut eine Verbindung zu Checkout her, damit Ihre Kundinnen/Kunden es nochmals versuchen können. ### Anwendung ausführen Starten Sie Ihren Server und gehen Sie zu . ### Anwendung ausführen Starten Sie Ihren Server und gehen Sie zu . ### Serveranwendung ausführen Starten Sie Ihren Server. ### Client-Anwendung ausführen Starten Sie Ihre React-App und gehen Sie zu . ```bash npm start ``` ### Jetzt testen Klicken Sie auf die Schaltfläche „Bezahlen“, um die Zahlung abzuschließen, die Sie auf die angegebene Rückgabeseite weiterleitet. Wenn Sie die Rückgabeseite und die Zahlung in der Liste der [erfolgreichen Zahlungen](https://dashboard.stripe.com/test/payments?status%5B0%5D=successful) im Dashboard sehen, funktioniert Ihre Integration erfolgreich. Verwenden Sie eine der folgenden Testkarten, um eine Zahlung zu simulieren: | Scenario | Card Number | | ----------------------------------- | ---------------- | | Payment succeeds | 4242424242424242 | | Payment requires 3DS authentication | 4000002500003155 | | Payment is declined | 4000000000009995 | Weitere Informationen finden Sie unter [Testen](https://docs.stripe.com/testing.md). ## Herzlichen Glückwunsch! Ihre grundlegende Checkout Integration funktioniert. Erfahren Sie nun, wie Sie das Erscheinungsbild Ihrer Checkout-Seite anpassen, den Steuereinzug automatisieren und Währungen lokal anpassen können. ### Checkout-Seite anpassen Passen Sie Ihren Bezahlvorgang an, indem Sie [Checkout-Sitzungen](https://docs.stripe.com/api/checkout/sessions/create.md) verwenden, um zusätzliche Funktionen wie das Erfassen von Adressen und das Vorausfüllen von Kundendaten zu aktivieren. ### Kundendaten vorab angeben Verwenden Sie [customer_email](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-customer_email), um die E-Mail-Adresse des Kunden/der Kundin vorab auszufüllen. Sie können auch eine [Kunden](https://docs.stripe.com/api/customers.md)-ID an das Feld „customer“ übergeben, um das Feld „email address“ mit der für den Kunden/die Kundin gespeicherten E-Mail vorab auszufüllen. In diesem Fall können Sie „updateEmail“ nicht verwenden. Deaktivieren oder entfernen Sie also die Frontend-E-Mail-Eingabe. Wenn Sie Kunden/Kundinnen mit Accounts v2 modellieren, können Sie auch eine Konto-ID an das Feld [customer_account](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-customer_account) übergeben, um die zugehörige E-Mail-Adresse vorab auszufüllen. Erfahren Sie mehr über den [Unterschied zwischen der Verwendung von v1 Customers und v2 Accounts](https://docs.stripe.com/connect/use-accounts-as-customers.md). ### Rechnungs- und Versanddetails anfordern Verwenden Sie [billing_address_collection](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-billing_address_collection) und [shipping_address_collection](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-shipping_address_collection), um die Adresse Ihrer Kundin/Ihres Kunden anzufordern. [shipping_address_collection](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-shipping_address_collection) erfordert eine Liste von `allowed_countries`, die Checkout in einem Dropdown-Menü auf der Seite anzeigt. ### Angaben zur Abrechnung und zum Versand erfassen Verwenden Sie das Address Element, um die Adresse Ihrer Kundin/Ihres Kunden zu erfassen. ### Steuereinzug automatisieren Berechnen und erheben Sie den richtigen Steuerbetrag für Ihre Stripe-Transaktionen. Erfahren Sie mehr über [Stripe Tax](https://docs.stripe.com/tax.md) und [Stripe Tax zu Checkout hinzugefügt wird](https://docs.stripe.com/tax/checkout.md). ### Richten Sie Stripe Tax im Dashboard ein [Aktivieren Sie Stripe Tax](https://dashboard.stripe.com/settings/tax/activate), um Ihre Steuerverpflichtungen zu überwachen, Steuern automatisch einzuziehen und auf die Berichte zuzugreifen, die Sie zum Einreichen von Steuererklärungen benötigen. ### Parameter für den automatischen Steuereinzug hinzufügen Setzen Sie den Parameter `automatic_tax` auf `enabled: true`. ### Abrechnungdaten erfassen Verwenden Sie das Address Element, um die Adresse Ihrer Kundin/Ihres Kunden zu erfassen. ### Währungen lokal anpassen Mit Adaptive Pricing können Ihre Kundinnen und Kunden in mehr als 150 Ländern in ihrer Landeswährung bezahlen. ### Adaptive Pricing aktivieren [Aktivieren Sie Adaptive Pricing](https://dashboard.stripe.com/settings/adaptive-pricing) in Ihren Dashboard-Einstellungen. ### Preise lokalisieren und formatieren Lokalisierte und formatierte Beträge aus dem [Sitzungsobjekt](https://docs.stripe.com/js/custom_checkout/session_object) anzeigen. ### Preise lokalisieren und formatieren Zeigen Sie lokalisierte und formatierte Beträge über den Hook [useCheckout](https://docs.stripe.com/js/react_stripe_js/checkout/use_checkout) an. ### Währungsauswahlelement rendern Integrieren Sie das Währungs-Auswahlelement, um Ihren Kunden/Kundinnen eine Auswahl an Währungen zu geben und den Wechselkurs offenzulegen. ### Markieren Sie Ihre Integration als bereit für Adaptive Pricing Legen Sie den Parameter `adaptivePricing.allowed` auf `true` fest. // This test secret API key is a placeholder. Don't include personal details in requests with this key. // To see your test secret API key embedded in code samples, sign in to your Stripe account. // You can also find your test secret API key at https://dashboard.stripe.com/test/apikeys. const stripe = require("stripe")("<>"); const YOUR_DOMAIN = "http://localhost:4242"; const YOUR_DOMAIN = "http://localhost:3000"; const session = await stripe.checkout.sessions.create({ ui_mode: "elements", customer_email: "customer@example.com", billing_address_collection: "auto", shipping_address_collection: { allowed_countries: ["US", "CA"], }, line_items: [ { // Provide the exact Price ID (for example, price_1234) of the product you want to sell price: "{{PRICE_ID}}", quantity: 1, }, ], line_items: [{ price_data: { product_data: { name: "{{PRICE_DATA_NAME}}", }, currency: "{{PRICE_DATA_CURRENCY}}", unit_amount: {{PRICE_DATA_UNIT_AMOUNT}}, }, quantity: 1, }], line_items: [{ price_data: { product_data: { name: "{{PRICE_DATA_NAME}}", }, currency: "{{PRICE_DATA_CURRENCY}}", unit_amount: {{PRICE_DATA_UNIT_AMOUNT}}, recurring: { interval: "{{PRICE_DATA_INTERVAL}}", interval_count: {{PRICE_DATA_INTERVAL_COUNT}}, }, }, quantity: 1, }], mode: {{CHECKOUT_MODE}}, return_url: `${YOUR_DOMAIN}/complete?session_id={CHECKOUT_SESSION_ID}`, return_url: `${YOUR_DOMAIN}/complete.html?session_id={CHECKOUT_SESSION_ID}`, automatic_tax: {enabled: true}, }); res.send({ clientSecret: session.client_secret }); app.get("/session-status", async (req, res) => { const session = await stripe.checkout.sessions.retrieve(req.query.session_id, {expand: ["payment_intent"]}); res.send({ status: session.status, payment_status: session.payment_status, payment_intent_id: session.payment_intent.id, payment_intent_status: session.payment_intent.status }); }); { "name": "stripe-sample", "version": "1.0.0", "description": "A sample Stripe implementation", "main": "server.js", "scripts": { "start": "node server.js" }, "author": "stripe-samples", "license": "ISC", "dependencies": { "express": "^4.17.1", "stripe": "^21.0.1" } } { "name": "stripe-sample", "version": "0.1.0", "dependencies": { "@stripe/react-stripe-js": "^3.7.0", "@stripe/stripe-js": "^7.3.0", "express": "^4.17.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "^3.4.0", "stripe": "21.0.1" }, "devDependencies": { "concurrently": "4.1.2" }, "homepage": "http://localhost:3000/checkout", "proxy": "http://localhost:4242", "scripts": { "start-client": "react-scripts start", "start-server": "node server.js", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject", "start": "concurrently \"yarn start-client\" \"yarn start-server\"" }, "eslintConfig": { "extends": "react-app" }, "browserslist": { "production": [ ">0.2%", "not dead", "not op_mini all" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ] } } \# This test secret API key is a placeholder. Don't include personal details in requests with this key. # To see your test secret API key embedded in code samples, sign in to your Stripe account. # You can also find your test secret API key at https://dashboard.stripe.com/test/apikeys. Stripe.api_key = '<>' Stripe.api_version = '2026-03-25.dahlia' YOUR_DOMAIN = 'http://localhost:4242' YOUR_DOMAIN = 'http://localhost:3000' session = Stripe::Checkout::Session.create({ ui_mode: 'elements', customer_email: 'customer@example.com', billing_address_collection: 'required', shipping_address_collection: { allowed_countries: ['US', 'CA'], }, line_items: [{ \# Provide the exact Price ID (for example, price_1234) of the product you want to sell price: '{{PRICE_ID}}', quantity: 1, }], line_items: [{ price_data: { product_data: { name: '{{PRICE_DATA_NAME}}', }, currency: '{{PRICE_DATA_CURRENCY}}', unit_amount: {{PRICE_DATA_UNIT_AMOUNT}}, }, quantity: 1, }], line_items: [{ price_data: { product_data: { name: '{{PRICE_DATA_NAME}}', }, currency: '{{PRICE_DATA_CURRENCY}}', unit_amount: {{PRICE_DATA_UNIT_AMOUNT}}, recurring: { interval: '{{PRICE_DATA_INTERVAL}}', interval_count: {{PRICE_DATA_INTERVAL_COUNT}}, }, }, quantity: 1, }], mode: {{CHECKOUT_MODE}}, return_url: YOUR_DOMAIN + '/complete.html?session_id={CHECKOUT_SESSION_ID}', return_url: YOUR_DOMAIN + '/complete?session_id={CHECKOUT_SESSION_ID}', automatic_tax: {enabled: true}, }) { clientSecret: session.client_secret }.to_json get '/session-status' do session = Stripe::Checkout::Session.retrieve({id: params[:session_id], expand: ["payment_intent"]}) { status: session.status, payment_status: session.payment_status, payment_intent_id: session.payment_intent.id, payment_intent_status: session.payment_intent.status }.to_json end import stripe \# This test secret API key is a placeholder. Don't include personal details in requests with this key. # To see your test secret API key embedded in code samples, sign in to your Stripe account. # You can also find your test secret API key at https://dashboard.stripe.com/test/apikeys. stripe.api_key = '<>' stripe.api_version = '2026-03-25.dahlia' YOUR_DOMAIN = 'http://localhost:4242' YOUR_DOMAIN = 'http://localhost:3000' session = stripe.checkout.Session.create( ui_mode = 'elements', customer_email='customer@example.com', billing_address_collection='auto', shipping_address_collection={ 'allowed_countries': ['US', 'CA'], }, line_items=[ { \# Provide the exact Price ID (for example, price_1234) of the product you want to sell 'price': '{{PRICE_ID}}', 'quantity': 1, }, ], line_items=[ { 'price_data': { 'product_data': { 'name': '{{PRICE_DATA_NAME}}', }, 'currency': '{{PRICE_DATA_CURRENCY}}', 'unit_amount': {{PRICE_DATA_UNIT_AMOUNT}}, }, 'quantity': 1, }, ], line_items=[ { 'price_data': { 'product_data': { 'name': '{{PRICE_DATA_NAME}}', }, 'currency': '{{PRICE_DATA_CURRENCY}}', 'unit_amount': {{PRICE_DATA_UNIT_AMOUNT}}, 'recurring': { 'interval': '{{PRICE_DATA_INTERVAL}}', 'interval_count': {{PRICE_DATA_INTERVAL_COUNT}}, }, }, 'quantity': 1, }, ], mode={{CHECKOUT_MODE}}, return_url=YOUR_DOMAIN + '/complete.html?session_id={CHECKOUT_SESSION_ID}', return_url=YOUR_DOMAIN + '/complete?session_id={CHECKOUT_SESSION_ID}', automatic_tax={'enabled': True}, ) return jsonify(clientSecret=session.client_secret) @app.route('/session-status', methods=['GET']) def session_status(): session = stripe.checkout.Session.retrieve(request.args.get('session_id'), expand=["payment_intent"]) return jsonify(status=session.status, payment_status=session.payment_status, payment_intent_id=session.payment_intent.id, payment_intent_status=session.payment_intent.status) certifi==2026.1.4 chardet==5.2.0 click==8.3.1 Flask==3.1.2 idna==3.11 itsdangerous==2.2.0 Jinja2==3.1.6 MarkupSafe==3.0.3 requests==2.32.5 stripe==15.0.0 toml==0.10.2 Werkzeug==3.1.5 $stripe = new \Stripe\StripeClient([ "api_key" => $stripeSecretKey, "stripe_version" => "2026-03-25.dahlia" ]); $YOUR_DOMAIN = 'http://localhost:4242'; $YOUR_DOMAIN = 'http://localhost:3000'; $checkout_session = $stripe->checkout->sessions->create([ 'ui_mode' => 'elements', 'customer_email' => 'customer@example.com', 'billing_address_collection' => 'required', 'shipping_address_collection' => [ 'allowed_countries' => ['US', 'CA'], ], 'line_items' => [[ \# Provide the exact Price ID (for example, price_1234) of the product you want to sell 'price' => '{{PRICE_ID}}', 'quantity' => 1, ]], 'line_items' => [[ 'price_data' => [ 'product_data' => [ 'name' => '{{PRICE_DATA_NAME}}', ], 'currency' => '{{PRICE_DATA_CURRENCY}}', 'unit_amount' => {{PRICE_DATA_UNIT_AMOUNT}}, ], 'quantity' => 1, ]], 'line_items' => [[ 'price_data' => [ 'product_data' => [ 'name' => '{{PRICE_DATA_NAME}}', ], 'currency' => '{{PRICE_DATA_CURRENCY}}', 'unit_amount' => {{PRICE_DATA_UNIT_AMOUNT}}, 'recurring' => [ 'interval' => '{{PRICE_DATA_INTERVAL}}', 'interval_count' => {{PRICE_DATA_INTERVAL_COUNT}}, ], ], 'quantity' => 1, ]], 'mode' => {{CHECKOUT_MODE}}, 'return_url' => $YOUR_DOMAIN . '/complete.html?session_id={CHECKOUT_SESSION_ID}', 'return_url' => $YOUR_DOMAIN . '/complete?session_id={CHECKOUT_SESSION_ID}', 'automatic_tax' => [ 'enabled' => true, ], ]); echo json_encode(array('clientSecret' => $checkout_session->client_secret)); try { // retrieve JSON from POST body $jsonStr = file_get_contents('php://input'); $jsonObj = json_decode($jsonStr); $session = $stripe->checkout->sessions->retrieve($jsonObj->session_id, ['expand' => ['payment_intent']]); echo json_encode(['status' => $session->status, 'payment_status' => $session->payment_status, 'payment_intent_id' => $session->payment_intent->id, 'payment_intent_status' => $session->payment_intent->status]); http_response_code(200); } catch (Error $e) { http_response_code(500); echo json_encode(['error' => $e->getMessage()]); } $stripeSecretKey = '<>'; // This test secret API key is a placeholder. Don't include personal details in requests with this key. // To see your test secret API key embedded in code samples, sign in to your Stripe account. // You can also find your test secret API key at https://dashboard.stripe.com/test/apikeys. services.AddSingleton(new StripeClient("<>")); var domain = "http://localhost:4242"; var domain = "http://localhost:3000"; UiMode = "elements", CustomerEmail = "customer@example.com", BillingAddressCollection = "auto", ShippingAddressCollection = new SessionShippingAddressCollectionOptions { AllowedCountries = new List { "US", "CA", }, }, LineItems = new List { new SessionLineItemOptions { // Provide the exact Price ID (for example, price_1234) of the product you want to sell Price = "{{PRICE_ID}}", Quantity = 1, }, }, LineItems = new List { new SessionLineItemOptions { PriceData = new SessionLineItemPriceDataOptions { ProductData = new SessionLineItemPriceDataProductDataOptions { Name = "{{PRICE_DATA_NAME}}", }, Currency = "{{PRICE_DATA_CURRENCY}}", UnitAmount = {{PRICE_DATA_UNIT_AMOUNT}}, }, Quantity = 1, }, }, LineItems = new List { new SessionLineItemOptions { PriceData = new SessionLineItemPriceDataOptions { ProductData = new SessionLineItemPriceDataProductDataOptions { Name = "{{PRICE_DATA_NAME}}", }, Currency = "{{PRICE_DATA_CURRENCY}}", UnitAmount = {{PRICE_DATA_UNIT_AMOUNT}}, Recurring = new SessionLineItemPriceDataRecurringOptions { Interval = "{{PRICE_DATA_INTERVAL}}", IntervalCount = {{PRICE_DATA_INTERVAL_COUNT}}, }, }, Quantity = 1, }, }, Mode = {{CHECKOUT_MODE}}, ReturnUrl = domain + "/complete.html?session_id={CHECKOUT_SESSION_ID}", ReturnUrl = domain + "/complete?session_id={CHECKOUT_SESSION_ID}", AutomaticTax = new SessionAutomaticTaxOptions { Enabled = true }, Session session = _client.V1.Checkout.Sessions.Create(options); return Json(new {clientSecret = session.ClientSecret}); [Route("session-status")] [ApiController] public class SessionStatusController : Controller { private readonly StripeClient _client; public SessionStatusController(StripeClient client) { _client = client; } [HttpGet] public ActionResult SessionStatus([FromQuery] string session_id) { var options = new SessionGetOptions(); options.AddExpand("payment_intent"); Session session = _client.V1.Checkout.Sessions.Get(session_id, options); return Json(new {status = session.Status, payment_status = session.PaymentStatus, payment_intent_id = session.PaymentIntent.Id, payment_intent_status = session.PaymentIntent.Status}); } } "github.com/stripe/stripe-go/v85" sc := stripe.NewClient("<>") domain := "http://localhost:4242" domain := "http://localhost:3000" params := &stripe.CheckoutSessionCreateParams{ UIMode: stripe.String("elements"), ReturnURL: stripe.String(domain + "/complete.html?session_id={CHECKOUT_SESSION_ID}"), ReturnURL: stripe.String(domain + "/complete?session_id={CHECKOUT_SESSION_ID}"), CustomerEmail: stripe.String("customer@example.com"), BillingAddressCollection: stripe.String("auto"), ShippingAddressCollection: &stripe.CheckoutSessionCreateShippingAddressCollectionParams{ AllowedCountries: stripe.StringSlice([]string{ "US", "CA", }), }, LineItems: []*stripe.CheckoutSessionCreateLineItemParams{ { // Provide the exact Price ID (for example, price_1234) of the product you want to sell Price: stripe.String("{{PRICE_ID}}"), Quantity: stripe.Int64(1), }, }, LineItems: []*stripe.CheckoutSessionCreateLineItemParams{ { PriceData: &stripe.CheckoutSessionCreateLineItemPriceDataParams{ ProductData: &stripe.CheckoutSessionCreateLineItemPriceDataProductDataParams{ Name: stripe.String("{{PRICE_DATA_NAME}}"), }, Currency: stripe.String("{{PRICE_DATA_CURRENCY}}"), UnitAmount: stripe.Int64({{PRICE_DATA_UNIT_AMOUNT}}), }, Quantity: stripe.Int64(1), }, }, LineItems: []*stripe.CheckoutSessionCreateLineItemParams{ { PriceData: &stripe.CheckoutSessionCreateLineItemPriceDataParams{ ProductData: &stripe.CheckoutSessionCreateLineItemPriceDataProductDataParams{ Name: stripe.String("{{PRICE_DATA_NAME}}"), }, Currency: stripe.String("{{PRICE_DATA_CURRENCY}}"), UnitAmount: stripe.Int64({{PRICE_DATA_UNIT_AMOUNT}}), Recurring: &stripe.CheckoutSessionCreateLineItemPriceDataRecurringParams{ Interval: stripe.String("{{PRICE_DATA_INTERVAL}}"), IntervalCount: stripe.Int64({{PRICE_DATA_INTERVAL_COUNT}}), }, }, Quantity: stripe.Int64(1), }, }, Mode: {{CHECKOUT_MODE}}, AutomaticTax: &stripe.CheckoutSessionCreateAutomaticTaxParams{Enabled: stripe.Bool(true)}, } s, err := sc.V1CheckoutSessions.Create(context.TODO(), params) if err != nil { log.Printf("sc.V1CheckoutSessions.Create: %v", err) } writeJSON(w, struct { ClientSecret string `json:"clientSecret"` }{ ClientSecret: s.ClientSecret, }) func retrieveCheckoutSession(sc *stripe.Client, w http.ResponseWriter, r *http.Request) { params := &stripe.CheckoutSessionRetrieveParams{} params.AddExpand("payment_intent") s, _ := sc.V1CheckoutSessions.Retrieve(context.TODO(), r.URL.Query().Get("session_id"), params) writeJSON(w, struct { Status string `json:"status"` PaymentStatus string `json:"payment_status"` PaymentIntentId string `json:"payment_intent_id"` PaymentIntentStatus string `json:"payment_intent_status"` }{ Status: string(s.Status), PaymentStatus: string(s.PaymentStatus), PaymentIntentId: string(s.PaymentIntent.ID), PaymentIntentStatus: string(s.PaymentIntent.Status), }) } require github.com/stripe/stripe-go/v85 v85.0.0 // This test secret API key is a placeholder. Don't include personal details in requests with this key. // To see your test secret API key embedded in code samples, sign in to your Stripe account. // You can also find your test secret API key at https://dashboard.stripe.com/test/apikeys. Stripe.apiKey = "<>"; String YOUR_DOMAIN = "http://localhost:4242"; String YOUR_DOMAIN = "http://localhost:3000"; SessionCreateParams params = SessionCreateParams.builder() .setUiMode(SessionCreateParams.UiMode.ELEMENTS) .setCustomerEmail("customer@example.com") .setBillingAddressCollection(SessionCreateParams.BillingAddressCollection.REQUIRED) .setShippingAddressCollection( SessionCreateParams.ShippingAddressCollection.builder() .addAllowedCountry(SessionCreateParams.ShippingAddressCollection.AllowedCountry.CA) .addAllowedCountry(SessionCreateParams.ShippingAddressCollection.AllowedCountry.US) .build()) .setMode({{CHECKOUT_MODE}}) .setReturnUrl(YOUR_DOMAIN + "/complete?session_id={CHECKOUT_SESSION_ID}") .setReturnUrl(YOUR_DOMAIN + "/complete.html?session_id={CHECKOUT_SESSION_ID}") .setAutomaticTax( SessionCreateParams.AutomaticTax.builder() .setEnabled(true) .build()) .addLineItem( SessionCreateParams.LineItem.builder() .setQuantity(1L) // Provide the exact Price ID (for example, price_1234) of the product you want to sell .setPrice("{{PRICE_ID}}") .build()) .addLineItem( SessionCreateParams.LineItem.builder() .setQuantity(1L) .setPriceData( SessionCreateParams.LineItem.PriceData.builder() .setProductData( SessionCreateParams.LineItem.PriceData.ProductData.builder() .setName("{{PRICE_DATA_NAME}}") .build()) .setCurrency("{{PRICE_DATA_CURRENCY}}") .setUnitAmount({{PRICE_DATA_UNIT_AMOUNT}}L) .build()) .build()) .addLineItem( SessionCreateParams.LineItem.builder() .setQuantity(1L) .setPriceData( SessionCreateParams.LineItem.PriceData.builder() .setProductData( SessionCreateParams.LineItem.PriceData.ProductData.builder() .setName("{{PRICE_DATA_NAME}}") .build()) .setCurrency("{{PRICE_DATA_CURRENCY}}") .setUnitAmount({{PRICE_DATA_UNIT_AMOUNT}}L) .setRecurring( SessionCreateParams.LineItem.PriceData.Recurring.builder() .setInterval(SessionCreateParams.LineItem.PriceData.Recurring.Interval.{{PRICE_DATA_INTERVAL}}) .setIntervalCount({{PRICE_DATA_INTERVAL_COUNT}}L) .build()) .build()) .build()) .build(); Map map = new HashMap(); map.put("clientSecret", session.getRawJsonObject().getAsJsonPrimitive("client_secret").getAsString()); return map; get("/session-status", (request, response) -> { RequestOptions options = RequestOptions.builder().build(); SessionRetrieveParams params = SessionRetrieveParams.builder().addExpand("payment_intent").build(); Session session = Session.retrieve(request.queryParams("session_id"), params, options); Map map = new HashMap(); map.put("status", session.getRawJsonObject().getAsJsonPrimitive("status").getAsString()); map.put("payment_status", session.getRawJsonObject().getAsJsonPrimitive("payment_status").getAsString()); map.put("payment_intent_id", session.getRawJsonObject().getAsJsonObject("payment_intent").getAsJsonPrimitive("id").getAsString()); map.put("payment_intent_status", session.getRawJsonObject().getAsJsonObject("payment_intent").getAsJsonPrimitive("status").getAsString()); return map; }, gson::toJson);

Billing Address

Billing Address

Shipping Address

Payment

const stripe = Stripe("<>"); const emailInput = document.getElementById("email"); const emailErrors = document.getElementById("email-errors"); const validateEmail = async (email) => { const updateResult = await actions.updateEmail(email); const isValid = updateResult.type !== "error"; return { isValid, message: !isValid ? updateResult.error.message : null }; }; const promise = fetch("/create-checkout-session", { method: "POST", headers: { "Content-Type": "application/json" }, }) .then((r) => r.json()) .then((r) => r.clientSecret); const promise = fetch('/create.php', { method: 'POST', headers: {'Content-Type': 'application/json'}, }) .then((r) => r.json()) .then((r) => r.clientSecret); const appearance = { {{APPEARANCE}} }; checkout = stripe.initCheckoutElementsSdk({ clientSecret: promise, elementsOptions: { appearance }, adaptivePricing: { allowed: true }, }); checkout.on('change', (session) => { // Handle changes to the checkout session document.getElementById('submit').disabled = !session.canConfirm; document.querySelector("#button-text").textContent = `Pay ${ session.total.total.amount } now`; }); emailInput.addEventListener("input", () => { // Clear any validation errors emailErrors.textContent = ""; emailInput.classList.remove("error"); }); emailInput.addEventListener("blur", async () => { const newEmail = emailInput.value; if (!newEmail) { return; } const { isValid, message } = await validateEmail(newEmail); if (!isValid) { emailInput.classList.add("error"); emailErrors.textContent = message; } }); const paymentElement = checkout.createPaymentElement(); paymentElement.mount("#payment-element"); const billingAddressElement = checkout.createBillingAddressElement(); billingAddressElement.mount("#billing-address-element"); const billingAddressElement = checkout.createBillingAddressElement(); billingAddressElement.mount("#billing-address-element"); const shippingAddressElement = checkout.createShippingAddressElement(); shippingAddressElement.mount("#shipping-address-element"); const currencySelectorElement = checkout.createCurrencySelectorElement(); currencySelectorElement.mount("#currency-selector-element"); async function handleSubmit(e) { e.preventDefault(); setLoading(true); const email = document.getElementById("email").value; const { isValid, message } = await validateEmail(email); if (!isValid) { emailInput.classList.add("error"); emailErrors.textContent = message; showMessage(message); setLoading(false); return; } const { error } = await actions.confirm(); // This point will only be reached if there is an immediate error when // confirming the payment. Otherwise, your customer will be redirected to // your `return_url`. For some payment methods like iDEAL, your customer will // be redirected to an intermediate site first to authorize the payment, then // redirected to the `return_url`. showMessage(error.message); setLoading(false); } const queryString = window.location.search; const urlParams = new URLSearchParams(queryString); const sessionId = urlParams.get("session_id"); if (!sessionId) { console.log("No session ID found"); setErrorState(); return; } const response = await fetch(`/session-status?session_id=${sessionId}`); const response = await fetch("/status.php", { headers: { Accept: "application/json", "Content-Type": "application/json", }, method: "POST", body: JSON.stringify({ session_id: sessionId }), }); const session = await response.json(); setSessionDetails(session); { "name": "stripe-sample", "version": "0.1.0", "dependencies": { "@stripe/react-stripe-js": "^6.0.0", "@stripe/stripe-js": "^9.0.0", "express": "^4.17.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "^5.0.1", "react-router-dom": "^6.16.0", "stripe": "^8.202.0" }, "devDependencies": { "concurrently": "4.1.2" }, "homepage": "http://localhost:3000/checkout", "proxy": "http://localhost:4242", "scripts": { "start-client": "react-scripts start", "start-server": "node server.js", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject", "start": "concurrently \"yarn start-client\" \"yarn start-server\"" }, "eslintConfig": { "extends": "react-app" }, "browserslist": { "production": [ ">0.2%", "not dead", "not op_mini all" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ] } } { "name": "client", "version": "0.1.0", "private": true, "dependencies": { "@stripe/react-stripe-js": "^6.0.0", "@stripe/stripe-js": "^9.0.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "^5.0.1", "react-router-dom": "^6.16.0" }, "homepage": "http://localhost:3000/checkout", "proxy": "http://127.0.0.1:4242", "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" }, "eslintConfig": { "extends": "react-app" }, "browserslist": { "production": [ ">0.2%", "not dead", "not op_mini all" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ] } } import React, { useMemo } from "react"; import {loadStripe} from '@stripe/stripe-js'; import { CheckoutElementsProvider } from '@stripe/react-stripe-js/checkout'; // Make sure to call `loadStripe` outside of a component’s render to avoid // recreating the `Stripe` object on every render. // This is a public sample test API key. // Don’t submit any personally identifiable information in requests made with this key. // Sign in to see your own test publishable API key embedded in code samples. const stripePromise = loadStripe("<>"); const clientSecret = useMemo(() => { return fetch('/create-checkout-session', { method: 'POST', }) .then((res) => res.json()) .then((data) => data.clientSecret); }, []); const clientSecret = useMemo(() => { return fetch('/create.php', { method: 'POST', }) .then((res) => res.json()) .then((data) => data.clientSecret); }, []); const appearance = { {{APPEARANCE}} }; } /> } /> BillingAddressElement, BillingAddressElement, ShippingAddressElement, CurrencySelectorElement, const validateEmail = async (email, checkout) => { const updateResult = await checkout.updateEmail(email); const isValid = updateResult.type !== "error"; return { isValid, message: !isValid ? updateResult.error.message : null }; } const EmailInput = ({ checkout, email, setEmail, error, setError }) => { const handleBlur = async () => { if (!email) { return; } const { isValid, message } = await validateEmail(email, checkout); if (!isValid) { setError(message); } }; const handleChange = (e) => { setError(null); setEmail(e.target.value); }; return ( <> {error &&
{error}
} ); }; const [email, setEmail] = useState(''); const [emailError, setEmailError] = useState(null); const [message, setMessage] = useState(null); const [isSubmitting, setIsSubmitting] = useState(false); const checkoutState = useCheckout(); if (checkoutState.type === 'loading') { return (
Loading...
); } if (checkoutState.type === 'error') { return (
Error: {checkoutState.error.message}
); } const handleSubmit = async (e) => { e.preventDefault(); const {checkout} = checkoutState; setIsSubmitting(true); const { isValid, message } = await validateEmail(email, checkout); if (!isValid) { setEmailError(message); setMessage(message); setIsSubmitting(false); return; } const confirmResult = await checkout.confirm(); // This point will only be reached if there is an immediate error when // confirming the payment. Otherwise, your customer will be redirected to // your `return_url`. For some payment methods like iDEAL, your customer will // be redirected to an intermediate site first to authorize the payment, then // redirected to the `return_url`. if (confirmResult.type === 'error') { setMessage(confirmResult.error.message); } setIsSubmitting(false); };

Billing Address

Billing Address

Shipping Address

`Pay ${checkoutState.checkout.total.total.amount} now` const [status, setStatus] = useState(null); const [paymentIntentId, setPaymentIntentId] = useState(''); const [paymentStatus, setPaymentStatus] = useState(''); const [paymentIntentStatus, setPaymentIntentStatus] = useState(''); const [iconColor, setIconColor] = useState(''); const [icon, setIcon] = useState(''); const [text, setText] = useState(''); useEffect(() => { const SuccessIcon = ; const ErrorIcon = ; const queryString = window.location.search; const urlParams = new URLSearchParams(queryString); const sessionId = urlParams.get('session_id'); fetch("/status.php", { headers: { Accept: "application/json", "Content-Type": "application/json", }, method: "POST", body: JSON.stringify({ session_id: sessionId }), }) fetch(`/session-status?session_id=${sessionId}`) .then((res) => res.json()) .then((data) => { setStatus(data.status); setPaymentIntentId(data.payment_intent_id); setPaymentStatus(data.payment_status); setPaymentIntentStatus(data.payment_intent_status); if (data.status === 'complete') { setIconColor('#30B130'); setIcon(SuccessIcon); setText('Payment succeeded'); } else { setIconColor('#DF1B41'); setIcon(ErrorIcon); setText('Something went wrong, please try again.'); } }); }, []); return (
{icon}

{text}

Payment Intent ID {paymentIntentId}
Status {status}
Payment Status {paymentStatus}
Payment Intent Status {paymentIntentStatus}
View details Test another payment
) \## Set Price ID In the back end code, replace `{{PRICE_ID}}` with a Price ID (`price_xxx`) that you created. 1. Build the server ~~~ pip3 install -r requirements.txt ~~~ 1. Build the server ~~~ bundle install ~~~ 1. Build the server ~~~ composer install ~~~ 1. Build the server ~~~ dotnet restore ~~~ 1. Build the server ~~~ mvn package ~~~ 2. Run the server ~~~ export FLASK_APP=server.py python3 -m flask run --port=4242 ~~~ 2. Run the server ~~~ ruby server.rb -o 0.0.0.0 ~~~ 2. Run the server ~~~ php -S 127.0.0.1:4242 --docroot=public ~~~ 2. Run the server ~~~ dotnet run ~~~ 2. Run the server ~~~ java -cp target/sample-jar-with-dependencies.jar com.stripe.sample.Server ~~~ 3. Build the client app ~~~ npm install ~~~ 4. Run the client app ~~~ npm start ~~~ 5. Go to [http://localhost:3000/checkout](http://localhost:3000/checkout) 3. Go to [http://localhost:4242/checkout.html](http://localhost:4242/checkout.html) 3. Build the client app ~~~ npm install ~~~ 4. Run the client app ~~~ npm start ~~~ 5. Go to [http://localhost:3000/checkout](http://localhost:3000/checkout) 3. Go to [http://localhost:4242/checkout.html](http://localhost:4242/checkout.html) 3. Build the client app ~~~ npm install ~~~ 4. Run the client app ~~~ npm start ~~~ 5. Go to [http://localhost:3000/checkout](http://localhost:3000/checkout) 3. Go to [http://localhost:4242/checkout.html](http://localhost:4242/checkout.html) 3. Build the client app ~~~ npm install ~~~ 4. Run the client app ~~~ npm start ~~~ 5. Go to [http://localhost:3000/checkout](http://localhost:3000/checkout) 3. Go to [http://localhost:4242/checkout.html](http://localhost:4242/checkout.html) 3. Build the client app ~~~ npm install ~~~ 4. Run the client app ~~~ npm start ~~~ 5. Go to [http://localhost:3000/checkout](http://localhost:3000/checkout) 3. Go to [http://localhost:4242/checkout.html](http://localhost:4242/checkout.html) 1. Run the server ~~~ go run server.go ~~~ 2. Build the client app ~~~ npm install ~~~ 3. Run the client app ~~~ npm start ~~~ 4. Go to [http://localhost:3000/checkout](http://localhost:3000/checkout) 1. Run the server ~~~ go run server.go ~~~ 2. Go to [http://localhost:4242/checkout.html](http://localhost:4242/checkout.html) 1. Build the application ~~~ npm install ~~~ 2. Run the application ~~~ npm start ~~~ 3. Go to [http://localhost:3000/checkout](http://localhost:3000/checkout) 1. Build the server ~~~ npm install ~~~ 2. Run the server ~~~ npm start ~~~ 3. Go to [http://localhost:4242/checkout.html](http://localhost:4242/checkout.html) \### Development 1. Build the application ~~~shell $ npm install ~~~ 2. _Optional_: download and run the [Stripe CLI](https://stripe.com/docs/stripe-cli) ~~~shell $ stripe listen --forward-to localhost:3000/api/webhooks ~~~ 3. Run the application ~~~shell $ STRIPE_WEBHOOK_SECRET=$(stripe listen --print-secret) npm run dev ~~~ 4. Go to [localhost:3000](http://localhost:3000) ### Production 1. Build the application ~~~shell $ npm install $ npm build ~~~ 2. Run the application ~~~shell $ npm start ~~~ ## Nächste Schritte #### [Einzelposten dynamisch aktualisieren](https://docs.stripe.com/payments/checkout/dynamically-update-line-items.md) Erfahren Sie, wie Sie Einzelposten in Ihrer Checkout-Sitzung dynamisch ändern, wenn Nutzer/innen Produkte hinzufügen, entfernen oder ändern. #### [Bestellungen ausführen](https://docs.stripe.com/checkout/fulfillment.md?payment-ui=embedded-components) Richten Sie einen Webhook ein, um Bestellungen nach erfolgreicher Zahlung auszuführen. Webhooks sind der zuverlässigste Weg, geschäftskritische Ereignisse zu verarbeiten. #### [Auszahlungen empfangen](https://docs.stripe.com/payouts.md) Erfahren Sie, wie Sie Gelder von Ihrem Stripe-Konto auf Ihr Bankkonto überweisen können. #### [Zahlungen zurückerstatten und stornieren](https://docs.stripe.com/refunds.md) Bearbeiten Sie Rückerstattungsanfragen über die Stripe-API oder das Dashboard. #### [Kundenverwaltung](https://docs.stripe.com/customer-management.md) Lassen Sie Ihre Kundinnen und Kunden ihre Zahlungsdaten, Rechnungen und Abonnements selbst verwalten. #### [Schaltflächen für die Zahlung mit einem Klick](https://docs.stripe.com/elements/express-checkout-element/accept-a-payment.md?payment-ui=embedded-components#create-and-mount) Verwenden Sie das Express Checkout Element, um Zahlungen über Schaltflächen für Ein-Klick-Zahlungen zu akzeptieren.