# Checkout-Seite in Ihre Website einbinden # Vollständig eingebettete Seite Sehen Sie sich ein vollständiges, funktionsfähiges Codebeispiel für eine Integration mit [Stripe Checkout](https://docs.stripe.com/payments/checkout.md) an, mit der Ihre Kundinnen und Kunden über ein eingebettetes Formular auf Ihrer Website bezahlen können. Das Beispiel umfasst client- und serverseitigen Code, und eine einbettbare Nutzeroberflächenkomponente zeigt die Checkout-Seite an. ### 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 `embedded_page`. Die Checkout Session-Antwort enthält ein Client-Geheimnis, das der Client verwendet, um Checkout zu aktivieren. Geben Sie das [client_secret](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-client_secret) in Ihrer Antwort zurück. ### Checkout-Sitzung erstellen Fügen Sie Ihrer Anmeldeformular eine [Server-Aktion](https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations) hinzu, die 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 dabei den [ui_mode](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-ui_mode) auf `embedded_page` setzt. Die Antwort der Checkout-Sitzung enthält ein Client-Geheimnis, das der Client verwendet, um Checkout zu aktivieren. Geben Sie das [client_secret](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-client_secret) aus der Funktion zurück. ### Rückgabe-URL angeben Um zu definieren, wie Stripe Ihre Kundinnen/Kunden nach der Zahlung weiterleitet, geben Sie die URL der Rückgabeseite im Parameter [return_url](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-return_url) an, während Sie die Checkout-Sitzung erstellen. Nach dem Zahlungsversuch weist Stripe Ihre Kundinnen/Kunden an, zur auf Ihrer Website gehosteten Seite zurückzukehren. 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, die Sie verkaufen, beim Erstellen der Checkout-Sitzung, indem Sie [neu definierte Preis-IDs](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=checkout&ui=embedded-page#create-product-prices-upfront) verwenden. Bewahren Sie sensible Informationen über Ihren Produktbestand, wie z. B. Preis und Verfügbarkeit, immer auf Ihrem Server auf, um Manipulationen durch die Kundinnen/Kunden auf dem Client zu verhindern. ### Modus auswählen Um verschiedene Transaktionen abzuwickeln, passen Sie den Parameter `Modus` an. Verwenden Sie für einmalige Zahlungen `Zahlung`. Um wiederkehrende Zahlungen mit [Abonnements](https://docs.stripe.com/billing/subscriptions/build-subscriptions.md?payment-ui=checkout&ui=embedded-page) einzuleiten, ändern Sie den `Modus` auf `Abonnement`. Und für die [Einrichtung zukünftiger Zahlungen](https://docs.stripe.com/payments/save-and-reuse.md?platform=web&ui=embedded-page) legen Sie den `Modus` auf `Einrichtung` fest. ### 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 sicherstellen, dass die Zahlungsdaten ohne Umweg über Ihren Server direkt an Stripe gesendet werden. Laden Sie Stripe.js immer von *js.stripe.com*, um die Konformität zu gewährleisten. Fügen Sie das Skript nicht in ein Paket ein und hosten Sie es nicht selbst. ### Zahlungsformular definieren Um die Kundeninformationen sicher zu erfassen, erstellen Sie den leeren Platzhalter `div`. Stripe fügt einen iFrame in `div` ein. ### 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 Checkout-Sitzung abrufen Erstellen Sie eine asynchrone `fetchClientSecret`-Funktion, die eine Anfrage an Ihren Server stellt, um eine [Checkout-Sitzung zu erstellen](https://docs.stripe.com/api/checkout/sessions/create.md) und das Client-Geheimnis abzurufen. ### Client-Geheimnis der Checkout Checkout-Sitzung abrufen Importieren Sie die Server-Aktion, um eine [Checkout-Sitzung zu erstellen](https://docs.stripe.com/api/checkout/sessions/create.md) und das Client-Geheimnis abzurufen, und übergeben Sie dieses an den Parameter [`fetchClientSecret`](https://docs.stripe.com/js/embedded_checkout/create#embedded_checkout_create-options-fetchClientSecret). ### Checkout initialisieren Initialisieren Sie Checkout mit Ihrer `fetchClientSecret`-Funktion und verbinden Sie es mit dem Platzhalter `
` in Ihrem Zahlungsformular. Checkout wird in einem iFrame gerendert, der Zahlungsdaten sicher über eine HTTPS-Verbindung an Stripe sendet. Vermeiden Sie es, Checkout in einem anderen iFrame zu platzieren, da bei einigen Zahlungsmethoden die Weiterleitung an eine andere Seite zur Zahlungsbestätigung erforderlich ist. ### Checkout initialisieren Um den untergeordneten Komponenten den Zugriff auf den Stripe-Dienst über eingebettete Checkout-Verbraucher/innen zu ermöglichen, übergeben Sie das resultierende Promise von `loadStripe` und das Client-Geheimnis als `option` an den integrierten Checkout-Anbieter. ### 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. ### Rückgabeseite hinzufügen Um Ihren Kundinnen und Kunden Bestellinformationen anzuzeigen, fügen Sie unter `pages/` eine Datei für die URL hinzu, die Sie als `return_url` der Checkout-Sitzung angegeben haben. Stripe leitet Ihren Kunden/Ihre Kundin an diese Seite weiter, nachdem er/sie 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 Verarbeiten Sie das Ergebnis der Sitzung anhand ihres 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 erneut versuchen können. ### Legen Sie Ihre Umgebungsvariablen fest Fügen Sie Ihre veröffentlichbaren und Geheimschlüssel zu einer `.env`-Datei hinzu. Next.js lädt sie automatisch als [Umgebungsvariablen](https://nextjs.org/docs/basic-features/environment-variables) in ihre Anwendung. Jeder Webhook-Endpoint verfügt über ein eindeutiges Signatur-Geheimnis. Webhooks werden in [Workbench](https://docs.stripe.com/workbench.md) im Dashboard verwaltet. Das Geheimnis finden Sie in der Detailansicht des Ziels für Ihren Webhook-Endpoint in der [Registerkarte Webhooks](https://dashboard.stripe.com/workbench/webhooks) von Workbench. Wenn Sie lokal mit der Stripe-CLI testen, können Sie das Geheimnis auch über die CLI-Ausgabe mit dem Befehl `stripe listen` abrufen. Um ein Signatur-Geheimnis für einen Webhook-Endpoint zur Überwachung von [Ereignissen](https://docs.stripe.com/event-destinations.md) hinzuzufügen, rufen Sie die Registerkarte [Ereignisziele](https://dashboard.stripe.com/workbench/webhooks) in Workbench auf oder verwenden Sie die [Stripe-CLI](https://docs.stripe.com/stripe-cli.md). ### Anwendung ausführen Starten Sie Ihren Server und gehen Sie zu . ### Anwendung ausführen Starten Sie Ihren Server und gehen Sie zu . ### Anwendung ausführen Starten Sie Ihre Anwendung mit `npm run dev` und gehen Sie zu . ### 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 | ## Herzlichen Glückwunsch! Ihre grundlegende Checkout-Integration funktioniert. Erfahren Sie nun, wie Sie das Erscheinungsbild Ihrer Bezahlseite anpassen und den Steuereinzug automatisieren können. ### Checkout-Seite anpassen [Passen Sie](https://docs.stripe.com/payments/checkout/customization.md) das Erscheinungsbild des eingebetteten Formulars an, indem Sie: - Fügen Sie Ihr Farbdesign und Ihre Schriftart zu Ihren [Branding-Einstellungen](https://dashboard.stripe.com/settings/branding/checkout) hinzu. - Mit der [Checkout Sessions API](https://docs.stripe.com/api/checkout/sessions/create.md) zusätzliche Funktionen wie das Erfassen von Adressen und das Vorausfüllen von Kundendaten aktivieren. ### Kundendaten vorab ausfüllen 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 in das E-Mail-Eingabefeld zu übernehmen. Sie können auch eine [Kunden](https://docs.stripe.com/api/customers.md)-ID an das Feld `customer` übergeben, um die für den Kunden/die Kundin gespeicherte E-Mail-Adresse in das E-Mail-Adressfeld zu übernehmen. ### Schaltfläche zum Absenden auswählen Ändern Sie den Text der Schaltfläche „Senden“, um zu `pay`, `donate` oder `book`, indem Sie den [submit_type](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-submit_type) festlegen. Der Standardtext ist `pay`. ### Angaben zur Abrechnung und zum Versand erfassen 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 Ihres Kunden/Ihrer Kundin zu erfassen. [shipping_address_collection](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-shipping_address_collection) erfordert eine Liste von `allowed_countries`. Checkout zeigt diese in einem Dropdown-Menü auf der Seite an. ### 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/tax), 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`. ### Neue und wiederkehrende Kundinnen und Kunden Standardmäßig erstellt Checkout nur dann [Kundinnen und Kunden](https://docs.stripe.com/api/customers.md), wenn ein Kunde/eine Kundin erforderlich ist (z. B. für Abonnements). Andernfalls verwendet Checkout [Gastkundinnen und Gastkunden](https://docs.stripe.com/payments/checkout/guest-customers.md), um Zahlungen im Dashboard zu gruppieren. Optional können Sie Checkout so konfigurieren, dass immer neue Kundinnen und Kunden erstellt werden oder dass wiederkehrende Kundinnen und Kunden angegeben werden. ### Kundinnen und Kunden immer erstellen Um immer dann Kundinnen und Kunden zu erstellen, wenn keine Kundin/ein Kunde angegeben ist, legen Sie [customer_creation](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-customer_creation) auf `'always'` fest. ### Geben Sie wiederkehrende Kundinnen und Kunden an Um einen Bezahlvorgang mit einem bereits vorhandenen Kunden/einer bereits vorhandenen Kundin zu verknüpfen, geben Sie [den Kunden/die Kundin](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-customer) beim Erstellen einer Sitzung an. 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/accounts-v2/use-accounts-as-customers.md). // 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. // Don't put any keys in code. See https://docs.stripe.com/keys-best-practices. 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: 'embedded_page', customer_email: 'customer@example.com', submit_type: 'donate', 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, }, ], mode: {{CHECKOUT_MODE}}, return_url: `${YOUR_DOMAIN}/return?session_id={CHECKOUT_SESSION_ID}`, return_url: `${YOUR_DOMAIN}/return.html?session_id={CHECKOUT_SESSION_ID}`, automatic_tax: {enabled: true}, customer_creation: 'always', // Provide the Customer ID (for example, cus_1234) for an existing customer to associate it with this session // customer: '{{CUSTOMER_ID}}' }); res.send({clientSecret: session.client_secret}); app.get('/session-status', async (req, res) => { const session = await stripe.checkout.sessions.retrieve(req.query.session_id); res.send({ status: session.status, customer_email: session.customer_details.email }); }); { "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. \# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices. client = Stripe::StripeClient.new('<>') YOUR_DOMAIN = 'http://localhost:4242' YOUR_DOMAIN = 'http://localhost:3000' session = client.v1.checkout.sessions.create({ ui_mode: 'embedded_page', customer_email: 'customer@example.com', submit_type: 'donate', 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, }], mode: {{CHECKOUT_MODE}}, return_url: YOUR_DOMAIN + '/return.html?session_id={CHECKOUT_SESSION_ID}', return_url: YOUR_DOMAIN + '/return?session_id={CHECKOUT_SESSION_ID}', automatic_tax: {enabled: true}, customer_creation: 'always', \# Provide the Customer ID (for example, cus_1234) for an existing customer to associate it with this session # customer: '{{CUSTOMER_ID}}' }) {clientSecret: session.client_secret}.to_json get '/session-status' do session = client.v1.checkout.sessions.retrieve(params[:session_id]) {status: session.status, customer_email: session.customer_details.email}.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. \# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices. client = stripe.StripeClient('<>') YOUR_DOMAIN = 'http://localhost:4242' YOUR_DOMAIN = 'http://localhost:3000' session = client.v1.checkout.sessions.create(params={ 'ui_mode': 'embedded_page', 'customer_email': 'customer@example.com', 'submit_type': 'donate', '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, }, ], 'mode': {{CHECKOUT_MODE}}, 'return_url': YOUR_DOMAIN + '/return.html?session_id={CHECKOUT_SESSION_ID}', 'return_url': YOUR_DOMAIN + '/return?session_id={CHECKOUT_SESSION_ID}', 'automatic_tax': {'enabled': True}, 'customer_creation': 'always', \# Provide the Customer ID (for example, cus_1234) for an existing customer to associate it with this session # 'customer': '{{CUSTOMER_ID}}' }) return jsonify(clientSecret=session.client_secret) @app.route('/session-status', methods=['GET']) def session_status(): session = client.v1.checkout.sessions.retrieve(request.args.get('session_id')) return jsonify(status=session.status, customer_email=session.customer_details.email) 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($stripeSecretKey); $YOUR_DOMAIN = 'http://localhost:4242'; $YOUR_DOMAIN = 'http://localhost:3000'; $checkout_session = $stripe->checkout->sessions->create([ 'ui_mode' => 'embedded_page', 'customer_email' => 'customer@example.com', 'submit_type' => 'donate', '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, ]], 'mode' => {{CHECKOUT_MODE}}, 'return_url' => $YOUR_DOMAIN . '/return.html?session_id={CHECKOUT_SESSION_ID}', 'return_url' => $YOUR_DOMAIN . '/return?session_id={CHECKOUT_SESSION_ID}', 'automatic_tax' => [ 'enabled' => true, ], 'customer_creation' => 'always', \# Provide the Customer ID (for example, cus_1234) for an existing customer to associate it with this session # 'customer' => '{{CUSTOMER_ID}}' ]); 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); echo json_encode(['status' => $session->status, 'customer_email' => $session->customer_details->email]); http_response_code(200); } catch (Error $e) { http_response_code(500); echo json_encode(['error' => $e->getMessage()]); } // Don't put any keys in code. See https://docs.stripe.com/keys-best-practices. $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. // Don't put any keys in code. See https://docs.stripe.com/keys-best-practices. services.AddSingleton(new StripeClient("<>")); var domain = "http://localhost:4242"; var domain = "http://localhost:3000"; UiMode = "embedded_page", CustomerEmail = "customer@example.com", SubmitType = "donate", 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, }, }, Mode = {{CHECKOUT_MODE}}, ReturnUrl = domain + "/return.html?session_id={CHECKOUT_SESSION_ID}", ReturnUrl = domain + "/return?session_id={CHECKOUT_SESSION_ID}", AutomaticTax = new SessionAutomaticTaxOptions { Enabled = true }, CustomerCreation = "always", // Provide the Customer ID (for example, cus_1234) for an existing customer to associate it with this session // Customer="cus_RnhPlBnbBbXapY", 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) { Session session = _client.V1.Checkout.Sessions.Get(session_id); return Json(new {status = session.Status, customer_email = session.CustomerDetails.Email}); } } "github.com/stripe/stripe-go/v85" // Don't put any keys in code. See https://docs.stripe.com/keys-best-practices. sc := stripe.NewClient("<>") domain := "http://localhost:4242" domain := "http://localhost:3000" params := &stripe.CheckoutSessionCreateParams{ UIMode: stripe.String("embedded_page"), ReturnURL: stripe.String(domain + "/return.html?session_id={CHECKOUT_SESSION_ID}"), ReturnURL: stripe.String(domain + "/return?session_id={CHECKOUT_SESSION_ID}"), CustomerEmail: stripe.String("customer@example.com"), SubmitType: stripe.String("donate"), BillingAddressCollection: stripe.String("auto"), ShippingAddressCollection: &stripe.CheckoutSessionShippingAddressCollectionParams{ 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), }, }, Mode: stripe.String("{{CHECKOUT_MODE}}"), AutomaticTax: &stripe.CheckoutSessionAutomaticTaxParams{Enabled: stripe.Bool(true)}, CustomerCreation: stripe.String(stripe.CheckoutSessionCustomerCreationAlways), // Provide the Customer ID (for example, cus_1234) for an existing customer to associate it with this session // Customer: stripe.String("{{CUSTOMER_ID}}"), } 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) { s, _ := sc.V1CheckoutSessions.Retrieve(context.TODO(), r.URL.Query().Get("session_id"), nil) writeJSON(w, struct { Status string `json:"status"` CustomerEmail string `json:"customer_email"` }{ Status: string(s.Status), CustomerEmail: string(s.CustomerDetails.Email), }) } 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. // Don't put any keys in code. See https://docs.stripe.com/keys-best-practices. StripeClient client = new StripeClient("<>"); String YOUR_DOMAIN = "http://localhost:4242"; String YOUR_DOMAIN = "http://localhost:3000"; SessionCreateParams params = SessionCreateParams.builder() .setUiMode(SessionCreateParams.UiMode.EMBEDDED_PAGE) .setCustomerEmail("customer@example.com") .setSubmitType(SessionCreateParams.SubmitType.DONATE) .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 + "/return?session_id={CHECKOUT_SESSION_ID}") .setReturnUrl(YOUR_DOMAIN + "/return.html?session_id={CHECKOUT_SESSION_ID}") .setAutomaticTax( SessionCreateParams.AutomaticTax.builder() .setEnabled(true) .build()) .setCustomerCreation(SessionCreateParams.CustomerCreation.ALWAYS) // Provide the Customer ID (for example, cus_1234) for an existing customer to associate it with this session // .setCustomer("{{CUSTOMER_ID}}") .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()) .build(); Map map = new HashMap(); map.put("clientSecret", session.getRawJsonObject().getAsJsonPrimitive("client_secret").getAsString()); return map; get("/session-status", (request, response) -> { Session session = client.v1().checkout().sessions().retrieve(request.queryParams("session_id")); Map map = new HashMap(); map.put("status", session.getRawJsonObject().getAsJsonPrimitive("status").getAsString()); map.put("customer_email", session.getRawJsonObject().getAsJsonObject("customer_details").getAsJsonPrimitive("email").getAsString()); return map; }, gson::toJson);
const stripe = Stripe("<>"); initialize(); // Create a Checkout Session async function initialize() { const fetchClientSecret = async () => { const response = await fetch("/create-checkout-session", { method: "POST", }); const response = await fetch("/checkout.php", { method: "POST", }); const { clientSecret } = await response.json(); return clientSecret; }; const checkout = await stripe.createEmbeddedCheckoutPage({ fetchClientSecret, }); // Mount Checkout checkout.mount('#checkout'); } Thanks for your order! initialize(); async function initialize() { const queryString = window.location.search; const urlParams = new URLSearchParams(queryString); const sessionId = urlParams.get('session_id'); 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(); if (session.status == 'open') { window.location.replace('http://localhost:4242/checkout.html') } else if (session.status == 'complete') { document.getElementById('success').classList.remove('hidden'); document.getElementById('customer-email').textContent = session.customer_email } } { "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": "^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": "^3.7.0", "@stripe/stripe-js": "^7.3.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://localhost:4242/", "scripts": { "start": "react-scripts start --ignore client", "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, { useCallback, useState, useEffect } from "react"; import {loadStripe} from '@stripe/stripe-js'; import { EmbeddedCheckoutProvider, EmbeddedCheckout } from '@stripe/react-stripe-js'; // 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 API key embedded in code samples. const stripePromise = loadStripe("<>"); const fetchClientSecret = useCallback(() => { // Create a Checkout Session return fetch("/create-checkout-session", { method: "POST", }) return fetch("/checkout.php", { method: "POST", }) .then((res) => res.json()) .then((data) => data.clientSecret); }, []); const options = {fetchClientSecret}; const Return = () => { const [status, setStatus] = useState(null); const [customerEmail, setCustomerEmail] = useState(''); useEffect(() => { const queryString = window.location.search; const urlParams = new URLSearchParams(queryString); const sessionId = urlParams.get('session_id'); fetch(`/session-status?session_id=${sessionId}`) fetch("/status.php", { headers: { Accept: "application/json", "Content-Type": "application/json", }, method: "POST", body: JSON.stringify({ session_id: sessionId }), }) .then((res) => res.json()) .then((data) => { setStatus(data.status); setCustomerEmail(data.customer_email); }); }, []); if (status === 'open') { return ( ) } if (status === 'complete') { return (

We appreciate your business! A confirmation email will be sent to {customerEmail}. If you have any questions, please email orders@example.com.

) } return null; } } /> { "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": "^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": "^3.7.0", "@stripe/stripe-js": "^7.3.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "^3.4.0" }, "homepage": "http://localhost:3000/checkout", "proxy": "http://localhost: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" ] } } // Create Checkout Sessions from body params. const session = await stripe.checkout.sessions.create({ ui_mode: 'embedded_page', customer_email: 'customer@example.com', submit_type: 'donate', 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 } ], mode: 'payment', return_url: `${origin}/return?session_id={CHECKOUT_SESSION_ID}`, automatic_tax: {enabled: true}, }) import { EmbeddedCheckout, EmbeddedCheckoutProvider } from '@stripe/react-stripe-js' import { loadStripe } from '@stripe/stripe-js' import { fetchClientSecret } from '../actions/stripe' const stripePromise = loadStripe(process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY) \# https://dashboard.stripe.com/apikeys NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=<> STRIPE_SECRET_KEY=<> \# Set this environment variable to support webhooks — https://stripe.com/docs/webhooks#verify-events # STRIPE_WEBHOOK_SECRET=whsec_12345 export default async function Return({ searchParams }) { const { status, customer_details: { email: customerEmail } } = await stripe.checkout.sessions.retrieve(session_id, { expand: ['line_items', 'payment_intent'] }) if (status === 'open') { return redirect('/') } if (status === 'complete') { return (

We appreciate your business! A confirmation email will be sent to{' '} {customerEmail}. If you have any questions, please email{' '}

orders@example.com.
) } import 'server-only' import Stripe from 'stripe' export const stripe = new Stripe(process.env.STRIPE_SECRET_KEY) 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 ~~~ If you run into an error, when running npm start, try running the following code and starting again: ~~~ export NODE_OPTIONS=--openssl-legacy-provider ~~~ 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 #### [Bestellungen ausführen](https://docs.stripe.com/checkout/fulfillment.md) 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