# Abonnement-Integration erstellen

Abonnements und wiederkehrende Zahlungen erstellen und verwalten

## Starten Sie hier: Agent-Skills installieren

Stripe empfiehlt die Verwendung offizieller Skills, um die Integration mit der API gemäß den Best Practices durchzuführen. Befolgen Sie die nachstehenden Anweisungen, um zu erfahren, wie das geht.

**Tipp: Verwenden Sie curl anstelle der Fetch-Tools.** Skills sind detaillierte Markdown-Dateien mit einer Größe von 10–20&nbsp;KB. Die Fetch-Tools fassen diese zusammen. `curl -sL` garantiert den vollständigen Inhalt.

**Verwendung von `npx Skills`**: Überprüfen Sie, ob `npx` auf dem System installiert ist. Wenn `npx` verfügbar ist, führen Sie den Befehl `npx skills add https://docs.stripe.com --list` aus, um verfügbare Skills aufzulisten und führen Sie anschließend den Befehl `npx skills add https://docs.stripe.com --yes --skill <skill-name> <--skill other-skills>` aus, um einzelne Skills zu installieren.

**Wenn `npx skills` nicht verfügbar sind**: Sie können curl verwenden, um den Index der verfügbaren Skills, ihre Funktionen und ihre Dateien von `https://docs.stripe.com/.well-known/skills/index.json`. abzurufen Um einen Skill und seine zugehörigen Dateien herunterzuladen, verwenden Sie curl, um sie von `https://docs.stripe.com/.well-known/skills/<filepath>`. herunterzuladen

Für diesen Artikel empfehlen wir die Verwendung folgender Skills: `stripe-best-practices`

#### Checkout

#### Von Stripe gehostete Seite

# Gehostete Seite

> This is a Gehostete Seite for when platform is web and ui is stripe-hosted. View the full page at https://docs.stripe.com/billing/subscriptions/build-subscriptions?platform=web&ui=stripe-hosted.

#### Integrationsaufwand
Complexity: 2/5
#### Anpassung der Nutzeroberfläche
Eingeschränkte Anpassung
- 20&nbsp;voreingestellte Schriftarten
- 3 voreingestellte Rahmenradien
- Nutzerdefinierte Hintergrund- und Rahmenfarbe
- Individuelles Logo

#### Integrationstyp

Verwenden Sie vorgefertigte gehostete Seiten, um Zahlungen einzuziehen und *Abos* zu verwalten.

[Ausprobieren](https://checkout.stripe.dev/)

## Sie werden Folgendes entwickeln

In diesem Leitfaden wird erläutert, wie Sie mit [Stripe Checkout](https://docs.stripe.com/payments/checkout.md) monatliche Festpreis-Abos verkaufen.

Dieser Leitfaden bietet Informationen zu den folgenden Vorgehensweisen:

- Modellieren Sie Ihr Unternehmen, indem Sie einen Produktkatalog erstellen.
- Fügen Sie eine Checkout-Sitzung zu Ihrer Seite hinzu, einschließlich einer Schaltfläche sowie Erfolgs- und Abbruchseiten.
- Überwachen Sie Abo-Ereignisse und stellen Sie den Zugang zu Ihrer Dienstleistung bereit.
- Richten Sie das [Kundenportal](https://docs.stripe.com/customer-management.md) ein.
- Fügen Sie eine Kundenportal-Sitzung zu Ihrer Seite hinzu, einschließlich einer Schaltfläche und einer Umleitung.
- Lassen Sie Ihre Kund/innen über das Portal ihre eigenen Abos verwalten.
- Erfahren Sie, wie Sie im [flexiblen Abrechnungsmodus](https://docs.stripe.com/billing/subscriptions/billing-mode.md) auf ein verbessertes Abrechnungsverhalten und zusätzliche Funktionen zugreifen können.

Wenn Sie zur Codierung einer Integration nicht bereit sind, können Sie einfache Abos [manuell im Dashboard](https://docs.stripe.com/no-code/subscriptions.md) einrichten oder [Payment Links](https://docs.stripe.com/payment-links.md) nutzen, um Abos einzurichten, ohne Code schreiben zu müssen.

Erfahren Sie mehr über das [Entwerfen einer Integration](https://docs.stripe.com/billing/subscriptions/design-an-integration.md), um zu verstehen, welche Entscheidungen Sie für eine vollständige Integration treffen müssen und welche Ressourcen Sie benötigen.

Nachdem Sie die Integration abgeschlossen haben, können Sie sie auf Folgendes erweitern:

- [Steuern](https://docs.stripe.com/payments/checkout/taxes.md) anzeigen
- [Rabatte](https://docs.stripe.com/billing/subscriptions/coupons.md#using-coupons-in-checkout) anwenden
- Kund/innen einen [kostenlosen Testzeitraum](https://docs.stripe.com/billing/subscriptions/trials.md) anbieten
- [Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/integration-options.md) hinzufügen
- [Gehostete Rechnungsseite](https://docs.stripe.com/invoicing/hosted-invoice-page.md) integrieren
- Checkout im [Einrichtungsmodus](https://docs.stripe.com/payments/save-and-reuse.md) verwenden
- [Nutzungsbasierte Abrechnung](https://docs.stripe.com/products-prices/pricing-models.md#usage-based-pricing), [Preisstufen](https://docs.stripe.com/products-prices/pricing-models.md#tiered-pricing) und [nutzungsbasierte Preise](https://docs.stripe.com/products-prices/pricing-models.md#usage-based-pricing) einrichten
- [Anteilmäßige Verrechnung](https://docs.stripe.com/billing/subscriptions/prorations.md) verwalten
- Ermöglichen Sie es Kund/innen, [mehrere Produkte zu abonnieren](https://docs.stripe.com/billing/subscriptions/quantities.md#multiple-product-sub)
- [Berechtigungen](https://docs.stripe.com/billing/entitlements.md) integrieren, um den Zugriff auf die Funktionen Ihres Produkts zu verwalten

## Stripe einrichten

Installieren Sie den Stripe-Client Ihrer Wahl:

#### Ruby

```bash
# Available as a gem
sudo gem install stripe
```

```ruby
# If you use bundler, you can add this line to your Gemfile
gem 'stripe'
```

Installieren Sie optional die Stripe CLI. Die CLI bietet [Webhook](https://docs.stripe.com/webhooks.md#test-webhook)-Tests und kann zum Erstellen Ihrer Produkte und Preise ausgeführt werden.
Weitere Installationsoptionen finden Sie unter [Mit der Stripe-CLI loslegen](https://docs.stripe.com/stripe-cli.md).
## Preismodell erstellen [Dashboard oder Stripe-CLI]

[Wiederkehrende Preismodelle](https://docs.stripe.com/products-prices/pricing-models.md) umfassen die Produkte und Dienstleistungen, die Sie anbieten, die Preise dafür, welche Währungen Sie für Zahlungen verwenden und den Leistungszeitraum (für Abos). Verwenden Sie zum Aufbau des Preismodells [Produkte](https://docs.stripe.com/api/products.md) (was Sie anbieten) und [Preise](https://docs.stripe.com/api/prices.md) (Höhe und Abrechnungsintervall).

In diesem Beispiel wird ein Pauschalpreisdienst mit zwei verschiedenen Service-Optionen verwendet: Basis und Premium. Für jede Service-Option müssen Sie ein Produkt und einen wiederkehrenden Preis erstellen. Um eine einmalige Gebühr, z.&nbsp;B. für die Einrichtung, hinzufügen möchten, erstellen Sie ein drittes Produkt mit einem einmaligen Preis.

Jedes Produkt wird in monatlichen Intervallen abgerechnet. Der Preis für das Basisprodukt beträgt 5&nbsp;USD. Der Preis für das Premiumprodukt beträgt 15 USD. Ein Beispiel mit drei Stufen finden Sie im Leitfaden zu [Pauschalpreismodellen](https://docs.stripe.com/subscriptions/pricing-models/flat-rate-pricing.md).

#### Dashboard

Gehen Sie zur Seite [Produkt hinzufügen](https://dashboard.stripe.com/test/products/create) und erstellen Sie zwei Produkte. Fügen Sie für jedes Produkt einen Preis hinzu, jeweils mit einem monatlich wiederkehrenden Abrechnungszeitraum:

- Premium-Produkt: Premium-Dienstleistung mit zusätzlichen Funktionen

  - Preis: Pauschalpreis&nbsp;|&nbsp;15 USD

- Basic-Produkt: Basic-Dienstleistung mit minimalem Funktionsumfang

  - Preis: Pauschalpreis&nbsp;|&nbsp;5 USD

Zeichnen Sie nach Erstellung der Preise die Preis-IDs auf, sodass diese in anderen Schritten verwendet werden können. Preis-IDs sehen in etwa wie folgt aus: `price_G0FvDp6vZvdwRZ`.

Wenn Sie bereit sind, verwenden Sie die Schaltfläche **In Live-Modus kopieren** oben rechts auf der Seite, um Ihr Produkt aus der [Sandbox in den Live-Modus zu kopieren](https://docs.stripe.com/keys.md#test-live-modes).

#### API

Sie können die API zum Erstellen der [Produkte](https://docs.stripe.com/api/products.md) und [Preise](https://docs.stripe.com/api/prices.md) verwenden.

Premiumprodukt erstellen:

```curl
curl https://api.stripe.com/v1/products \
  -u "<<YOUR_SECRET_KEY>>:" \
  --data-urlencode "name=Billing Guide: Premium Service" \
  -d "description=Premium service with extra features"
```

Basisprodukt erstellen:

```curl
curl https://api.stripe.com/v1/products \
  -u "<<YOUR_SECRET_KEY>>:" \
  --data-urlencode "name=Billing Guide: Basic Service" \
  -d "description=Basic service with minimum features"
```

Zeichnen Sie Preis-ID für jedes Produkt auf. Die Preis-IDs sehen in etwa wie folgt aus:

```json
{
  "id": "prod_H94k5odtwJXMtQ",
  "object": "product",
  "active": true,
  "attributes": [

  ],
  "created": 1587577341,
  "description": "Premium service with extra features",
  "images": [

  ],
  "livemode": false,
  "metadata": {
  },
  "name": "Billing Guide: Premium Service",
  "statement_descriptor": null,
  "type": "service",
  "unit_label": null,
  "updated": 1587577341
}
```

Verwenden Sie die Produkt-IDs, um einen Preis für jedes Produkt zu erstellen. Die Zahl [unit_amount](https://docs.stripe.com/api/prices/object.md#price_object-unit_amount) wird in Cent angegeben, also z.&nbsp;B.`1500` = 15 USD.

Premiumpreis erstellen:

```curl
curl https://api.stripe.com/v1/prices \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d product={{PREMIUM_PRODUCT_ID}} \
  -d unit_amount=1500 \
  -d currency=usd \
  -d "recurring[interval]=month"
```

Basispreis erstellen:

```curl
curl https://api.stripe.com/v1/prices \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d product={{BASIC_PRODUCT_ID}} \
  -d unit_amount=500 \
  -d currency=usd \
  -d "recurring[interval]=month"
```

Zeichnen Sie Preis-ID für jeden Preis auf, sodass diese in nachfolgenden Schritten verwendet werden können. Die Preis-IDs sehen in etwa wie folgt aus:

```json
{
  "id": "price_HGd7M3DV3IMXkC",
  "object": "price",
  "product": "prod_HGd6W1VUqqXGvr",
  "type": "recurring",
  "currency": "usd",
  "recurring": {
    "interval": "month",
    "interval_count": 1,
    "trial_period_days": null,
    "usage_type": "licensed"
  },
  "active": true,
  "billing_scheme": "per_unit",
  "created": 1589319695,
  "livemode": false,
  "lookup_key": null,
  "metadata": {},
  "nickname": null,
  "unit_amount": 1500,
  "unit_amount_decimal": "1500",
  "tiers": null,
  "tiers_mode": null,
  "transform_quantity": null
}
```

Wenn Sie mehrere Rechnungsstellungszeiträume anbieten, verwenden Sie Checkout, um Kundinnen und Kunden längere Rechnungsstellungszeiträume als [Upsell](https://docs.stripe.com/payments/checkout/upsells.md) anzubieten und mehr Umsatz im Voraus zu erzielen.

Weitere Preismodelle finden Sie unter [Abrechnungsbeispiele](https://docs.stripe.com/products-prices/pricing-models.md).

## Checkout-Sitzung erstellen [Client und Server]

Fügen Sie Ihrer Website eine Schaltfläche zum Bezahlen hinzu, die einen serverseitigen Endpoint aufruft, um eine Checkout-Sitzung zu erstellen.

```html
<html>
  <head>
    <title>Checkout</title>
  </head>
  <body>
    <form action="/create-checkout-session" method="POST">
      <!-- Note: If using PHP set the action to /create-checkout-session.php -->

      <input type="hidden" name="priceId" value="price_G0FvDp6vZvdwRZ" />
      <button type="submit">Checkout</button>
    </form>
  </body>
</html>
```

Definieren Sie im Backend Ihrer Anwendung einen Endpoint, der [die Sitzung erstellt](https://docs.stripe.com/api/checkout/sessions/create.md), die von Ihrem Frontend aufgerufen werden kann. Sie brauchen dazu folgende Werte:

- Die Preis-ID des Abos, das der/die Kund/in abschließt (Ihr Frontend übergibt diesen Wert)
- Ihre `success_url`, eine Seite auf Ihrer Website, an die Kund/innen nach Abschluss der Zahlung weitergeleitet werden

Sie können optional Folgendes tun:

- Konfigurieren Sie in diesem Aufruf einen [Abrechnungszyklusanker](https://docs.stripe.com/billing/subscriptions/billing-cycle.md) für Ihr Abo.
- Verwenden Sie einen [benutzerdefinierten Text](https://docs.stripe.com/payments/checkout/custom-components.md?platform=web&payment-ui=stripe-hosted#customize-text), um Ihre Abo- und Kündigungskonditionen sowie einen Link anzugeben, über den Ihre Kundinnen und Kunden ihr Abo aktualisieren oder kündigen können. Wir empfehlen Ihnen, [E-Mail-Erinnerungen und Benachrichtigungen](https://docs.stripe.com/invoicing/send-email.md#email-configuration) für Ihre Abonnentinnen und Abonnenten zu konfigurieren.

Wenn Sie in [Schritt 2](https://docs.stripe.com/billing/subscriptions/build-subscriptions.md#create-pricing-model) einen einmaligen Preis erstellt haben, übergeben Sie auch diese Preis-ID. Leiten Sie Ihre Kund/innen nach dem Erstellen einer Checkout-Sitzung an die in der Antwort zurückgegebene [URL](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-url) weiter.

Sie können beim Erstellen einer Checkout-Sitzung ein genaueres und besser vorhersehbares Aboverhalten aktivieren, indem Sie den Typ des [Abrechnungsmodus](https://docs.stripe.com/billing/subscriptions/billing-mode.md) auf `flexible` einstellen. Sie müssen die Stripe API Version [2025-06-30.basil](https://docs.stripe.com/changelog/basil.md#2025-06-30.basil) oder höher verwenden.

> Sie können [lookup_keys](https://docs.stripe.com/products-prices/manage-prices.md#lookup-keys) anstelle von Preis-IDs verwenden, um Preise abzurufen. Ein Beispiel finden Sie in der [Beispielanwendung](https://github.com/stripe-samples/subscription-use-cases/tree/main/fixed-price-subscriptions).

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

# The price ID passed from the front end.
#   price_id = params['priceId']
price_id = '{{PRICE_ID}}'

session = client.v1.checkout.sessions.create({
  success_url: 'https://example.com/success.html?session_id={CHECKOUT_SESSION_ID}',
  mode: 'subscription',
  line_items: [{
    # For usage-based billing, don't pass quantity
    quantity: 1,
    price: price_id
  }],
  subscription_data: {
    billing_mode: { type: 'flexible' }
  }
})

# Redirect to the URL returned on the session
#   redirect session.url, 303
```

In diesem Beispiel wird die `success_url` durch Anhängen der Sitzungs-ID angepasst. Erfahren Sie mehr über das [Anpassen Ihrer Erfolgsseite](https://docs.stripe.com/payments/checkout/custom-success-page.md).

Aktivieren Sie in Ihrem [Dashboard](https://dashboard.stripe.com/settings/payment_methods) die Zahlungsmethoden, die Sie von Ihren Kund/innen akzeptieren möchten. Checkout unterstützt [mehrere Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/payment-method-support.md#product-support).

## Abos bereitstellen und überwachen [Server]

Nach erfolgreicher Registrierung eines Abonnements wird der Kunde zur `success_url` Ihrer Website zurückgeleitet, wodurch ein `checkout.session.completed` *Webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) ausgelöst wird. Wenn Sie ein `checkout.session.completed`-Ereignis empfangen, können Sie mit [entitlements](https://docs.stripe.com/billing/entitlements.md) das Abo bereitstellen. Führen Sie die Bereitstellung monatlich fort (bei monatlicher Abrechnung), indem Sie auf die `invoice.paid`-Ereignisse reagieren. Erhalten Sie hingegen ein `invoice.payment_failed`-Ereignis, benachrichtigen Sie bitte Ihre Kundschaft und leiten Sie diese zum Kundenportal weiter, um die Zahlungsmethode zu aktualisieren.

Um den nächsten Schritt für die Logik Ihres Systems zu bestimmen, überprüfen Sie den Ereignistyp und analysieren Sie die Payload jedes [Ereignisobjekts](https://docs.stripe.com/api/events/object.md), etwa `invoice.paid`. Speichern Sie die Ereignisobjekte `subscription.id` und `customer.id` zur Überprüfung in Ihrer Datenbank.

Zu Testzwecken können Sie Ereignisse auf der [Registerkarte Ereignisse](https://dashboard.stripe.com/workbench/events) in [Workbench](https://docs.stripe.com/workbench.md) überwachen. Richten Sie für die Produktion einen Webhook-Endpoint ein und abonnieren Sie die entsprechenden Ereignistypen. Wenn Sie Ihren `STRIPE_WEBHOOK_SECRET`-Schlüssel nicht kennen, gehen Sie zur Zieldetailsansicht der [Registerkarte Webhooks](https://dashboard.stripe.com/workbench/webhooks) in Workbench, um ihn anzuzeigen.

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/webhook' do
  webhook_secret = '{{STRIPE_WEBHOOK_SECRET}}' # Beispiel: whsec_c7681Dm
  payload = request.body.read
  if !webhook_secret.empty?
    # Retrieve the event by verifying the signature using the raw body and secret if webhook signing is configured.
    sig_header = request.env['HTTP_STRIPE_SIGNATURE']
    event = nil

    begin
      event = Stripe::Webhook.construct_event(
        payload, sig_header, webhook_secret
      )
    rescue JSON::ParserError => e
      # Invalid payload
      status 400
      return
    rescue Stripe::SignatureVerificationError => e
      # Invalid signature
      puts '⚠️  Webhook signature verification failed.'
      status 400
      return
    end
  else
    data = JSON.parse(payload, symbolize_names: true)
    event = Stripe::Event.construct_from(data)
  end
  # Get the type of webhook event sent
  event_type = event['type']
  data = event['data']
  data_object = data['object']

  case event_type
  when 'checkout.session.completed'
    # Payment is successful and the subscription is created.
    # You should provision the subscription and save the customer ID to your database.
  when 'invoice.paid'
    # Continue to provision the subscription as payments continue to be made.
    # Store the status in your database and check when a user accesses your service.
    # This approach helps you avoid hitting rate limits.
  when 'invoice.payment_failed'
    # The payment failed or the customer doesn't have a valid payment method.
    # The subscription becomes past_due. Notify your customer and send them to the
    # customer portal to update their payment information.
  else
    puts "Unhandled event type: \#{event.type}"
  end

  status 200
end
```

Überwachen Sie mindestens folgende Ereignistypen:

| Ereignisname                 | Beschreibung                                                                                                                   |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| `checkout.session.completed` | Wird gesendet, wenn ein/e Kund/in die Checkout-Sitzung erfolgreich abschließt, und informiert Sie über einen neuen Kauf.       |
| `invoice.paid`               | Wird in jedem Rechnungsstellungszeitraum gesendet, wenn eine Zahlung erfolgreich ist.                                          |
| `invoice.payment_failed`     | Wird in jedem Rechnungsstellungszeitraum gesendet, wenn es ein Problem mit der Zahlungsmethode Ihrer Kundin/Ihres Kunden gibt. |

Weitere zu überwachende Ereignisse finden Sie unter [Abo-Webhooks](https://docs.stripe.com/billing/subscriptions/webhooks.md).

## Konfigurieren Sie das Kundenportal [Dashboard]

Über das [Kundenportal](https://docs.stripe.com/customer-management.md) können Ihre Kund/innen ihre bestehenden Abos und Rechnungen direkt verwalten.

Verwenden Sie das [Dashboard](https://dashboard.stripe.com/test/settings/billing/portal), um das Portal zu konfigurieren. [Konfigurieren Sie das Portal](https://docs.stripe.com/customer-management.md) mindestens so, dass Kundinnen und Kunden ihre Zahlungsmethoden aktualisieren können.

## Eine Portalsitzung erstellen [Server]

Definieren Sie einen Endpoint, der [die Kundenportalsitzung erstellt](https://docs.stripe.com/api/customer_portal/sessions/create.md), die Ihr Frontend aufruft. Die `CUSTOMER_ID` bezieht sich auf die von einer Checkout-Sitzung erstellte Kunden-ID, die Sie bei der Verarbeitung des Ereignisses `checkout.session.completed` gespeichert haben. Sie können auch einen Standard-Weiterleitungslink für das Portal im Dashboard festlegen.

Übergeben Sie einen optionalen `return_url`-Wert für die Seite auf Ihrer Website, auf die Ihre Kund/innen nach der Verwaltung ihres Abos weitergeleitet werden:

#### Accounts&nbsp;v2

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

# This is the URL that users are redirected to after they're done
# managing their billing.
return_url = '{{DOMAIN_URL}}' # Beispiel: http://example.com
customer_account_id = '{{CUSTOMER_ACCOUNT_ID}}' # Beispiel: acct_GBV60HKsE0mb5v

session = Stripe::BillingPortal::Session.create({
  customer_account: customer_account_id,
  return_url: return_url,
})

# Redirect to the URL for the session
#   redirect session.url, 303
```

#### Customers&nbsp;v1

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

# This is the URL that users are redirected to after they're done
# managing their billing.
return_url = '{{DOMAIN_URL}}' # Beispiel: http://example.com
customer_id = '{{CUSTOMER_ID}}' # Beispiel: cus_GBV60HKsE0mb5v

session = client.v1.billing_portal.sessions.create({
  customer: customer_id,
  return_url: return_url,
})

# Redirect to the URL for the session
#   redirect session.url, 303
```

## Kunden zum Kundenportal senden [Client]

Fügen Sie im Frontend eine Schaltfläche auf der Seite unter der `success_url` hinzu, die auf das Kundenportal verweist:

```html
<html>
  <head>
    <title>Manage Billing</title>
  </head>
  <body>
    <form action="/customer-portal" method="POST">
      <!-- Note: If using PHP set the action to /customer-portal.php -->
      <button type="submit">Manage Billing</button>
    </form>
  </body>
</html>
```

Nach dem Verlassen des Kundenportals kehren die Kund/innen über die `return_url` auf Ihre Website zurück. Fahren Sie fort mit [Ereignisse überwachen](https://docs.stripe.com/billing/subscriptions/webhooks.md), um den Abo-Status der Kund/innen zu tracken.

Wenn Sie das Kundenportal so konfigurieren, dass Aktionen wie die Kündigung eines Abos zugelassen werden, [überwachen Sie zusätzliche Ereignisse](https://docs.stripe.com/customer-management/integrate-customer-portal.md#webhooks).

## Testen Sie Ihre Integration.

### Zahlungsmethoden testen

Verwenden Sie die folgende Tabelle, um verschiedene Zahlungsmethoden und -szenarien zu testen.

| Zahlungsmethode  | Szenario                                                                                                                                                                                                                                                                                                           | So führen Sie den Test durch                                                                                                                                                                                          |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| BECS-Lastschrift | Ihr/e Kund/in zahlt erfolgreich mit dem BECS-Lastschriftverfahren.                                                                                                                                                                                                                                                 | Füllen Sie das Formular mit der Kontonummer `900123456` und BSB `000000` aus. Der bestätigte PaymentIntent geht zunächst in den Status `processing` über und dann drei&nbsp;Minuten später in den Status `succeeded`. |
| BECS-Lastschrift | Die Zahlung Ihres/Ihrer Kund/in schlägt fehl mit Code `account_closed` fehl.                                                                                                                                                                                                                                       | Füllen Sie das Formular mit der Kontonummer `111111113` und BSB `000000` aus.                                                                                                                                         |
| Kreditkarte      | Die Kartenzahlung ist erfolgreich, und es ist keine Authentifizierung erforderlich.                                                                                                                                                                                                                                | Füllen Sie das Kreditkartenformular aus und geben Sie die Kreditkartennummer `4242 4242 4242 4242` mit beliebiger Gültigkeitsdauer, CVC und Postleitzahl an.                                                          |
| Kreditkarte      | Für die Kartenzahlung ist eine *Authentifizierung* (Strong Customer Authentication (SCA) is a regulatory requirement in effect as of September 14, 2019, that impacts many European online payments. It requires customers to use two-factor authentication like 3D Secure to verify their purchase) erforderlich. | Füllen Sie das Kreditkartenformular aus und geben Sie die Kreditkartennummer `4000 0025 0000 3155` mit beliebiger Gültigkeitsdauer, CVC und Postleitzahl an.                                                          |
| Kreditkarte      | Die Karte wird mit einem Ablehnungscode wie `insufficient_funds` abgelehnt.                                                                                                                                                                                                                                        | Füllen Sie das Kreditkartenformular aus und geben Sie die Kreditkartennummer `4000 0000 0000 9995` mit beliebiger Gültigkeitsdauer, CVC und Postleitzahl an.                                                          |
| SEPA-Lastschrift | Ihr/e Kund/in zahlt erfolgreich mit dem SEPA-Lastschriftverfahren.                                                                                                                                                                                                                                                 | Füllen Sie das Formular mit der Kontonummer `AT321904300235473204` aus. Die bestätigte PaymentIntent geht zunächst in den Status „wird verarbeitet“ und dann drei Minuten später in den Status „erfolgreich“ über.    |
| SEPA-Lastschrift | Der Status der PaymentIntent Ihrer Kundin/Ihre Kundin wechselt von `processing` zu `requires_payment_method`.                                                                                                                                                                                                      | Füllen Sie das Formular mit der Kontonummer `AT861904300235473202` aus.                                                                                                                                               |

### Ereignisse überwachen

Richten Sie Webhooks ein, um Änderungsereignisse für Abos wie Upgrades und Kündigungen zu überwachen. Sie können [Webhook-Ereignisse für Abos](https://docs.stripe.com/billing/subscriptions/webhooks.md) im [Dashboard](https://dashboard.stripe.com/test/events) oder mit [Stripe CLI](https://docs.stripe.com/webhooks.md#test-webhook) anzeigen.

Erfahren Sie mehr über das [Testen Ihrer Abrechnungsintegration](https://docs.stripe.com/billing/testing.md).

## See also

- [Kund/innen einen kostenlosen Testzeitraum anbieten](https://docs.stripe.com/billing/subscriptions/trials.md)
- [Rabatte anwenden](https://docs.stripe.com/billing/subscriptions/coupons.md#using-coupons-in-checkout)
- [Anteilmäßige Verrechnung verwalten](https://docs.stripe.com/billing/subscriptions/prorations.md)
- [Berechtigungen integrieren, um den Zugriff auf die Funktionen Ihres Produkts zu verwalten](https://docs.stripe.com/billing/entitlements.md)


#### Eingebettetes Formular

# Eingebettete Seite

> This is a Eingebettete Seite for when platform is web and ui is embedded-form. View the full page at https://docs.stripe.com/billing/subscriptions/build-subscriptions?platform=web&ui=embedded-form.

#### Integrationsaufwand
Complexity: 2/5
#### Anpassung der Nutzeroberfläche

Passen Sie das Erscheinungsbild an.

#### Integrationstyp

Verwenden Sie vorgefertigte, integrierte Formulare, um Zahlungen einzuziehen und *Abonnements* (A Subscription represents the product details associated with the plan that your customer subscribes to. Allows you to charge the customer on a recurring basis) zu verwalten.

## Server einrichten

### Stripe einrichten

Installieren Sie den Stripe-Client Ihrer Wahl:

#### Ruby

```bash
# Available as a gem
sudo gem install stripe
```

```ruby
# If you use bundler, you can add this line to your Gemfile
gem 'stripe'
```

### Produkt und Preis erstellen

[Wiederkehrende Preismodelle](https://docs.stripe.com/products-prices/pricing-models.md) umfassen die Produkte und Dienstleistungen, die Sie anbieten, die Preise dafür, welche Währungen Sie für Zahlungen verwenden und den Leistungszeitraum (für Abos). Verwenden Sie zum Aufbau des Preismodells [Produkte](https://docs.stripe.com/api/products.md) (was Sie anbieten) und [Preise](https://docs.stripe.com/api/prices.md) (Höhe und Abrechnungsintervall).

In diesem Beispiel wird ein Pauschalpreisdienst mit zwei verschiedenen Service-Optionen verwendet: Basis und Premium. Für jede Service-Option müssen Sie ein Produkt und einen wiederkehrenden Preis erstellen. Um eine einmalige Gebühr, z.&nbsp;B. für die Einrichtung, hinzufügen möchten, erstellen Sie ein drittes Produkt mit einem einmaligen Preis.

Jedes Produkt wird in monatlichen Intervallen abgerechnet. Der Preis für das Basisprodukt beträgt 5&nbsp;USD. Der Preis für das Premiumprodukt beträgt 15 USD. Ein Beispiel mit drei Stufen finden Sie im Leitfaden zu [Pauschalpreismodellen](https://docs.stripe.com/subscriptions/pricing-models/flat-rate-pricing.md).

#### Dashboard

Gehen Sie zur Seite [Produkt hinzufügen](https://dashboard.stripe.com/test/products/create) und erstellen Sie zwei Produkte. Fügen Sie für jedes Produkt einen Preis hinzu, jeweils mit einem monatlich wiederkehrenden Abrechnungszeitraum:

- Premium-Produkt: Premium-Dienstleistung mit zusätzlichen Funktionen

  - Preis: Pauschalpreis&nbsp;|&nbsp;15 USD

- Basic-Produkt: Basic-Dienstleistung mit minimalem Funktionsumfang

  - Preis: Pauschalpreis&nbsp;|&nbsp;5 USD

Zeichnen Sie nach Erstellung der Preise die Preis-IDs auf, sodass diese in anderen Schritten verwendet werden können. Preis-IDs sehen in etwa wie folgt aus: `price_G0FvDp6vZvdwRZ`.

Wenn Sie bereit sind, verwenden Sie die Schaltfläche **In Live-Modus kopieren** oben rechts auf der Seite, um Ihr Produkt aus der [Sandbox in den Live-Modus zu kopieren](https://docs.stripe.com/keys.md#test-live-modes).

#### API

Sie können die API zum Erstellen der [Produkte](https://docs.stripe.com/api/products.md) und [Preise](https://docs.stripe.com/api/prices.md) verwenden.

Premiumprodukt erstellen:

```curl
curl https://api.stripe.com/v1/products \
  -u "<<YOUR_SECRET_KEY>>:" \
  --data-urlencode "name=Billing Guide: Premium Service" \
  -d "description=Premium service with extra features"
```

Basisprodukt erstellen:

```curl
curl https://api.stripe.com/v1/products \
  -u "<<YOUR_SECRET_KEY>>:" \
  --data-urlencode "name=Billing Guide: Basic Service" \
  -d "description=Basic service with minimum features"
```

Zeichnen Sie Preis-ID für jedes Produkt auf. Die Preis-IDs sehen in etwa wie folgt aus:

```json
{
  "id": "prod_H94k5odtwJXMtQ",
  "object": "product",
  "active": true,
  "attributes": [

  ],
  "created": 1587577341,
  "description": "Premium service with extra features",
  "images": [

  ],
  "livemode": false,
  "metadata": {
  },
  "name": "Billing Guide: Premium Service",
  "statement_descriptor": null,
  "type": "service",
  "unit_label": null,
  "updated": 1587577341
}
```

Verwenden Sie die Produkt-IDs, um einen Preis für jedes Produkt zu erstellen. Die Zahl [unit_amount](https://docs.stripe.com/api/prices/object.md#price_object-unit_amount) wird in Cent angegeben, also z.&nbsp;B.`1500` = 15 USD.

Premiumpreis erstellen:

```curl
curl https://api.stripe.com/v1/prices \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d product={{PREMIUM_PRODUCT_ID}} \
  -d unit_amount=1500 \
  -d currency=usd \
  -d "recurring[interval]=month"
```

Basispreis erstellen:

```curl
curl https://api.stripe.com/v1/prices \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d product={{BASIC_PRODUCT_ID}} \
  -d unit_amount=500 \
  -d currency=usd \
  -d "recurring[interval]=month"
```

Zeichnen Sie Preis-ID für jeden Preis auf, sodass diese in nachfolgenden Schritten verwendet werden können. Die Preis-IDs sehen in etwa wie folgt aus:

```json
{
  "id": "price_HGd7M3DV3IMXkC",
  "object": "price",
  "product": "prod_HGd6W1VUqqXGvr",
  "type": "recurring",
  "currency": "usd",
  "recurring": {
    "interval": "month",
    "interval_count": 1,
    "trial_period_days": null,
    "usage_type": "licensed"
  },
  "active": true,
  "billing_scheme": "per_unit",
  "created": 1589319695,
  "livemode": false,
  "lookup_key": null,
  "metadata": {},
  "nickname": null,
  "unit_amount": 1500,
  "unit_amount_decimal": "1500",
  "tiers": null,
  "tiers_mode": null,
  "transform_quantity": null
}
```

Wenn Sie mehrere Rechnungsstellungszeiträume anbieten, verwenden Sie Checkout, um Kundinnen und Kunden längere Rechnungsstellungszeiträume als [Upsell](https://docs.stripe.com/payments/checkout/upsells.md) anzubieten und mehr Umsatz im Voraus zu erzielen.

Weitere Preismodelle finden Sie unter [Abrechnungsbeispiele](https://docs.stripe.com/products-prices/pricing-models.md).

### 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.

Übergeben Sie beim Erstellen der [Checkout-Sitzung](https://docs.stripe.com/api/checkout/sessions/create.md) die folgenden Parameter:

- Um das Zahlungsformular „embedded_page“ zu verwenden, setzen Sie [ui_mode](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-ui_mode) auf `embedded`.
- Um Abos beim Bezahlvorgang Ihrer Kundin/Ihres Kunden zu erstellen, setzen Sie [mode](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-mode) auf `subscription`.
- Um die Seite zu definieren, zu der Ihre Kund/innen nach Abschluss bzw. Versuch der Zahlung zurückkehren, geben Sie eine [return_url](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-return_url) an. Fügen Sie die Vorlagenvariable `{CHECKOUT_SESSION_ID}` in die URL ein. Checkout ersetzt die Variable durch die Checkout-Sitzungs-ID, bevor Ihre Kund/innen weitergeleitet werden. Die Rückkehrseite erstellen und hosten Sie auf Ihrer Website.
- Um Ihre Abo- und Kündigungsbedingungen sowie einen Link bereitzustellen, über den Ihre Kundinnen und Kunden ihr Abo aktualisieren oder kündigen können, verwenden Sie optional einen [benutzerdefinierten Text](https://docs.stripe.com/payments/checkout/custom-components.md?ui=embedded-form#customize-payment-method-reuse-agreement-and-subscription-terms). Wir empfehlen, [E-Mail-Erinnerungen und Benachrichtigungen](https://docs.stripe.com/invoicing/send-email.md#email-configuration) für Ihre Abonnentinnen und Abonnenten zu konfigurieren.

Um Checkout zu verbinden, verwenden Sie das in der Antwort der Checkout-Sitzung zurückgegebene `client_secret`.

```curl
curl https://api.stripe.com/v1/checkout/sessions \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d mode=subscription \
  -d "line_items[0][price]={{PRICE_ID}}" \
  -d "line_items[0][quantity]=1" \
  -d ui_mode=embedded_page \
  --data-urlencode "return_url=https://example.com/checkout/return?session_id={CHECKOUT_SESSION_ID}"
```

## Personalisierte Abonnementseite erstellen [Client]

### Checkout verbinden

#### HTML + JS

#### 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.

Checkout ist als Teil von [Stripe.js](https://docs.stripe.com/js.md) verfügbar. Binden Sie das Stripe.js-Skript in Ihre Seite ein, indem Sie es zum Header Ihrer HTML-Datei hinzufügen. Als Nächstes erstellen Sie einen leeren DOM-Knoten (Container), der zum Verbinden verwendet wird.

```html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title>Accept a payment</title>
    <meta name="description" content="A demo of a payment on Stripe" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link rel="stylesheet" href="style.css" /><!-- Add the Stripe.js script here -->
    <script src="https://js.stripe.com/dahlia/stripe.js"></script>
    <script src="checkout.js" defer></script>
  </head><body>
    <!-- Display a payment form -->
      <div id="checkout">
        <!-- Checkout inserts the payment form here -->
      </div>
  </body>
</html>
```

#### Stripe.js initialisieren

Initialisieren Sie Stripe.js mit Ihrem veröffentlichungsfähigen API-Schlüssel.

#### Client-Geheimnis der 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.

#### Bezahlvorgang initialisieren

Initialisieren Sie Checkout mit Ihrer `fetchClientSecret`-Funktion und verbinden Sie sie mit dem Platzhalter `<div>` in Ihrem Zahlungsformular. Checkout wird in einem iFrame gerendert, der Zahlungsinformationen 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.

```javascript
// Initialize Stripe.js
const stripe = Stripe('<<YOUR_PUBLISHABLE_KEY>>');

initialize();

// Fetch Checkout Session and retrieve the client secret
async function initialize() {
  const fetchClientSecret = async () => {
    const response = await fetch("/create-checkout-session", {
      method: "POST",
    });
    const { clientSecret } = await response.json();
    return clientSecret;
  };

  // Initialize Checkout
  const checkout = await stripe.createEmbeddedCheckoutPage({
    fetchClientSecret,
  });

  // Mount Checkout
  checkout.mount('#checkout');
}
```

#### React

#### Stripe zu Ihrer React-App hinzufügen

Installieren Sie [React Stripe.js](https://docs.stripe.com/sdks/stripejs-react.md), um die PCI-Konformität zu gewährleisten, indem sichergestellt wird, dass die Zahlungsdaten direkt an Stripe übermittelt werden und niemals auf Ihrem Server eingehen.

```bash
npm install --save @stripe/react-stripe-js @stripe/stripe-js
```

#### Stripe.js laden

Um die Stripe-Bibliothek zu konfigurieren, rufen Sie `loadStripe()` mit Ihrem veröffentlichungsfähigen Stripe-API-Schlüssel auf. Erstellen Sie einen `EmbeddedCheckoutProvider`. Übergeben Sie das zurückgegebene `Promise` an den Anbieter.

#### Client-Geheimnis der 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.

#### Bezahlvorgang initialisieren

Um den untergeordneten Komponenten den Zugriff auf den Stripe-Dienst über den Verbraucher des eingebetteten Checkouts zu ermöglichen, übergeben Sie das resultierende Promise von `loadStripe` und die Funktion `fetchClientSecret` als `option` an den Anbieter des eingebetteten Checkouts.

```jsx
import * as React 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.
const stripePromise = loadStripe('pk_test_123', {
});

const App = ({fetchClientSecret}) => {
  const options = {fetchClientSecret};

  return (
    <EmbeddedCheckoutProvider
      stripe={stripePromise}
      options={options}
    >
      <EmbeddedCheckout />
    </EmbeddedCheckoutProvider>
  )
}
```

## Eine Rückkehrseite anzeigen

Nachdem Ihre Kund/innen einen Zahlungsversuch unternommen haben, leitet Stripe sie auf eine Rückkehrseite weiter, die Sie auf Ihrer Website hosten. Als Sie die Checkout-Sitzung erstellt haben, haben Sie die URL der Rückkehrseite im Parameter [return_url](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-return_url) angegeben.

> Während der Zahlung leiten einige Zahlungsmethoden die Kund/innen auf eine Zwischenseite weiter, zum Beispiel eine Bankautorisierungsseite. Wenn sie diese Seite ausgefüllt haben, leitet Stripe sie zu Ihrer Rückkehrseite weiter.

#### Endpoint erstellen, um eine Checkout-Sitzung abzurufen

Fügen Sie einen Endpoint hinzu, um den Status einer Checkout-Sitzung mit der Checkout-Sitzungs-ID in der URL abzurufen.

#### Eine Checkout-Sitzung abrufen

Um Details für die Checkout-Sitzung zu verwenden, stellen Sie sofort eine Anfrage an den Endpoint auf Ihrem Server, um mithilfe der Checkout-Sitzungs-ID in der URL den [Status der Checkout-Sitzung abzurufen](https://docs.stripe.com/api/checkout/sessions/retrieve.md), sobald Ihre Rückkehrseite geladen wird.

#### Die Sitzung verarbeiten

Das Ergebnis basierend auf dem Status der Sitzung verarbeiten:

- `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 Ihr/e Kund/in es nochmals versuchen kann.

```js
// Retrieve a Checkout Session
// Use the session ID
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 session = await response.json();
// Handle the session according to its status
  if (session.status == 'open') {
    // Remount embedded Checkout
    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;
    // Show success page
    // Optionally use session.payment_status or session.customer_email
    // to customize the success page
  }
}
```

#### Accounts&nbsp;v2

```javascript
// Add an endpoint to fetch the Checkout Session status
app.get('/session_status', async (req, res) => {
  const session = await stripe.checkout.sessions.retrieve(req.query.session_id);
  const customer_account = await stripe.v2.core.accounts(session.customer_account);

  res.send({
    status: session.status,
    payment_status: session.payment_status,
    customer_email: customer_account.contact_email
  });
});
```

#### Customers&nbsp;v1

```javascript
// Add an endpoint to fetch the Checkout Session status
app.get('/session_status', async (req, res) => {
  const session = await stripe.checkout.sessions.retrieve(req.query.session_id);
  const customer = await stripe.customers.retrieve(session.customer);

  res.send({
    status: session.status,
    payment_status: session.payment_status,
    customer_email: customer.email
  });
});
```

## Optional: Konfigurieren Sie das Kundenportal

Sie können das *Kundenportal* (The customer portal is a secure, Stripe-hosted page that lets your customers manage their subscriptions and billing details) einrichten, damit Ihre Kundinnen/Kunden ihre bestehenden Abonnements und Rechnungen direkt verwalten können.

Sie können das Portal im Dashboard konfigurieren. Um die Abwanderung zu reduzieren, können Sie das Portal so konfigurieren, dass Kundinnen/Kunden ihre Zahlungsmethoden im Falle fehlgeschlagener Zahlungen aktualisieren können.

Damit Ihre Kundinnen/Kunden das Kundenportal leichter finden und ihre Abonnements verwalten können, fügen Sie eine Schaltfläche auf Ihrer Website hinzu. Durch Anklicken dieser Schaltfläche werden diese zu der von Stripe gehosteten Kundenportal-Seite weitergeleitet.

Erfahren Sie mehr über das [Kundenportal](https://docs.stripe.com/customer-management.md) und andere Optionen zur Kundenverwaltung.

#### Eine Portalsitzung erstellen

Um ein Kundenportal hinzuzufügen, definieren Sie einen Endpoint, der [die Kundenportal-Sitzung erstellt](https://docs.stripe.com/api/customer_portal/sessions/create.md), die von Ihrem Frontend aufgerufen wird. Hier steht die von einer Checkout-Sitzung erstellte Kunden/Kundin, die Sie beim Verarbeiten des Webhooks `checkout.session.completed` gespeichert haben. Sie können auch im Dashboard einen Standard-Weiterleitungslink für das Portal festlegen.

Übergeben Sie einen optionalen `return_url`-Wert für die Seite auf Ihrer Website, auf die Ihre Kund/innen nach der Verwaltung ihres Abos weitergeleitet werden:

#### Accounts&nbsp;v2

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

# This is the URL that users are redirected to after they're done
# managing their billing.
return_url = '{{DOMAIN_URL}}' # Beispiel: http://example.com
customer_account_id = '{{CUSTOMER_ACCOUNT_ID}}' # Beispiel: acct_GBV60HKsE0mb5v

session = Stripe::BillingPortal::Session.create({
  customer_account: customer_account_id,
  return_url: return_url,
})

# Redirect to the URL for the session
#   redirect session.url, 303
```

#### Customers&nbsp;v1

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

# This is the URL that users are redirected to after they're done
# managing their billing.
return_url = '{{DOMAIN_URL}}' # Beispiel: http://example.com
customer_id = '{{CUSTOMER_ID}}' # Beispiel: cus_GBV60HKsE0mb5v

session = client.v1.billing_portal.sessions.create({
  customer: customer_id,
  return_url: return_url,
})

# Redirect to the URL for the session
#   redirect session.url, 303
```

#### Kunden zum Kundenportal senden

Fügen Sie im Frontend eine Schaltfläche auf der Seite unter der `success_url` hinzu, die auf das Kundenportal verweist:

```html
<html>
  <head>
    <title>Manage Billing</title>
  </head>
  <body>
    <form action="/customer-portal" method="POST">
      <!-- Note: If using PHP set the action to /customer-portal.php -->
      <button type="submit">Manage Billing</button>
    </form>
  </body>
</html>
```

Nach dem Verlassen des Kundenportals kehren die Kund/innen über die `return_url` auf Ihre Website zurück. Fahren Sie fort mit [Ereignisse überwachen](https://docs.stripe.com/billing/subscriptions/webhooks.md), um den Abo-Status der Kund/innen zu tracken.

Wenn Sie das Kundenportal so konfigurieren, dass Aktionen wie die Kündigung eines Abos zugelassen werden, achten Sie darauf, [zusätzliche Ereignisse](https://docs.stripe.com/customer-management/integrate-customer-portal.md#webhooks) zu überwachen.

## Zugriff bereitstellen

Wenn das Abo aktiv ist, gewähren Sie Ihren Nutzer/innen Zugriff auf Ihren Dienst. Überwachen Sie dazu die Ereignisse `customer.subscription.created`, `customer.subscription.updated` und `customer.subscription.deleted`. Diese Ereignisse übergeben ein `Abo`-Objekt, das ein `status`-Feld enthält, das anzeigt, ob das Abo aktiv oder überfällig ist oder gekündigt wurde. Eine vollständige Statusliste finden Sie im [Abonnementlebenszyklus](https://docs.stripe.com/billing/subscriptions/overview.md#subscription-lifecycle). Um den Zugriff auf die Funktion Ihres Produkts zu verwalten, informieren Sie sich über die [Integration von Berechtigungen](https://docs.stripe.com/billing/entitlements.md).

In Ihrem Webhook-Handler:

1. Überprüfen Sie den Status des Abos. Wenn er `active` ist, hat der/die Nutzer/in für Ihr Produkt bezahlt.
1. Prüfen Sie das Produkt, das die Kundin/der Kunde abonniert hat, und gewähren Sie Zugang zu Ihrem Dienst. Das Überprüfen des Produkts anstelle des Preises gibt Ihnen mehr Flexibilität, falls Sie die Preisgestaltung oder den Rechnungsstellungszeitraum ändern müssen.
1. Speichern Sie die `product.id`, `Abonnement.id` und den `Abonnement.status` in Ihrer Datenbank zusammen mit der bereits gespeicherten `customer_account.id` oder der `customer.id`. Überprüfen Sie diesen Datensatz, wenn Sie entscheiden, welche Funktionen für die Nutzer/innen Ihrer Anwendung aktiviert werden sollen.

Der Status eines Abos kann sich während seiner Laufzeit jederzeit ändern, auch wenn Ihre Anwendung keine direkten Aufrufe an Stripe tätigt. So kann beispielsweise eine Verlängerung aufgrund einer abgelaufenen Karte fehlschlagen, wodurch das Abo in einen überfälligen Status versetzt wird. Oder, wenn Sie das [Kundenportal](https://docs.stripe.com/customer-management.md) implementieren, könnte ein/e Nutzer/in das Abo kündigen, ohne Ihre Anwendung direkt aufzurufen. Durch die korrekte Implementierung Ihres Handlers bleibt der Status Ihrer Anwendung mit Stripe synchronisiert.

## Testen Sie Ihre Integration.

### Zahlungsmethoden testen

Verwenden Sie die folgende Tabelle, um verschiedene Zahlungsmethoden und -szenarien zu testen.

| Zahlungsmethode  | Szenario                                                                                                                                                                                                                                                                                                           | So führen Sie den Test durch                                                                                                                                                                                          |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| BECS-Lastschrift | Ihr/e Kund/in zahlt erfolgreich mit dem BECS-Lastschriftverfahren.                                                                                                                                                                                                                                                 | Füllen Sie das Formular mit der Kontonummer `900123456` und BSB `000000` aus. Der bestätigte PaymentIntent geht zunächst in den Status `processing` über und dann drei&nbsp;Minuten später in den Status `succeeded`. |
| BECS-Lastschrift | Die Zahlung Ihres/Ihrer Kund/in schlägt fehl mit Code `account_closed` fehl.                                                                                                                                                                                                                                       | Füllen Sie das Formular mit der Kontonummer `111111113` und BSB `000000` aus.                                                                                                                                         |
| Kreditkarte      | Die Kartenzahlung ist erfolgreich, und es ist keine Authentifizierung erforderlich.                                                                                                                                                                                                                                | Füllen Sie das Kreditkartenformular aus und geben Sie die Kreditkartennummer `4242 4242 4242 4242` mit beliebiger Gültigkeitsdauer, CVC und Postleitzahl an.                                                          |
| Kreditkarte      | Für die Kartenzahlung ist eine *Authentifizierung* (Strong Customer Authentication (SCA) is a regulatory requirement in effect as of September 14, 2019, that impacts many European online payments. It requires customers to use two-factor authentication like 3D Secure to verify their purchase) erforderlich. | Füllen Sie das Kreditkartenformular aus und geben Sie die Kreditkartennummer `4000 0025 0000 3155` mit beliebiger Gültigkeitsdauer, CVC und Postleitzahl an.                                                          |
| Kreditkarte      | Die Karte wird mit einem Ablehnungscode wie `insufficient_funds` abgelehnt.                                                                                                                                                                                                                                        | Füllen Sie das Kreditkartenformular aus und geben Sie die Kreditkartennummer `4000 0000 0000 9995` mit beliebiger Gültigkeitsdauer, CVC und Postleitzahl an.                                                          |
| SEPA-Lastschrift | Ihr/e Kund/in zahlt erfolgreich mit dem SEPA-Lastschriftverfahren.                                                                                                                                                                                                                                                 | Füllen Sie das Formular mit der Kontonummer `AT321904300235473204` aus. Die bestätigte PaymentIntent geht zunächst in den Status „wird verarbeitet“ und dann drei Minuten später in den Status „erfolgreich“ über.    |
| SEPA-Lastschrift | Der Status der PaymentIntent Ihrer Kundin/Ihre Kundin wechselt von `processing` zu `requires_payment_method`.                                                                                                                                                                                                      | Füllen Sie das Formular mit der Kontonummer `AT861904300235473202` aus.                                                                                                                                               |

### Ereignisse überwachen

Richten Sie Webhooks ein, um Änderungsereignisse für Abos wie Upgrades und Kündigungen zu überwachen. Sie können [Webhook-Ereignisse für Abos](https://docs.stripe.com/billing/subscriptions/webhooks.md) im [Dashboard](https://dashboard.stripe.com/test/events) oder mit [Stripe CLI](https://docs.stripe.com/webhooks.md#test-webhook) anzeigen.

Erfahren Sie mehr über das [Testen Ihrer Abrechnungsintegration](https://docs.stripe.com/billing/testing.md).


#### Elements

#### Checkout Sessions API

#### Integrationsaufwand
Complexity: 3/5
#### Integrationstyp

Komponenten der Nutzeroberfläche in einem nutzerdefinierten Zahlungsablauf kombinieren

#### Anpassung der Nutzeroberfläche

Anpassung auf CSS-Ebene mit der [Appearance API](https://docs.stripe.com/elements/appearance-api.md)

[Ausprobieren](https://checkout.stripe.dev/)

Erstellen Sie ein benutzerdefiniertes Zahlungsformular mit [Stripe Elements](https://docs.stripe.com/payments/elements.md) und der [Checkout Sessions API](https://docs.stripe.com/api/checkout/sessions.md), um *Abos* (A Subscription represents the product details associated with the plan that your customer subscribes to. Allows you to charge the customer on a recurring basis) mit festen Preisen zu verkaufen. [Vergleichen Sie diese Integration](https://docs.stripe.com/payments/online-payments.md#compare-features-and-availability) mit den anderen Integrationstypen von Stripe.

Die Checkout Sessions API bietet integrierte Unterstützung für Steuerberechnungen, Rabatte, Versand und Währungsumrechnung, wodurch sich der Aufwand für die Erstellung von benutzerdefiniertem Code reduziert. Dies ist der empfohlene Ansatz für die meisten Integrationen. Erfahren Sie mehr darüber, [wann Sie Checkout-Sitzungen anstelle von PaymentIntents verwenden sollten](https://docs.stripe.com/payments/checkout-sessions-and-payment-intents-comparison.md).

Sollten Sie kein benutzerdefiniertes Zahlungsformular erstellen wollen, können Sie die gehostete Version von Checkout integrieren. Eine ausführliche Version dieser End-to-End-Integrationsanleitung finden Sie im [Schnellstart](https://docs.stripe.com/billing/quickstart.md) für die Abrechnung.

Wenn Sie zur Codierung einer Integration nicht bereit sind, können Sie einfache Abos [manuell im Dashboard](https://docs.stripe.com/no-code/subscriptions.md) einrichten. Sie können auch [Payment Links](https://docs.stripe.com/payment-links.md) nutzen, um Abos ohne das Schreiben von Code einzurichten. Lesen Sie mehr zum Thema [Entwerfen einer Integration](https://docs.stripe.com/billing/subscriptions/design-an-integration.md), um zu verstehen, welche Entscheidungen Sie treffen müssen und welche Ressourcen Sie benötigen.

## Sie werden Folgendes entwickeln

Dieser Leitfaden bietet Informationen zu den folgenden Vorgehensweisen:

- Modellieren Sie Ihr Unternehmen, indem Sie einen Produktkatalog erstellen.
- Entwickeln Sie einen Anmeldeprozess, durch den ein/e Kund/in erstellt wird.
- Abos erstellen und Zahlungsinformationen erfassen.
- Den Status der Zahlung und des Abos testen und überwachen.
- Kunden ihren Plan ändern oder das Abo kündigen lassen.

### API-Objekt-Definitionen

| Ressource                                                                                                                                 | Definition                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| ----------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Als Kunde/Kundin konfiguriertes Konto](https://docs.stripe.com/api/v2/core/accounts/create.md#v2_create_accounts-configuration-customer) | Stellt in der Accounts v2 API eine Kundin/einen Kunden dar, die/der ein Abonnement erwirbt. Konfigurieren Sie ein `Account`-Objekt als Kundin/Kunde und verknüpfen Sie es mit einem Abonnement, um wiederkehrende Zahlungen zu erheben und nachzuverfolgen sowie die abonnierten Produkte zu verwalten. Weitere Informationen finden Sie im [Leitfaden zur Verwendung von Accounts als Kundin/Kunde](https://docs.stripe.com/connect/use-accounts-as-customers.md).                                                                                     |
| [Kundin/Kunde](https://docs.stripe.com/api/customers.md)                                                                                  | Stellt eine Kundin/einen Kundin in der Customers API dar, die/der ein Abonnement erwirbt. Verwenden Sie das mit einem Abonnement verknüpfte `Customer`-Objekt, um wiederkehrende Zahlungen durchzuführen und zu verfolgen und die abonnierten Produkte zu verwalten.                                                                                                                                                                                                                                                                                    |
| [Berechtigung](https://docs.stripe.com/api/entitlements/active-entitlement.md)                                                            | Stellt den Zugriff eines Kunden/einer Kundin auf eine Funktion dar, die in einem Dienstleistungsprodukt enthalten ist, das er/sie abonniert hat. Wenn Sie ein Abonnement für den wiederkehrenden Kauf eines Produkts durch einen Kunden/eine Kundin erstellen, wird automatisch eine aktive Berechtigung für jede diesem Produkt zugeordnete Funktion erstellt. Wenn ein Kunde/eine Kundin auf Ihre Dienstleistungen zugreift, verwenden Sie seine/ihre aktiven Berechtigungen, um die in seinem/ihrem Abonnement enthaltenen Funktionen zu aktivieren. |
| [Funktion](https://docs.stripe.com/api/entitlements/feature.md)                                                                           | Stellt eine Funktion oder Fähigkeit dar, auf die Ihre Kundinnen und Kunden zugreifen können, wenn sie ein Dienstleistungsprodukt abonnieren. Sie können Funktionen in ein Produkt einfügen, indem Sie ProductFeatures erstellen.                                                                                                                                                                                                                                                                                                                        |
| [Rechnung](https://docs.stripe.com/api/invoices.md)                                                                                       | Eine Aufstellung der Beträge, die ein Kunde/eine Kundin schuldet, die den Zahlungsstatus vom Entwurf bis zur Bezahlung oder anderweitigem Abschluss verfolgt. Bei Abonnements werden automatisch Rechnungen erstellt.                                                                                                                                                                                                                                                                                                                                   |
| [PaymentIntent](https://docs.stripe.com/api/payment_intents.md)                                                                           | Eine Möglichkeit zum Erstellen dynamischer Zahlungsabläufe. Mit einem PaymentIntent wird der Lebenszyklus der Bezahlvorgänge von Kundinnen/Kunden verfolgt, und es werden zusätzliche Authentifizierungsschritte ausgelöst, wenn dies aufgrund von gesetzlichen Vorschriften, nutzerdefinierten Radar-Betrugsregeln oder auf Weiterleitung basierenden Zahlungsmethoden erforderlich ist. Rechnungen erstellen automatisch PaymentIntents.                                                                                                              |
| [PaymentMethod](https://docs.stripe.com/api/payment_methods.md)                                                                           | Die Zahlungsmethoden einer Kundin/eines Kunden, mit denen sie/er für Ihre Produkte bezahlt. Sie können beispielsweise eine Kreditkarte in einem kundenkonfigurierten `Account` oder `Customer` speichern und damit wiederkehrende Zahlungen für diese Kundin/diesen Kunden/ vornehmen. Wird in der Regel mit der Payment Intents API oder der Setup Intents API verwendet.                                                                                                                                                                              |
| [Preis](https://docs.stripe.com/api/prices.md)                                                                                            | Definiert den Stückpreis, die Währung und den Rechnungszyklus für ein Produkt.                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| [Produkt](https://docs.stripe.com/api/products.md)                                                                                        | Eine Ware oder Dienstleistung, die Ihr Unternehmen verkauft. Ein Dienstleistungsprodukt kann eine oder mehrere Funktionen beinhalten.                                                                                                                                                                                                                                                                                                                                                                                                                   |
| [ProductFeature](https://docs.stripe.com/api/product-feature.md)                                                                          | Stellt die Aufnahme einer einzelnen Funktion in ein einzelnes Produkt dar. Jedes Produkt ist für jede Funktion, die es enthält, mit einer ProductFeature verknüpft, und jede Funktion ist für jedes Produkt, das sie enthält, mit einer ProductFeature verknüpft.                                                                                                                                                                                                                                                                                       |
| [Abonnement](https://docs.stripe.com/api/subscriptions.md)                                                                                | Stellt den geplanten wiederkehrenden Kauf eines Produkts durch einen Kunden/eine Kundin dar. Verwenden Sie ein Abonnement, um Zahlungen einzuziehen und eine wiederholte Lieferung oder einen kontinuierlichen Zugriff auf ein Produkt zu ermöglichen.                                                                                                                                                                                                                                                                                                  |

Hier ist ein Beispiel dafür, wie Produkte, Funktionen und Berechtigungen zusammen funktionieren. Stellen Sie sich vor, Sie möchten einen wiederkehrenden Service einrichten, der zwei Stufen anbietet: ein Standard-Produkt mit grundlegenden Funktionalitäten und ein erweitertes Produkt, das erweiterte Funktionalitäten bietet.

1. Sie erstellen zwei Funktionen: `basic_features` und `extended_features`.
1. Sie erstellen zwei Produkte: `standard_product` und `advanced_product`.
1. Für das Standardprodukt erstellen Sie eine ProductFeature, die `basic_features` mit `standard_product` verknüpft.
1. Für das erweiterte Produkt erstellen Sie zwei ProductFeatures: eine, die `basic_features` mit `advanced_product` verknüpft, und eine, die `extended_features` mit `advanced_product` verknüpft.

Ein Kunde/eine Kundin, `first_customer`, abonniert das Standardprodukt. Wenn Sie das Abonnement erstellen, erstellt Stripe automatisch eine Berechtigung, die `first_customer` mit `basic_features` verknüpft.

Ein anderer Kunde/eine andere Kundin, `second_customer`, abonniert das erweiterte Produkt. Wenn Sie das Abonnement erstellen, erstellt Stripe automatisch zwei Berechtigungen: eine, die `second_customer` mit `basic_features` verknüpft, und eine, die `second_customer` mit `extended_features` verknüpft.

Sie können festlegen, welche Funktionen für einen Kunden/eine Kundin bereitgestellt werden sollen, indem Sie [seine/ihre aktiven Berechtigungen abrufen oder das Ereignis mit der Zusammenfassung der aktiven Berechtigungen überwachen](https://docs.stripe.com/billing/entitlements.md#entitlements). Sie müssen ihre Abonnements, Produkte und Funktionen nicht abrufen.

## Stripe einrichten

Installieren Sie den Stripe-Client Ihrer Wahl:

#### Ruby

```bash
# Available as a gem
sudo gem install stripe
```

```ruby
# If you use bundler, you can add this line to your Gemfile
gem 'stripe'
```

Installieren Sie dann die Stripe-CLI. Mit der Stripe-CLI können Sie Webhooks testen und Stripe-APIs aufrufen. In einem späteren Abschnitt dieses Leitfadens wird erklärt, wie Sie mithilfe der CLI ein Preismodell einrichten können.
Weitere Installationsoptionen finden Sie unter [Mit der Stripe-CLI loslegen](https://docs.stripe.com/stripe-cli.md).
## Preismodell erstellen [Stripe-CLI oder Dashboard]

[Wiederkehrende Preismodelle](https://docs.stripe.com/products-prices/pricing-models.md) umfassen die Produkte und Dienstleistungen, die Sie anbieten, die Preise dafür, welche Währungen Sie für Zahlungen verwenden und den Leistungszeitraum (für Abos). Verwenden Sie zum Aufbau des Preismodells [Produkte](https://docs.stripe.com/api/products.md) (was Sie anbieten) und [Preise](https://docs.stripe.com/api/prices.md) (Höhe und Abrechnungsintervall).

In diesem Beispiel wird ein Pauschalpreisdienst mit zwei verschiedenen Service-Optionen verwendet: Basis und Premium. Für jede Service-Option müssen Sie ein Produkt und einen wiederkehrenden Preis erstellen. Um eine einmalige Gebühr, z.&nbsp;B. für die Einrichtung, hinzufügen möchten, erstellen Sie ein drittes Produkt mit einem einmaligen Preis.

Jedes Produkt wird in monatlichen Intervallen abgerechnet. Der Preis für das Basisprodukt beträgt 5&nbsp;USD. Der Preis für das Premiumprodukt beträgt 15 USD. Ein Beispiel mit drei Stufen finden Sie im Leitfaden zu [Pauschalpreismodellen](https://docs.stripe.com/subscriptions/pricing-models/flat-rate-pricing.md).

#### Dashboard

Gehen Sie zur Seite [Produkt hinzufügen](https://dashboard.stripe.com/test/products/create) und erstellen Sie zwei Produkte. Fügen Sie für jedes Produkt einen Preis hinzu, jeweils mit einem monatlich wiederkehrenden Abrechnungszeitraum:

- Premium-Produkt: Premium-Dienstleistung mit zusätzlichen Funktionen

  - Preis: Pauschalpreis&nbsp;|&nbsp;15 USD

- Basic-Produkt: Basic-Dienstleistung mit minimalem Funktionsumfang

  - Preis: Pauschalpreis&nbsp;|&nbsp;5 USD

Zeichnen Sie nach Erstellung der Preise die Preis-IDs auf, sodass diese in anderen Schritten verwendet werden können. Preis-IDs sehen in etwa wie folgt aus: `price_G0FvDp6vZvdwRZ`.

Wenn Sie bereit sind, verwenden Sie die Schaltfläche **In Live-Modus kopieren** oben rechts auf der Seite, um Ihr Produkt aus der [Sandbox in den Live-Modus zu kopieren](https://docs.stripe.com/keys.md#test-live-modes).

#### API

Sie können die API zum Erstellen der [Produkte](https://docs.stripe.com/api/products.md) und [Preise](https://docs.stripe.com/api/prices.md) verwenden.

Premiumprodukt erstellen:

```curl
curl https://api.stripe.com/v1/products \
  -u "<<YOUR_SECRET_KEY>>:" \
  --data-urlencode "name=Billing Guide: Premium Service" \
  -d "description=Premium service with extra features"
```

Basisprodukt erstellen:

```curl
curl https://api.stripe.com/v1/products \
  -u "<<YOUR_SECRET_KEY>>:" \
  --data-urlencode "name=Billing Guide: Basic Service" \
  -d "description=Basic service with minimum features"
```

Zeichnen Sie Preis-ID für jedes Produkt auf. Die Preis-IDs sehen in etwa wie folgt aus:

```json
{
  "id": "prod_H94k5odtwJXMtQ",
  "object": "product",
  "active": true,
  "attributes": [

  ],
  "created": 1587577341,
  "description": "Premium service with extra features",
  "images": [

  ],
  "livemode": false,
  "metadata": {
  },
  "name": "Billing Guide: Premium Service",
  "statement_descriptor": null,
  "type": "service",
  "unit_label": null,
  "updated": 1587577341
}
```

Verwenden Sie die Produkt-IDs, um einen Preis für jedes Produkt zu erstellen. Die Zahl [unit_amount](https://docs.stripe.com/api/prices/object.md#price_object-unit_amount) wird in Cent angegeben, also z.&nbsp;B.`1500` = 15 USD.

Premiumpreis erstellen:

```curl
curl https://api.stripe.com/v1/prices \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d product={{PREMIUM_PRODUCT_ID}} \
  -d unit_amount=1500 \
  -d currency=usd \
  -d "recurring[interval]=month"
```

Basispreis erstellen:

```curl
curl https://api.stripe.com/v1/prices \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d product={{BASIC_PRODUCT_ID}} \
  -d unit_amount=500 \
  -d currency=usd \
  -d "recurring[interval]=month"
```

Zeichnen Sie Preis-ID für jeden Preis auf, sodass diese in nachfolgenden Schritten verwendet werden können. Die Preis-IDs sehen in etwa wie folgt aus:

```json
{
  "id": "price_HGd7M3DV3IMXkC",
  "object": "price",
  "product": "prod_HGd6W1VUqqXGvr",
  "type": "recurring",
  "currency": "usd",
  "recurring": {
    "interval": "month",
    "interval_count": 1,
    "trial_period_days": null,
    "usage_type": "licensed"
  },
  "active": true,
  "billing_scheme": "per_unit",
  "created": 1589319695,
  "livemode": false,
  "lookup_key": null,
  "metadata": {},
  "nickname": null,
  "unit_amount": 1500,
  "unit_amount_decimal": "1500",
  "tiers": null,
  "tiers_mode": null,
  "transform_quantity": null
}
```

## Kundin/Kunden erstellen [Client und Server]

Stripe benötigt für jedes Abonnement einen Kunden bzw. eine Kundin. Erfassen Sie in der Nutzeroberfläche Ihrer Anwendung alle erforderlichen Informationen von Ihren Nutzerinnen und Nutzern und leiten Sie diese an das Backend weiter.

Wenn Sie Adressdaten erfassen müssen, können Sie mit dem Adresselement eine Liefer- oder Rechnungsadresse für Ihre Kundinnen und Kunden erfassen. Weitere Informationen zum Adresselement finden Sie auf der Seite [Adresselement](https://docs.stripe.com/elements/address-element.md).

```html
<form id="signup-form">
  <label>
    Email
    <input id="email" type="email" placeholder="Email address" value="test@example.com" required />
  </label>

  <button type="submit">
    Register
  </button>
</form>
```

```javascript
const emailInput = document.querySelector('#email');

fetch('/create-customer', {
  method: 'post',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    email: emailInput.value,
  }),
}).then(r => r.json());
```

Erstellen Sie auf dem Server ein Objekt, das den Kunden bzw. die Kundin repräsentiert. Dies kann entweder ein vom Kunden oder von der Kundin konfiguriertes `Konto`-Objekt oder ein `Kunden`-Objekt sein. Speichern Sie die ID des Objekts, um sie in der Checkout-Sitzung zu verwenden.

> #### Verwenden Sie die Accounts&nbsp;v2 API zum Darstellen von Kundinnen und Kunden
> 
> The Accounts v2 API is generally available for Connect users, and in public preview for other Stripe users. If you’re part of the Accounts v2 preview, you need to specify a [specify a preview version](https://docs.stripe.com/api-v2-overview.md#sdk-and-api-versioning) in your code.
> 
> To request access to the Accounts v2 preview, 
> 
> Für die meisten Anwendungsfälle empfehlen wir, [Ihre Kundinnen und Kunden als vom Kunden bzw. von der Kundin konfigurierte Account-Objekte abzubilden](https://docs.stripe.com/connect/use-accounts-as-customers.md), anstatt das [Kundenobjekt](https://docs.stripe.com/api/customers.md) zu verwenden.

#### Accounts&nbsp;v2

```curl
curl -X POST https://api.stripe.com/v2/core/accounts \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-03-25.preview" \
  --json '{
    "contact_email": "jenny.rosen@example.com",
    "display_name": "Jenny Rosen",
    "identity": {
        "individual": {
            "given_name": "Jenny Rosen",
            "address": {
                "city": "San Francisco",
                "country": "US",
                "line1": "123 Main Street",
                "postal_code": "94605",
                "state": "CA"
            }
        }
    },
    "configuration": {
        "customer": {
            "capabilities": {
                "automatic_indirect_tax": {
                    "requested": true
                }
            },
            "shipping": {
                "address": {
                    "city": "San Francisco",
                    "country": "US",
                    "line1": "123 Main Street",
                    "postal_code": "94605",
                    "state": "CA"
                }
            }
        }
    },
    "include": [
        "configuration.customer",
        "identity"
    ]
  }'
```

#### Customers&nbsp;v1

```curl
curl https://api.stripe.com/v1/customers \
  -u "<<YOUR_SECRET_KEY>>:" \
  --data-urlencode "email=jenny.rosen@example.com" \
  -d "name=Jenny Rosen" \
  -d "shipping[address][city]=San Francisco" \
  -d "shipping[address][country]=US" \
  -d "shipping[address][line1]=123 Main Street" \
  -d "shipping[address][postal_code]=9460" \
  -d "shipping[address][state]=CA" \
  -d "shipping[name]=Jenny Rosen" \
  -d "address[city]=San Francisco" \
  -d "address[country]=US" \
  -d "address[line1]=123 Main Street" \
  -d "address[postal_code]=9460" \
  -d "address[state]=CA"
```

## Checkout-Sitzung erstellen [Server]

Definieren Sie im Backend Ihres Anmeldeformulars einen Endpoint, der [die Sitzung erstellt](https://docs.stripe.com/api/checkout/sessions/create.md), die Ihr Frontend aufrufen kann. Sie benötigen die Preis-ID des Abos, das der/die Kund/in abschließt&nbsp;– Ihr Frontend übergibt diesen Wert.

Wenn Sie in [Schritt 2](https://docs.stripe.com/billing/subscriptions/build-subscriptions.md#create-pricing-model) einen einmaligen Preis erstellt haben, übergeben Sie auch diese Preis-ID. Achten Sie darauf, dass Sie nach dem Erstellen einer Checkout-Sitzung das [Client-Geheimnis](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-client_secret) in der Antwort zurück an den Client übergeben.

> Sie können [lookup_keys](https://docs.stripe.com/products-prices/manage-prices.md#lookup-keys) anstelle von Preis-IDs verwenden, um Preise abzurufen. Ein Beispiel finden Sie in der [Beispielanwendung](https://github.com/stripe-samples/subscription-use-cases/tree/main/fixed-price-subscriptions).

#### Accounts&nbsp;v2

#### Ruby

```ruby
require 'stripe'
require 'sinatra'

# 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.
Stripe.api_key = '<<YOUR_SECRET_KEY>>'
Stripe.api_version = '2026-03-25.dahlia'

set :static, true
set :port, 4242

YOUR_DOMAIN = 'http://localhost:3000'

post '/create-checkout-session' do
  content_type 'application/json'

  session = Stripe::Checkout::Session.create({ui_mode: 'elements',
    # Provide the Account ID of the account you previously created
    customer_account: '{{CUSTOMER_ACCOUNT_ID}}',
    line_items: [{
      # Provide the exact Price ID (for example, price_1234) of the product you want to sell
      price: '{{PRICE_ID}}',
      quantity: 1,
    }],
    mode: 'subscription',
    return_url: YOUR_DOMAIN + '/return?session_id={CHECKOUT_SESSION_ID}',
  })

  { clientSecret: session.client_secret }.to_json
end

```

#### Customers&nbsp;v1

#### Ruby

```ruby
require 'stripe'
require 'sinatra'

# 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_SECRET_KEY>>', stripe_version: '2026-03-25.dahlia')

set :static, true
set :port, 4242

YOUR_DOMAIN = 'http://localhost:3000'

post '/create-checkout-session' do
  content_type 'application/json'

  session = client.v1.checkout.sessions.create({ui_mode: 'elements',
    # Provide the customer ID of the customer you previously created
    customer: '{{CUSTOMER_ID}}',
    line_items: [{
      # Provide the exact Price ID (for example, price_1234) of the product you want to sell
      price: '{{PRICE_ID}}',
      quantity: 1,
    }],
    mode: 'subscription',
    return_url: YOUR_DOMAIN + '/return?session_id={CHECKOUT_SESSION_ID}',
  })

  { clientSecret: session.client_secret }.to_json
end

```

Aktivieren Sie in Ihrem [Dashboard](https://dashboard.stripe.com/settings/payment_methods) die Zahlungsmethoden, die Sie von Ihren Kund/innen akzeptieren möchten. Checkout unterstützt [mehrere Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/payment-method-support.md#product-support).

## Bezahlvorgang initialisieren [Client]

#### HTML + JS

Rufen Sie [initCheckoutElementsSdk](https://docs.stripe.com/js/custom_checkout/init) auf und übergeben Sie `clientSecret`.

`initCheckoutElementsSdk` gibt ein [Checkout](https://docs.stripe.com/js/custom_checkout)-Objekt zurück, das Daten aus der Checkout-Session und Methoden zur Aktualisierung enthält.

Lesen Sie `total` und `lineItems` aus [actions.getSession()](https://docs.stripe.com/js/custom_checkout/session) und zeigen Sie sie in Ihrer Benutzeroberfläche an. So können Sie neue Funktionen mit minimalen Codeänderungen aktivieren. Zum Beispiel erfordert das Hinzufügen [manueller Währungspreise](https://docs.stripe.com/payments/custom/localize-prices/manual-currency-prices.md) keine UI-Änderungen, wenn `total` angezeigt wird.

```html
<div id="checkout-container"></div>
```

```javascript
const clientSecret = fetch('/create-checkout-session', {method: 'POST'})
  .then((response) => response.json())
  .then((json) => json.client_secret);

const checkout = stripe.initCheckoutElementsSdk({clientSecret});
const loadActionsResult = await checkout.loadActions();

if (loadActionsResult.type === 'success') {
  const session = loadActionsResult.actions.getSession();
  const checkoutContainer = document.getElementById('checkout-container');

  checkoutContainer.append(JSON.stringify(session.lineItems, null, 2));
  checkoutContainer.append(document.createElement('br'));
  checkoutContainer.append(`Total: ${session.total.total.amount}`);
}
```

#### React

Umhüllen Sie Ihre Anwendung mit der Komponente [CheckoutElementsProvider](https://docs.stripe.com/js/react_stripe_js/checkout/checkout_provider) und übergeben Sie dabei `clientSecret` und die `Stripe`-Instanz.

```jsx
import React from 'react';
import {CheckoutElementsProvider} from '@stripe/react-stripe-js/checkout';
import CheckoutForm from './CheckoutForm';

const clientSecret = fetch('/create-checkout-session', {method: 'POST'})
  .then((response) => response.json())
  .then((json) => json.client_secret);

const App = () => {
  return (
    <CheckoutElementsProvider
      stripe={stripe}options={{clientSecret}}
    >
      <CheckoutForm />
    </CheckoutElementsProvider>
  );
};

export default App;
```

Greifen Sie auf das [Checkout](https://docs.stripe.com/js/custom_checkout)-Objekt in Ihrer Checkout-Formularkomponente, indem Sie den `useCheckout()`-Hook verwenden. Das `Checkout`-Objekt enthält Daten aus der Checkout-Sitzung und Methoden zu ihrer Aktualisierung.

Lesen Sie `total` und `lineItems` aus dem `Checkout`-Objekt und zeigen Sie sie in Ihrer Benutzeroberfläche an. So können Sie Funktionen mit minimalen Codeänderungen aktivieren. Zum Beispiel erfordert das Hinzufügen [manueller Währungspreise](https://docs.stripe.com/payments/custom/localize-prices/manual-currency-prices.md) keine UI-Änderungen, wenn `total` angezeigt wird.

```jsx
import React from 'react';
import {useCheckout} from '@stripe/react-stripe-js/checkout';

const CheckoutForm = () => {const checkoutState = useCheckout();

  if (checkoutState.type === 'loading') {
    return (
      <div>Loading...</div>
    );
  }

  if (checkoutState.type === 'error') {
    return (
      <div>Error: {checkoutState.error.message}</div>
    );
  }

  return (
    <form>{JSON.stringify(checkoutState.checkout.lineItems, null, 2)}
      {/* A formatted total amount */}
      Total: {checkoutState.checkout.total.total.amount}
    </form>
  );
};
```

## Zahlungsinformationen erfassen [Client]

Erfassen Sie Zahlungsdetails auf dem Client mit dem [Payment Element](https://docs.stripe.com/payments/payment-element.md). Das Payment Element ist eine vorgefertigte Komponente der Nutzeroberfläche, das die Erfassung von Zahlungsdaten für verschiedene Zahlungsmethoden vereinfacht.

Das Payment Element enthält einen iFrame, der Zahlungsinformationen über eine sichere HTTPS-Verbindung an Stripe sendet. Vermeiden Sie es, das Payment Element in einem anderen iFrame zu platzieren, da einige Zahlungsmethoden die Weiterleitung an eine andere Seite zur Zahlungsbestätigung voraussetzen.

Wenn Sie sich für die Verwendung eines Iframes entscheiden und Apple Pay oder Google Pay akzeptieren möchten, muss das Attribut [Zulassen](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#attr-allowpaymentrequest) des Iframes auf `"payment*"` gesetzt sein.

Die Adresse der Bezahlseite muss mit `https://` beginnen, nicht mit `http://`, damit Ihre Integration funktioniert. Sie können Ihre Integration ohne HTTPS testen. Denken Sie jedoch daran, dieses zu [aktivieren](https://docs.stripe.com/security/guide.md#tls), wenn Sie bereit sind, Live-Zahlungen zu akzeptieren.

#### HTML + JS

Erstellen Sie zunächst ein Container-DOM-Element, um das [Payment Element](https://docs.stripe.com/payments/payment-element.md) zu verbinden. Erstellen Sie dann eine Instanz des `Payment Element` mit [checkout.createPaymentElement](https://docs.stripe.com/js/custom_checkout/create_payment_element) und verbinden Sie es durch Aufrufen von [element.mount](https://docs.stripe.com/js/element/mount), wobei Sie entweder einen CSS-Selektor oder das Container-DOM-Element angeben.

```html
<div id="payment-element"></div>
```

```javascript
const paymentElement = checkout.createPaymentElement();
paymentElement.mount('#payment-element');
```

Die unterstützten Optionen finden Sie in der [Stripe.js-Dokumentation](https://docs.stripe.com/js/custom_checkout/create_payment_element#custom_checkout_create_payment_element-options).

Sie können das [Erscheinungsbild](https://docs.stripe.com/payments/checkout/customization/appearance.md) aller Elements anpassen, indem Sie [elementsOptions.appearance](https://docs.stripe.com/js/custom_checkout/init#custom_checkout_init-options-elementsOptions-appearance) übergeben, wenn Sie Checkout im Frontend initialisieren.

#### React

Integrieren Sie die Komponente [Payment Element](https://docs.stripe.com/payments/payment-element.md) in den [CheckoutElementsProvider](https://docs.stripe.com/js/react_stripe_js/checkout/checkout_provider).

```jsx
import React from 'react';import {PaymentElement, useCheckout} from '@stripe/react-stripe-js/checkout';

const CheckoutForm = () => {
  const checkoutState = useCheckout();

  if (checkoutState.type === 'loading') {
    return (
      <div>Loading...</div>
    );
  }

  if (checkoutState.type === 'error') {
    return (
      <div>Error: {checkoutState.error.message}</div>
    );
  }

  return (
    <form>

      {JSON.stringify(checkoutState.checkout.lineItems, null, 2)}
      {/* A formatted total amount */}
      Total: {checkoutState.checkout.total.total.amount}
<PaymentElement options={{layout: 'accordion'}}/>
    </form>
  );
};

export default CheckoutForm;
```

Die unterstützten Optionen finden Sie in der [Stripe.js-Dokumentation](https://docs.stripe.com/js/custom_checkout/create_payment_element#custom_checkout_create_payment_element-options).

Sie können das [Erscheinungsbild aller Elemente anpassen](https://docs.stripe.com/payments/checkout/customization/appearance.md), indem Sie [elementsOptions.appearance](https://docs.stripe.com/js/react_stripe_js/checkout/checkout_provider#react_checkout_provider-options-elementsOptions-appearance) an den [CheckoutElementsProvider](https://docs.stripe.com/js/react_stripe_js/checkout/checkout_provider) übergeben.

## Zahlung übermitteln [Clientseitig]

#### HTML + JS

Zeigen Sie eine Schaltfläche **Bezahlen** an, die [confirm](https://docs.stripe.com/js/custom_checkout/confirm) von der `Checkout`-Instanz aufruft, um die Zahlung zu übermitteln.

```html
<button id="pay-button">Pay</button>
<div id="confirm-errors"></div>
```

```js
const checkout = stripe.initCheckoutElementsSdk({clientSecret});

checkout.on('change', (session) => {
  document.getElementById('pay-button').disabled = !session.canConfirm;
});

const loadActionsResult = await checkout.loadActions();

if (loadActionsResult.type === 'success') {
  const {actions} = loadActionsResult;
  const button = document.getElementById('pay-button');
  const errors = document.getElementById('confirm-errors');
  button.addEventListener('click', () => {
    // Clear any validation errors
    errors.textContent = '';

    actions.confirm().then((result) => {
      if (result.type === 'error') {
        errors.textContent = result.error.message;
      }
    });
  });
}
```

#### React

Zeigen Sie eine Schaltfläche **Bezahlen** an, die [bestätigen](https://docs.stripe.com/js/custom_checkout/confirm) von [useCheckout](https://docs.stripe.com/js/react_stripe_js/checkout/use_checkout) aufruft, um die Zahlung zu übermitteln.

```jsx
import React from 'react';
import {useCheckout} from '@stripe/react-stripe-js/checkout';

const PayButton = () => {
  const checkoutState = useCheckout();
  const [loading, setLoading] = React.useState(false);
  const [error, setError] = React.useState(null);

  if (checkoutState.type !== "success") {
    return null;
  }

  const handleClick = () => {
    setLoading(true);checkoutState.checkout.confirm().then((result) => {
      if (result.type === 'error') {
        setError(result.error)
      }
      setLoading(false);
    })
  };

  return (
    <div>
      <button disabled={!checkoutState.checkout.canConfirm || loading} onClick={handleClick}>
        Pay
      </button>
      {error && <div>{error.message}</div>}
    </div>
  )
};

export default PayButton;
```

## Webhooks überwachen [Server]

Um die Integration abzuschließen, müssen Sie die von Stripe gesendeten *Webhooks* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) verarbeiten. Diese Ereignisse werden immer dann ausgelöst, wenn sich der Status in Stripe ändert, z.B. wenn für Abonnements neue Rechnungen erstellt werden. Richten Sie in Ihrer Anwendung einen HTTP-Handler ein, der eine POST-Anfrage akzeptiert, die das Webhook-Ereignis enthält, und überprüfen Sie die Signatur des Ereignisses:

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/webhook' do
  # You can use webhooks to receive information about asynchronous payment events.
  # For more about our webhook events check out https://stripe.com/docs/webhooks.
  webhook_secret = ENV['STRIPE_WEBHOOK_SECRET']
  payload = request.body.read
  if !webhook_secret.empty?
    # Retrieve the event by verifying the signature using the raw body and secret if webhook signing is configured.
    sig_header = request.env['HTTP_STRIPE_SIGNATURE']
    event = nil

    begin
      event = Stripe::Webhook.construct_event(
        payload, sig_header, webhook_secret
      )
    rescue JSON::ParserError => e
      # Invalid payload
      status 400
      return
    rescue Stripe::SignatureVerificationError => e
      # Invalid signature
      puts '⚠️  Webhook signature verification failed.'
      status 400
      return
    end
  else
    data = JSON.parse(payload, symbolize_names: true)
    event = Stripe::Event.construct_from(data)
  end
  # Get the type of webhook event sent - used to check the status of PaymentIntents.
  event_type = event['type']
  data = event['data']
  data_object = data['object']

  if event_type == 'invoice.paid'
    # Used to provision services after the trial has ended.
    # The status of the invoice will show up as paid. Store the status in your
    # database to reference when a user accesses your service to avoid hitting rate
    # limits.
    # puts data_object
  end

  if event_type == 'invoice.payment_failed'
    # If the payment fails or the customer doesn't have a valid payment method,
    # an invoice.payment_failed event is sent, the subscription becomes past_due.
    # Use this webhook to notify your user that their payment has
    # failed and to retrieve new card details.
    # puts data_object
  end

  if event_type == 'customer.subscription.deleted'
    # handle subscription canceled automatically based
    # upon your subscription settings. Or if the user cancels it.
    # puts data_object
  end

  content_type 'application/json'
  { status: 'success' }.to_json
end
```

Verwenden Sie während der Entwicklung die Stripe CLI, um [Webhooks zu überwachen und an Ihre Anwendung weiterzuleiten](https://docs.stripe.com/webhooks.md#test-webhook). Führen Sie Folgendes in einem neuen Datenterminal aus, während Ihre Entwicklungs-App ausgeführt wird:

#### curl

```bash
  stripe listen --forward-to localhost:4242/webhook
```

Für die Produktionsphase können Sie eine Webhook-Endpoint-URL über das Dashboard oder mit der [Webhook Endpoints API](https://docs.stripe.com/api/webhook_endpoints.md) einrichten.

Sie müssen einige Ereignisse überwachen, um die verbleibenden Schritte in diesem Leitfaden abzuschließen. Weitere Informationen zu Abo-spezifischen Webhooks finden Sie unter [Abo-Ereignisse](https://docs.stripe.com/billing/subscriptions/webhooks.md#events).

## Zugang zu Ihrer Dienstleistung bereitstellen [Client und Server]

Nachdem das Abo nun aktiv ist, gewähren Sie Ihren Nutzer/innen Zugriff auf Ihren Dienst. Überwachen Sie dazu die Ereignisse `customer.subscription.created`, `customer.subscription.updated` und `customer.subscription.deleted`. Diese Ereignisse übergeben ein Abo-Objekt, das ein `status`-Feld enthält, das anzeigt, ob das Abo aktiv oder überfällig ist oder gekündigt wurde. Eine vollständige Statusliste finden Sie unter [Abonnementlebenszyklus](https://docs.stripe.com/billing/subscriptions/overview.md#subscription-lifecycle).

In Ihrem Webhook-Handler:

1. Überprüfen Sie den Abo-Status. Wenn er `active` lautet, hat Ihr/e Nutzer/in für Ihr Produkt bezahlt.
1. Prüfen Sie das Produkt, auf das die Kundin/der Kunde ein Abo abgeschlossen hat und gewähren Sie Zugang zu Ihrem Dienst. Das Überprüfen des Produkts anstelle des Preises gibt Ihnen mehr Flexibilität, falls Sie die Preisgestaltung oder den Rechnungsstellungszeitraum ändern müssen.
1. Speichern Sie die `product.id`, `Abonnement.id` und den `Abonnement.status` in Ihrer Datenbank zusammen mit der bereits gespeicherten `customer_account.id` oder `customer.id`. Überprüfen Sie diesen Datensatz, wenn Sie entscheiden, welche Funktionen für die Nutzer/innen Ihrer Anwendung aktiviert werden sollen.

Der Status eines Abonnements kann sich während seiner Laufzeit jederzeit ändern, auch wenn Ihr Anmeldeformular keine direkten Aufrufe an Stripe tätigt. So kann beispielsweise eine Verlängerung aufgrund einer abgelaufenen Karte fehlschlagen, wodurch das Abonnement in einen überfälligen Status versetzt wird. Oder, wenn Sie das [Kundenportal](https://docs.stripe.com/customer-management.md) implementieren, könnte ein/e Nutzer/in sein/ihr Abonnement kündigen, ohne Ihre Anwendung direkt aufzurufen. Durch die korrekte Implementierung Ihres Handlers bleibt der Status Ihrer Anwendung mit Stripe synchronisiert.

## Abo kündigen [Client und Server]

Es ist gängige Praxis, dass Kundinnen/Kunden ihr Abonnement selbst kündigen können. In diesem Beispiel wird zur Seite mit den Kontoeinstellungen eine Kündigungsoption hinzugefügt.
![Beispiel für eine Benutzeroberfläche zur Kündigung eines Abonnements.](https://b.stripecdn.com/docs-statics-srv/assets/fixed-price-subscriptions-guide-account-settings.6559626ba4b434826a67abfea165e097.png)

Kontoeinstellungen mit der Option, das Abo zu kündigen

```javascript
function cancelSubscription(subscriptionId) {
  return fetch('/cancel-subscription', {
    method: 'post',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      subscriptionId: subscriptionId,
    }),
  })
    .then(response => {
      return response.json();
    })
    .then(cancelSubscriptionResponse => {
      // Display to the user that the subscription has been canceled.
    });
}
```

Definieren Sie im Backend den Endpoint, den Ihr Frontend aufrufen soll.

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/cancel-subscription' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  deleted_subscription = client.v1.subscriptions.cancel(data['subscriptionId'])

  deleted_subscription.to_json
end
```

Ihre Anwendung empfängt ein Ereignis vom Typ `customer.subscription.deleted`.

Aktualisieren Sie nach der Kündigung des Abonnements Ihre Datenbank, um die zuvor gespeicherte Stripe-Abonnement-ID zu entfernen, und beschränken Sie den Zugang zu Ihrem Dienst.

Nachdem ein Abo gekündigt wurde, kann es nicht reaktiviert werden. Sie können stattdessen die aktualisierten Rechnungsinformationen von Ihrer Kund/innen erfassen, deren Standard-Zahlungsmethode aktualisieren und ein neues Abo für den bestehenden Kundendatensatz erstellen.

## Testen Sie Ihre Integration.

### Zahlungsmethoden testen

Verwenden Sie die folgende Tabelle, um verschiedene Zahlungsmethoden und -szenarien zu testen.

| Zahlungsmethode  | Szenario                                                                                                                                                                                                                                                                                                           | So führen Sie den Test durch                                                                                                                                                                                          |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| BECS-Lastschrift | Ihr/e Kund/in zahlt erfolgreich mit dem BECS-Lastschriftverfahren.                                                                                                                                                                                                                                                 | Füllen Sie das Formular mit der Kontonummer `900123456` und BSB `000000` aus. Der bestätigte PaymentIntent geht zunächst in den Status `processing` über und dann drei&nbsp;Minuten später in den Status `succeeded`. |
| BECS-Lastschrift | Die Zahlung Ihres/Ihrer Kund/in schlägt fehl mit Code `account_closed` fehl.                                                                                                                                                                                                                                       | Füllen Sie das Formular mit der Kontonummer `111111113` und BSB `000000` aus.                                                                                                                                         |
| Kreditkarte      | Die Kartenzahlung ist erfolgreich, und es ist keine Authentifizierung erforderlich.                                                                                                                                                                                                                                | Füllen Sie das Kreditkartenformular aus und geben Sie die Kreditkartennummer `4242 4242 4242 4242` mit beliebiger Gültigkeitsdauer, CVC und Postleitzahl an.                                                          |
| Kreditkarte      | Für die Kartenzahlung ist eine *Authentifizierung* (Strong Customer Authentication (SCA) is a regulatory requirement in effect as of September 14, 2019, that impacts many European online payments. It requires customers to use two-factor authentication like 3D Secure to verify their purchase) erforderlich. | Füllen Sie das Kreditkartenformular aus und geben Sie die Kreditkartennummer `4000 0025 0000 3155` mit beliebiger Gültigkeitsdauer, CVC und Postleitzahl an.                                                          |
| Kreditkarte      | Die Karte wird mit einem Ablehnungscode wie `insufficient_funds` abgelehnt.                                                                                                                                                                                                                                        | Füllen Sie das Kreditkartenformular aus und geben Sie die Kreditkartennummer `4000 0000 0000 9995` mit beliebiger Gültigkeitsdauer, CVC und Postleitzahl an.                                                          |
| SEPA-Lastschrift | Ihr/e Kund/in zahlt erfolgreich mit dem SEPA-Lastschriftverfahren.                                                                                                                                                                                                                                                 | Füllen Sie das Formular mit der Kontonummer `AT321904300235473204` aus. Die bestätigte PaymentIntent geht zunächst in den Status „wird verarbeitet“ und dann drei Minuten später in den Status „erfolgreich“ über.    |
| SEPA-Lastschrift | Der Status der PaymentIntent Ihrer Kundin/Ihre Kundin wechselt von `processing` zu `requires_payment_method`.                                                                                                                                                                                                      | Füllen Sie das Formular mit der Kontonummer `AT861904300235473202` aus.                                                                                                                                               |

### Ereignisse überwachen

Richten Sie Webhooks ein, um Abo-Änderungsereignisse wie Upgrades und Kündigungen zu überwachen. Erfahren Sie mehr über [Abo-Webhooks](https://docs.stripe.com/billing/subscriptions/webhooks.md). Sie können Ereignisse im [Dashboard](https://dashboard.stripe.com/test/events) oder mit der [Stripe CLI](https://docs.stripe.com/webhooks.md#test-webhook) anzeigen.

Weitere Informationen finden Sie unter [Billing-Integration testen](https://docs.stripe.com/billing/testing.md).

## Optional: Planänderungen auf Kundenseite zulassen [Client und Server]

Um Ihre Kund/innen Ihr Abo ändern zu lassen, erfassen Sie die Preis-ID der Option, zu der sie wechseln möchten. Übermitteln Sie dann die neue Preis-ID vom Frontend an einen Backend-Endpoint. In diesem Beispiel wird auch die Abo-ID übergeben, Sie können sie jedoch für Ihre angemeldeten Nutzer/innen aus Ihrer Datenbank abrufen.

```javascript
function updateSubscription(priceId, subscriptionId) {
  return fetch('/update-subscription', {
    method: 'post',
    headers: {
      'Content-type': 'application/json',
    },
    body: JSON.stringify({
      subscriptionId: subscriptionId,
      newPriceId: priceId,
    }),
  })
    .then(response => {
      return response.json();
    })
    .then(response => {
      return response;
    });
}
```

Definieren Sie im Backend den Endpoint für den Aufruf durch Ihr Frontend und übergeben Sie dabei die Abonnement-ID und die neue Preis-ID. Für das Abonnement gilt jetzt der Premium-Plan zum Preis von 15&nbsp;USD pro Monat anstelle des Basic-Plans zum Preis von 5&nbsp;USD pro Monat.

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/update-subscription' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  subscription = client.v1.subscriptions.retrieve(data['subscriptionId'])

  updated_subscription =
    client.v1.subscriptions.update(
      data['subscriptionId'],
      cancel_at_period_end: false,
      items: [
        { id: subscription.items.data[0].id, price: data['newPriceId'] }
      ]
    )

  updated_subscription.to_json
end
```

Ihre Anwendung empfängt ein Ereignis vom Typ `customer.subscription.updated`.

## Optional: Vorschau einer Preisänderung anzeigen [Client und Server]

Bei Änderungen eines Abos durch Kund/innen wird häufig der geschuldete Betrag angepasst. Diese Anpassung wird als [anteilmäßige Verrechnung](https://docs.stripe.com/billing/subscriptions/prorations.md) bezeichnet. Mithilfe des [Endpoints zum Erstellen einer Rechnungsvorschau](https://docs.stripe.com/api/invoices/create_preview.md) können Sie Ihren Kund/innen den angepassten Betrag anzeigen.

Übergeben Sie im Frontend die Details der zu erstellenden Rechnungsvorschau an einen Backend-Endpoint.

#### Accounts&nbsp;v2

```javascript
function createPreviewInvoice(
  customerAccountId,
  subscriptionId,
  newPriceId,
  trialEndDate
) {
  return fetch('/create-preview-invoice', {
    method: 'post',
    headers: {
      'Content-type': 'application/json',
    },
    body: JSON.stringify({
      customerAccountId: customerAccountId,
      subscriptionId: subscriptionId,
      newPriceId: newPriceId,
    }),
  })
    .then(response => {
      return response.json();
    })
    .then((invoice) => {
      return invoice;
    });
}
```

#### Customers&nbsp;v1

```javascript
function createPreviewInvoice(
  customerId,
  subscriptionId,
  newPriceId,
  trialEndDate
) {
  return fetch('/create-preview-invoice', {
    method: 'post',
    headers: {
      'Content-type': 'application/json',
    },
    body: JSON.stringify({
      customerId: customerId,
      subscriptionId: subscriptionId,
      newPriceId: newPriceId,
    }),
  })
    .then(response => {
      return response.json();
    })
    .then((invoice) => {
      return invoice;
    });
}
```

Definieren Sie im Backend den Endpoint, den Ihr Frontend aufrufen soll.

#### Accounts&nbsp;v2

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/create-preview-invoice' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  subscription = Stripe::Subscription.retrieve(data['subscriptionId'])

  invoice =
    Stripe::Invoice.create_preview(
      customer_account: data['customerAccountId'],
      subscription: data['subscriptionId'],
      subscription_details: {
        items: [
          { id: subscription.items.data[0].id, deleted: true },
          { price: data['newPriceId'], deleted: false }
        ]
      }
    )

  invoice.to_json
end
```

#### Customers&nbsp;v1

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/create-preview-invoice' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  subscription = client.v1.subscriptions.retrieve(data['subscriptionId'])

  invoice =
    client.v1.invoices.create_preview(
      customer: data['customerId'],
      subscription: data['subscriptionId'],
      subscription_details: {
        items: [
          { id: subscription.items.data[0].id, deleted: true },
          { price: data['newPriceId'], deleted: false }
        ]
      }
    )

  invoice.to_json
end
```

## Optional: Zahlungsmethode der Kunden anzeigen [Client und Server]

Wenn der Kartenaussteller und die letzten vier Ziffern der Karte angezeigt werden, wissen Kunden eher, welche Karte belastet wird, und können gegebenenfalls die Zahlungsmethode aktualisieren.

Senden Sie im Frontend die ID der Zahlungsmethode an einen Backend-Endpoint, der die Details zur Zahlungsmethode abruft.

```javascript
function retrieveCustomerPaymentMethod(paymentMethodId) {
  return fetch('/retrieve-customer-payment-method', {
    method: 'post',
    headers: {
      'Content-type': 'application/json',
    },
    body: JSON.stringify({
      paymentMethodId: paymentMethodId,
    }),
  })
    .then((response) => {
      return response.json();
    })
    .then((response) => {
      return response;
    });
}
```

Definieren Sie im Backend den Endpoint, den Ihr Frontend aufrufen soll.

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/retrieve-customer-payment-method' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  payment_method = client.v1.payment_methods.retrieve(data['paymentMethodId'])

  payment_method.to_json
end
```

Beispielantwort:

```json
{
  "id": "pm_1GcbHY2eZvKYlo2CoqlVxo42",
  "object": "payment_method",
  "billing_details": {
    "address": {
      "city": null,
      "country": null,
      "line1": null,
      "line2": null,
      "postal_code": null,
      "state": null
    },
    "email": null,
    "name": null,
    "phone": null
  },
  "card": {
    "brand": "visa",
    "checks": {
      "address_line1_check": null,
      "address_postal_code_check": null,
      "cvc_check": "pass"
    },
    "country": "US",
    "exp_month": 8,
    "exp_year": 2021,
    "fingerprint": "Xt5EWLLDS7FJjR1c",
    "funding": "credit",
    "generated_from": null,
    "last4": "4242",
    "three_d_secure_usage": {
      "supported": true
    },
    "wallet": null
  },
  "created": 1588010536,
  "customer": "cus_HAxB7dVQxhoKLh",
  "livemode": false,
  "metadata": {},
  "type": "card"
}
```

> Wir empfehlen, `paymentMethod.id` und `last4` in Ihrer Datenbank zu speichern (zum Beispiel `paymentMethod.id` als `stripeCustomerPaymentMethodId` in Ihrer Auflistung oder Tabelle für `users`). Optional können Sie je nach Bedarf `exp_month`, `exp_year`, `fingerprint` und `billing_details` speichern. Dadurch können Sie die Anzahl der Aufrufe an Stripe begrenzen, um die Leistung zu steigern und eventuelle Begrenzungen zu vermeiden.

## Stripe Ihren Kundinnen/Kunden anzeigen

Stripe erfasst Informationen über Kundeninteraktionen mit Elements , um Ihnen Dienste bereitzustellen, Betrug vorzubeugen und seine Dienste zu verbessern. Dies umfasst auch die Verwendung von Cookies und IP-Adressen, um zu ermitteln, welche Elements ein/e Kund/in während einer einzelnen Checkout-Sitzung gesehen hat. Sie sind dafür verantwortlich, alle Rechte und Zustimmungen offenzulegen und einzuholen, die Stripe benötigen, um Ihre Daten auf diese Weise zu nutzen. Weitere Informationen finden Sie in unserem [Datenschutzcenter](https://stripe.com/legal/privacy-center#as-a-business-user-what-notice-do-i-provide-to-my-end-customers-about-stripe).

#### Payment Intents API

#### Integrationsaufwand
Complexity: 4/5
#### Integrationstyp

Komponenten der Nutzeroberfläche in einem benutzerdefinierten Zahlungsablauf kombinieren

#### Anpassung der Nutzeroberfläche

Anpassung auf CSS-Ebene mit der [Appearance API](https://docs.stripe.com/elements/appearance-api.md)

Erstellen Sie ein benutzerdefiniertes Zahlungsformular mit [Stripe Elements](https://docs.stripe.com/payments/elements.md) und der [Payment Intents API](https://docs.stripe.com/api/payment_intents.md), um *Subscriptions* zum Festpreis zu verkaufen. Sehen Sie sich diese Integration [im Vergleich zu anderen Integrationen von Stripe an](https://docs.stripe.com/payments/online-payments.md#compare-features-and-availability).

Die Payment Intents API ist eine untergeordnete API, die Sie zum Erstellen Ihres eigenen Bezahlvorgangs oder Zahlungsablaufs verwenden können. Sie erfordert aber deutlich mehr Code und laufende Wartung. Wir empfehlen für die meisten Integrationen das [Payment Element mit Checkout-Sitzungen](https://docs.stripe.com/payments/quickstart-checkout-sessions.md), da es ähnliche Zahlungen wie Payment Intents abdeckt. Erfahren Sie mehr darüber, [wann Sie Checkout-Sitzungen anstelle von PaymentIntents verwenden sollten](https://docs.stripe.com/payments/checkout-sessions-and-payment-intents-comparison.md).

Wenn Sie kein benutzerdefiniertes Zahlungsformular erstellen möchten, können Sie eine gehostete Version von Checkout integrieren. Eine ausführliche Version dieses umfassenden Integrations-Leitfadens finden Sie in der [Billing-Kurzanleitung](https://docs.stripe.com/billing/quickstart.md).

Wenn Sie zur Codierung einer Integration nicht bereit sind, können Sie einfache Abos [manuell im Dashboard](https://docs.stripe.com/no-code/subscriptions.md) einrichten. Sie können auch [Payment Links](https://docs.stripe.com/payment-links.md) nutzen, um Abos ohne das Schreiben von Code einzurichten. Lesen Sie mehr zum Thema [Entwerfen einer Integration](https://docs.stripe.com/billing/subscriptions/design-an-integration.md), um zu verstehen, welche Entscheidungen Sie treffen müssen und welche Ressourcen Sie benötigen.

## Sie werden Folgendes entwickeln

Dieser Leitfaden bietet Informationen zu den folgenden Vorgehensweisen:

- Richten Sie einen Product Catalog ein.
- Entwickeln Sie einen Anmeldeprozess, durch den ein/e Kund/in erstellt wird.
- Abos erstellen und Zahlungsinformationen erfassen.
- Den Status der Zahlung und des Abos testen und überwachen.
- Kunden ihren Plan ändern oder das Abo kündigen lassen.
- Erfahren Sie, wie Sie im [flexiblen Abrechnungsmodus](https://docs.stripe.com/billing/subscriptions/billing-mode.md) auf ein verbessertes Abrechnungsverhalten und zusätzliche Funktionen zugreifen können.

## So entwickeln Sie mit Stripe

[Subscriptions](https://docs.stripe.com/api/subscriptions.md) vereinfachen Ihre Billing, indem sie automatisch *Rechnungen* (Invoices are statements of amounts owed by a customer. They track the status of payments from draft through paid or otherwise finalized. Subscriptions automatically generate invoices, or you can manually create a one-off invoice) und [PaymentIntents](https://docs.stripe.com/api/payment_intents.md) für Sie erstellen. Um ein Abo zu erstellen und zu aktivieren, müssen Sie zunächst ein *Produkt* (Products represent what your business sells—whether that's a good or a service) erstellen, um zu definieren, was Sie verkaufen, und einen *Preis* (Prices define how much and how often to charge for products. This includes how much the product costs, what currency to use, and the interval if the price is for subscriptions) erstellen, der den Betrag der Zahlung und wie oft bestimmt. Außerdem müssen die für jede wiederkehrende Zahlung verwendeten *PaymentMethods* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs) entweder von Kundinnen/Kunden konfigurierte `Konto`-Objekte oder `Kundinnen`-Objekte gespeichert werden.

#### Accounts&nbsp;v2
Ein Diagramm, das gängige Abrechnungsobjekte und ihre Beziehungen veranschaulicht (See full diagram at https://docs.stripe.com/billing/subscriptions/build-subscriptions)
#### Customer&nbsp;v1
Ein Diagramm, das gängige Abrechnungsobjekte und ihre Beziehungen veranschaulicht (See full diagram at https://docs.stripe.com/billing/subscriptions/build-subscriptions)
### API-Objekt-Definitionen

| Ressource                                                                                                                                 | Definition                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| ----------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Als Kunde/Kundin konfiguriertes Konto](https://docs.stripe.com/api/v2/core/accounts/create.md#v2_create_accounts-configuration-customer) | Stellt in der Accounts v2 API eine Kundin/einen Kunden dar, die/der ein Abonnement erwirbt. Konfigurieren Sie ein `Account`-Objekt als Kundin/Kunde und verknüpfen Sie es mit einem Abonnement, um wiederkehrende Zahlungen zu erheben und nachzuverfolgen sowie die abonnierten Produkte zu verwalten. Weitere Informationen finden Sie im [Leitfaden zur Verwendung von Accounts als Kundin/Kunde](https://docs.stripe.com/connect/use-accounts-as-customers.md).                                                                                     |
| [Kundin/Kunde](https://docs.stripe.com/api/customers.md)                                                                                  | Stellt eine Kundin/einen Kundin in der Customers API dar, die/der ein Abonnement erwirbt. Verwenden Sie das mit einem Abonnement verknüpfte `Customer`-Objekt, um wiederkehrende Zahlungen durchzuführen und zu verfolgen und die abonnierten Produkte zu verwalten.                                                                                                                                                                                                                                                                                    |
| [Berechtigung](https://docs.stripe.com/api/entitlements/active-entitlement.md)                                                            | Stellt den Zugriff eines Kunden/einer Kundin auf eine Funktion dar, die in einem Dienstleistungsprodukt enthalten ist, das er/sie abonniert hat. Wenn Sie ein Abonnement für den wiederkehrenden Kauf eines Produkts durch einen Kunden/eine Kundin erstellen, wird automatisch eine aktive Berechtigung für jede diesem Produkt zugeordnete Funktion erstellt. Wenn ein Kunde/eine Kundin auf Ihre Dienstleistungen zugreift, verwenden Sie seine/ihre aktiven Berechtigungen, um die in seinem/ihrem Abonnement enthaltenen Funktionen zu aktivieren. |
| [Funktion](https://docs.stripe.com/api/entitlements/feature.md)                                                                           | Stellt eine Funktion oder Fähigkeit dar, auf die Ihre Kundinnen und Kunden zugreifen können, wenn sie ein Dienstleistungsprodukt abonnieren. Sie können Funktionen in ein Produkt einfügen, indem Sie ProductFeatures erstellen.                                                                                                                                                                                                                                                                                                                        |
| [Rechnung](https://docs.stripe.com/api/invoices.md)                                                                                       | Eine Aufstellung der Beträge, die ein Kunde/eine Kundin schuldet, die den Zahlungsstatus vom Entwurf bis zur Bezahlung oder anderweitigem Abschluss verfolgt. Bei Abonnements werden automatisch Rechnungen erstellt.                                                                                                                                                                                                                                                                                                                                   |
| [PaymentIntent](https://docs.stripe.com/api/payment_intents.md)                                                                           | Eine Möglichkeit zum Erstellen dynamischer Zahlungsabläufe. Mit einem PaymentIntent wird der Lebenszyklus der Bezahlvorgänge von Kundinnen/Kunden verfolgt, und es werden zusätzliche Authentifizierungsschritte ausgelöst, wenn dies aufgrund von gesetzlichen Vorschriften, nutzerdefinierten Radar-Betrugsregeln oder auf Weiterleitung basierenden Zahlungsmethoden erforderlich ist. Rechnungen erstellen automatisch PaymentIntents.                                                                                                              |
| [PaymentMethod](https://docs.stripe.com/api/payment_methods.md)                                                                           | Die Zahlungsmethoden einer Kundin/eines Kunden, mit denen sie/er für Ihre Produkte bezahlt. Sie können beispielsweise eine Kreditkarte in einem kundenkonfigurierten `Account` oder `Customer` speichern und damit wiederkehrende Zahlungen für diese Kundin/diesen Kunden/ vornehmen. Wird in der Regel mit der Payment Intents API oder der Setup Intents API verwendet.                                                                                                                                                                              |
| [Preis](https://docs.stripe.com/api/prices.md)                                                                                            | Definiert den Stückpreis, die Währung und den Rechnungszyklus für ein Produkt.                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| [Produkt](https://docs.stripe.com/api/products.md)                                                                                        | Eine Ware oder Dienstleistung, die Ihr Unternehmen verkauft. Ein Dienstleistungsprodukt kann eine oder mehrere Funktionen beinhalten.                                                                                                                                                                                                                                                                                                                                                                                                                   |
| [ProductFeature](https://docs.stripe.com/api/product-feature.md)                                                                          | Stellt die Aufnahme einer einzelnen Funktion in ein einzelnes Produkt dar. Jedes Produkt ist für jede Funktion, die es enthält, mit einer ProductFeature verknüpft, und jede Funktion ist für jedes Produkt, das sie enthält, mit einer ProductFeature verknüpft.                                                                                                                                                                                                                                                                                       |
| [Abonnement](https://docs.stripe.com/api/subscriptions.md)                                                                                | Stellt den geplanten wiederkehrenden Kauf eines Produkts durch einen Kunden/eine Kundin dar. Verwenden Sie ein Abonnement, um Zahlungen einzuziehen und eine wiederholte Lieferung oder einen kontinuierlichen Zugriff auf ein Produkt zu ermöglichen.                                                                                                                                                                                                                                                                                                  |

Hier ist ein Beispiel dafür, wie Produkte, Funktionen und Berechtigungen zusammen funktionieren. Stellen Sie sich vor, Sie möchten einen wiederkehrenden Service einrichten, der zwei Stufen anbietet: ein Standard-Produkt mit grundlegenden Funktionalitäten und ein erweitertes Produkt, das erweiterte Funktionalitäten bietet.

1. Sie erstellen zwei Funktionen: `basic_features` und `extended_features`.
1. Sie erstellen zwei Produkte: `standard_product` und `advanced_product`.
1. Für das Standardprodukt erstellen Sie eine ProductFeature, die `basic_features` mit `standard_product` verknüpft.
1. Für das erweiterte Produkt erstellen Sie zwei ProductFeatures: eine, die `basic_features` mit `advanced_product` verknüpft, und eine, die `extended_features` mit `advanced_product` verknüpft.

Ein Kunde/eine Kundin, `first_customer`, abonniert das Standardprodukt. Wenn Sie das Abonnement erstellen, erstellt Stripe automatisch eine Berechtigung, die `first_customer` mit `basic_features` verknüpft.

Ein anderer Kunde/eine andere Kundin, `second_customer`, abonniert das erweiterte Produkt. Wenn Sie das Abonnement erstellen, erstellt Stripe automatisch zwei Berechtigungen: eine, die `second_customer` mit `basic_features` verknüpft, und eine, die `second_customer` mit `extended_features` verknüpft.

Sie können festlegen, welche Funktionen für einen Kunden/eine Kundin bereitgestellt werden sollen, indem Sie [seine/ihre aktiven Berechtigungen abrufen oder das Ereignis mit der Zusammenfassung der aktiven Berechtigungen überwachen](https://docs.stripe.com/billing/entitlements.md#entitlements). Sie müssen ihre Abonnements, Produkte und Funktionen nicht abrufen.

## Stripe einrichten

Installieren Sie den Stripe-Client Ihrer Wahl:

#### Ruby

```bash
# Available as a gem
sudo gem install stripe
```

```ruby
# If you use bundler, you can add this line to your Gemfile
gem 'stripe'
```

Installieren Sie dann die Stripe-CLI. Mit der Stripe-CLI können Sie Webhooks testen und Stripe-APIs aufrufen. In einem späteren Abschnitt dieses Leitfadens wird erklärt, wie Sie mithilfe der CLI ein Preismodell einrichten können.
Weitere Installationsoptionen finden Sie unter [Mit der Stripe-CLI loslegen](https://docs.stripe.com/stripe-cli.md).
## Preismodell erstellen [Stripe-CLI oder Dashboard]

[Wiederkehrende Preismodelle](https://docs.stripe.com/products-prices/pricing-models.md) umfassen die Produkte und Dienstleistungen, die Sie anbieten, die Preise dafür, welche Währungen Sie für Zahlungen verwenden und den Leistungszeitraum (für Abos). Verwenden Sie zum Aufbau des Preismodells [Produkte](https://docs.stripe.com/api/products.md) (was Sie anbieten) und [Preise](https://docs.stripe.com/api/prices.md) (Höhe und Abrechnungsintervall).

In diesem Beispiel wird ein Pauschalpreisdienst mit zwei verschiedenen Service-Optionen verwendet: Basis und Premium. Für jede Service-Option müssen Sie ein Produkt und einen wiederkehrenden Preis erstellen. Um eine einmalige Gebühr, z.&nbsp;B. für die Einrichtung, hinzufügen möchten, erstellen Sie ein drittes Produkt mit einem einmaligen Preis.

Jedes Produkt wird in monatlichen Intervallen abgerechnet. Der Preis für das Basisprodukt beträgt 5&nbsp;USD. Der Preis für das Premiumprodukt beträgt 15 USD. Ein Beispiel mit drei Stufen finden Sie im Leitfaden zu [Pauschalpreismodellen](https://docs.stripe.com/subscriptions/pricing-models/flat-rate-pricing.md).

#### Dashboard

Gehen Sie zur Seite [Produkt hinzufügen](https://dashboard.stripe.com/test/products/create) und erstellen Sie zwei Produkte. Fügen Sie für jedes Produkt einen Preis hinzu, jeweils mit einem monatlich wiederkehrenden Abrechnungszeitraum:

- Premium-Produkt: Premium-Dienstleistung mit zusätzlichen Funktionen

  - Preis: Pauschalpreis&nbsp;|&nbsp;15 USD

- Basic-Produkt: Basic-Dienstleistung mit minimalem Funktionsumfang

  - Preis: Pauschalpreis&nbsp;|&nbsp;5 USD

Zeichnen Sie nach Erstellung der Preise die Preis-IDs auf, sodass diese in anderen Schritten verwendet werden können. Preis-IDs sehen in etwa wie folgt aus: `price_G0FvDp6vZvdwRZ`.

Wenn Sie bereit sind, verwenden Sie die Schaltfläche **In Live-Modus kopieren** oben rechts auf der Seite, um Ihr Produkt aus der [Sandbox in den Live-Modus zu kopieren](https://docs.stripe.com/keys.md#test-live-modes).

#### API

Sie können die API zum Erstellen der [Produkte](https://docs.stripe.com/api/products.md) und [Preise](https://docs.stripe.com/api/prices.md) verwenden.

Premiumprodukt erstellen:

```curl
curl https://api.stripe.com/v1/products \
  -u "<<YOUR_SECRET_KEY>>:" \
  --data-urlencode "name=Billing Guide: Premium Service" \
  -d "description=Premium service with extra features"
```

Basisprodukt erstellen:

```curl
curl https://api.stripe.com/v1/products \
  -u "<<YOUR_SECRET_KEY>>:" \
  --data-urlencode "name=Billing Guide: Basic Service" \
  -d "description=Basic service with minimum features"
```

Zeichnen Sie Preis-ID für jedes Produkt auf. Die Preis-IDs sehen in etwa wie folgt aus:

```json
{
  "id": "prod_H94k5odtwJXMtQ",
  "object": "product",
  "active": true,
  "attributes": [

  ],
  "created": 1587577341,
  "description": "Premium service with extra features",
  "images": [

  ],
  "livemode": false,
  "metadata": {
  },
  "name": "Billing Guide: Premium Service",
  "statement_descriptor": null,
  "type": "service",
  "unit_label": null,
  "updated": 1587577341
}
```

Verwenden Sie die Produkt-IDs, um einen Preis für jedes Produkt zu erstellen. Die Zahl [unit_amount](https://docs.stripe.com/api/prices/object.md#price_object-unit_amount) wird in Cent angegeben, also z.&nbsp;B.`1500` = 15 USD.

Premiumpreis erstellen:

```curl
curl https://api.stripe.com/v1/prices \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d product={{PREMIUM_PRODUCT_ID}} \
  -d unit_amount=1500 \
  -d currency=usd \
  -d "recurring[interval]=month"
```

Basispreis erstellen:

```curl
curl https://api.stripe.com/v1/prices \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d product={{BASIC_PRODUCT_ID}} \
  -d unit_amount=500 \
  -d currency=usd \
  -d "recurring[interval]=month"
```

Zeichnen Sie Preis-ID für jeden Preis auf, sodass diese in nachfolgenden Schritten verwendet werden können. Die Preis-IDs sehen in etwa wie folgt aus:

```json
{
  "id": "price_HGd7M3DV3IMXkC",
  "object": "price",
  "product": "prod_HGd6W1VUqqXGvr",
  "type": "recurring",
  "currency": "usd",
  "recurring": {
    "interval": "month",
    "interval_count": 1,
    "trial_period_days": null,
    "usage_type": "licensed"
  },
  "active": true,
  "billing_scheme": "per_unit",
  "created": 1589319695,
  "livemode": false,
  "lookup_key": null,
  "metadata": {},
  "nickname": null,
  "unit_amount": 1500,
  "unit_amount_decimal": "1500",
  "tiers": null,
  "tiers_mode": null,
  "transform_quantity": null
}
```

## Kundin/Kunden erstellen [Client und Server]

Stripe benötigt für jedes Abonnement einen Kunden bzw. eine Kundin. Erfassen Sie in der Nutzeroberfläche Ihrer Anwendung alle erforderlichen Informationen von Ihren Nutzerinnen und Nutzern und leiten Sie diese an das Backend weiter.

Wenn Sie Adressdaten erfassen müssen, können Sie mit dem Adresselement eine Liefer- oder Rechnungsadresse für Ihre Kundinnen und Kunden erfassen. Weitere Informationen zum Adresselement finden Sie auf der Seite [Adresselement](https://docs.stripe.com/elements/address-element.md).

```html
<form id="signup-form">
  <label>
    Email
    <input id="email" type="email" placeholder="Email address" value="test@example.com" required />
  </label>

  <button type="submit">
    Register
  </button>
</form>
```

```javascript
const emailInput = document.querySelector('#email');

fetch('/create-customer', {
  method: 'post',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    email: emailInput.value,
  }),
}).then(r => r.json());
```

Erstellen Sie auf dem Server ein Objekt, das den Kunden bzw. die Kundin repräsentiert. Dies kann entweder ein vom Kunden oder von der Kundin konfiguriertes `Konto`-Objekt oder ein `Kunden`-Objekt sein. Speichern Sie die ID des Objekts, um sie in der Checkout-Sitzung zu verwenden.

> #### Verwenden Sie die Accounts&nbsp;v2 API zum Darstellen von Kundinnen und Kunden
> 
> The Accounts v2 API is generally available for Connect users, and in public preview for other Stripe users. If you’re part of the Accounts v2 preview, you need to specify a [specify a preview version](https://docs.stripe.com/api-v2-overview.md#sdk-and-api-versioning) in your code.
> 
> To request access to the Accounts v2 preview, 
> 
> Für die meisten Anwendungsfälle empfehlen wir, [Ihre Kundinnen und Kunden als vom Kunden bzw. von der Kundin konfigurierte Account-Objekte abzubilden](https://docs.stripe.com/connect/use-accounts-as-customers.md), anstatt das [Kundenobjekt](https://docs.stripe.com/api/customers.md) zu verwenden.

#### Accounts&nbsp;v2

```curl
curl -X POST https://api.stripe.com/v2/core/accounts \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-03-25.preview" \
  --json '{
    "contact_email": "jenny.rosen@example.com",
    "display_name": "Jenny Rosen",
    "identity": {
        "individual": {
            "given_name": "Jenny Rosen",
            "address": {
                "city": "San Francisco",
                "country": "US",
                "line1": "123 Main Street",
                "postal_code": "94605",
                "state": "CA"
            }
        }
    },
    "configuration": {
        "customer": {
            "capabilities": {
                "automatic_indirect_tax": {
                    "requested": true
                }
            },
            "shipping": {
                "address": {
                    "city": "San Francisco",
                    "country": "US",
                    "line1": "123 Main Street",
                    "postal_code": "94605",
                    "state": "CA"
                }
            }
        }
    },
    "include": [
        "configuration.customer",
        "identity"
    ]
  }'
```

#### Customers&nbsp;v1

```curl
curl https://api.stripe.com/v1/customers \
  -u "<<YOUR_SECRET_KEY>>:" \
  --data-urlencode "email=jenny.rosen@example.com" \
  -d "name=Jenny Rosen" \
  -d "shipping[address][city]=San Francisco" \
  -d "shipping[address][country]=US" \
  -d "shipping[address][line1]=123 Main Street" \
  -d "shipping[address][postal_code]=9460" \
  -d "shipping[address][state]=CA" \
  -d "shipping[name]=Jenny Rosen" \
  -d "address[city]=San Francisco" \
  -d "address[country]=US" \
  -d "address[line1]=123 Main Street" \
  -d "address[postal_code]=9460" \
  -d "address[state]=CA"
```

## Abo erstellen [Client und Server]

> Wenn Sie das Payment Element rendern möchten, ohne vorab ein Abo zu erstellen, finden Sie weitere Informationen unter [Zahlungsdaten vor dem Erstellen eines Intent erfassen](https://docs.stripe.com/payments/accept-a-payment-deferred.md?type=subscription).

Erlauben Sie Ihren Kund/innen, einen Tarif auszuwählen und dann das Abo zu erstellen. Im Beispiel in diesem Leitfaden wählt der Kunde zwischen einem Basis-Tarif oder einem Aufpreis-Tarif.

Übergeben Sie im Frontend die ausgewählte Preis-ID und die Kundendatensatz-ID an das Backend.

#### Accounts&nbsp;v2

```javascript
fetch('/create-subscription', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    priceId: priceId,
    customerAccountId: customerAccountId,
  }),
})
```

#### Customers&nbsp;v1

```javascript
fetch('/create-subscription', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    priceId: priceId,
    customerId: customerId,
  }),
})
```

Erstellen Sie im Backend das Abo mit einem Status `incomplete` mit `payment_behavior=default_incomplete`. Geben Sie dann das `client_secret` vom ersten [PaymentIntent](https://docs.stripe.com/payments/payment-intents.md) des Abos an das Frontend zurück, um die Zahlung abzuschließen. Erweitern Sie dazu das [confirmation_secret](https://docs.stripe.com/api/invoices/object.md#invoice_object-confirmation_secret) auf der neuesten Rechnung des Abos.

Um ein [verbessertes Aboverhalten](https://docs.stripe.com/billing/subscriptions/billing-mode.md) zu ermöglichen, legen Sie `billing_mode[type]` auf `flexible` fest. Sie müssen die Stripe API Version [2025-06-30.basil](https://docs.stripe.com/changelog/basil.md#2025-06-30.basil) oder höher verwenden.

Legen Sie [save_default_payment_method](https://docs.stripe.com/api/subscriptions/object.md#subscription_object-payment_settings-save_default_payment_method) auf `on_subscription` fest, um die Zahlungsmethode bei erfolgreicher Zahlung als Standard für ein Abo zu speichern. Das Speichern einer Standardzahlungsmethode erhöht die Erfolgsquote künftiger Abo-Zahlungen.

Im folgenden Beispiel wird ein `Abonnement` erstellt und das `confirmation_secret` aus der letzten Rechnung in der Antwort erweitert. So können Sie das Geheimnis an das Frontend übergeben, um die Zahlung zu bestätigen.

#### Accounts&nbsp;v2

```curl
curl https://api.stripe.com/v1/subscriptions \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d "customer_account={{CUSTOMERACCOUNT_ID}}" \
  -d "items[0][price]={{PRICE_ID}}" \
  -d payment_behavior=default_incomplete \
  -d "payment_settings[save_default_payment_method]=on_subscription" \
  -d "billing_mode[type]=flexible" \
  -d "expand[0]=latest_invoice.confirmation_secret"
```

#### Customers&nbsp;v1

```curl
curl https://api.stripe.com/v1/subscriptions \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d "customer={{CUSTOMER_ID}}" \
  -d "items[0][price]={{PRICE_ID}}" \
  -d payment_behavior=default_incomplete \
  -d "payment_settings[save_default_payment_method]=on_subscription" \
  -d "billing_mode[type]=flexible" \
  -d "expand[0]=latest_invoice.confirmation_secret"
```

> Wenn Sie einen *Preis in mehreren Währungen* (A single Price object can support multiple currencies. Each purchase uses one of the supported currencies for the Price, depending on how you use the Price in your integration) verwenden, teilen Sie dem Abo mithilfe des Parameters [currency](https://docs.stripe.com/api/subscriptions/create.md#create_subscription-currency) mit, welche unterstützte Währung verwendet werden soll. (Wenn Sie den Parameter `currency` weglassen, wird für das Abo die Standardwährung verwendet.)

Das Abo ist jetzt `inactive` und wartet auf Zahlung. In der folgenden Beispielantwort werden die minimal zu speichernden Felder hervorgehoben. Sie können jedoch die Felder speichern, auf die Ihre Anwendung häufig zugreift.

#### Accounts&nbsp;v2

```json
{"id": "sub_JgRjFjhKbtD2qz",
  "object": "subscription",
  "application_fee_percent": null,
  "automatic_tax": {
    "disabled_reason": null,
    "enabled": false,
    "liability": "null"
  },
  "billing_cycle_anchor": 1623873347,
  "billing_cycle_anchor_config": null,
  "cancel_at": null,
  "cancel_at_period_end": false,
  "canceled_at": null,
  "cancellation_details": {
    "comment": null,
    "feedback": null,
    "reason": null
  },
  "collection_method": "charge_automatically",
  "created": 1623873347,
  "currency": "usd","customer_account": identifier("customerAccount"),
  "days_until_due": null,
  "default_payment_method": null,
  "default_source": null,
  "default_tax_rates": [

  ],
  "discounts": [],
  "ended_at": null,
  "invoice_customer_balance_settings": {
    "account_tax_ids": null,
    "issuer": {
      "type": "self"
    }
  },
  "items": {
    "object": "list",
    "data": [
      {
        "id": "si_JgRjmS4Ur1khEx",
        "object": "subscription_item",
        "created": 1623873347,"current_period_end": 1626465347,
        "current_period_start": 1623873347,
        "discounts": [],
        "metadata": {
        },
        "plan": {
          "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
          "object": "plan",
          "active": true,
          "amount": 2000,
          "amount_decimal": "2000",
          "billing_scheme": "per_unit",
          "created": 1623864151,
          "currency": "usd",
          "interval": "month",
          "interval_count": 1,
          "livemode": false,
          "metadata": {
          },
          "nickname": null,
          "product": "prod_JgPF5xnq7qBun3",
          "tiers": null,
          "tiers_mode": null,
          "transform_usage": null,
          "trial_period_days": null,
          "usage_type": "licensed"
        },
        "price": {
          "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
          "object": "price",
          "active": true,
          "billing_scheme": "per_unit",
          "created": 1623864151,
          "currency": "usd",
          "livemode": false,
          "lookup_key": null,
          "metadata": {
          },
          "nickname": null,
          "product": "prod_JgPF5xnq7qBun3",
          "recurring": {
            "interval": "month",
            "interval_count": 1,
            "trial_period_days": null,
            "usage_type": "licensed"
          },
          "tiers_mode": null,
          "transform_quantity": null,
          "type": "recurring",
          "unit_amount": 2000,
          "unit_amount_decimal": "2000"
        },
        "quantity": 1,
        "subscription": "sub_JgRjFjhKbtD2qz",
        "tax_rates": [

        ]
      }
    ],
    "has_more": false,
    "total_count": 1,
    "url": "/v1/subscription_items?subscription=sub_JgRjFjhKbtD2qz"
  },
  "latest_invoice": {
    "id": "in_1J34pzGPZ1iASj5zB87qdBNZ",
    "object": "invoice",
    "account_country": "US",
    "account_name": "Angelina's Store",
    "account_tax_ids": null,
    "amount_due": 2000,
    "amount_overpaid": 0,
    "amount_paid": 0,
    "amount_remaining": 2000,
    "amount_shipping": 0,
    "attempt_count": 0,
    "attempted": false,
    "auto_advance": false,
    "automatic_tax": {
      "disabled_reason": null,
      "enabled": false,
      "liability": null,
      "status": null
    },
    "automatically_finalizes_at": null,
    "billing_reason": "subscription_update",
    "collection_method": "charge_automatically",
    "created": 1623873347,
    "currency": "usd",
    "custom_fields": null,
    "customer_account": identifier("customerAccount"),
    "customer_address": null,
    "customer_email": "angelina@stripe.com",
    "customer_name": null,
    "customer_phone": null,
    "customer_shipping": {
      "address": {
        "city": "",
        "country": "US",
        "line1": "Berry",
        "line2": "",
        "postal_code": "",
        "state": ""
      },
      "name": "",
      "phone": null
    },
    "customer_tax_exempt": "none",
    "customer_tax_ids": [

    ],
    "default_payment_method": null,
    "default_source": null,
    "default_tax_rates": [

    ],
    "description": null,
    "discounts": [],
    "due_date": null,
    "effective_at": "1623873347",
    "ending_balance": 0,
    "footer": null,
    "from_invoice": null,
    "hosted_invoice_url": "https://invoice.stripe.com/i/acct_1By64KGPZ1iASj5z/invst_JgRjzIOILGeq2MKC9T0KtyXnD5udsLp",
    "invoice_pdf": "https://pay.stripe.com/invoice/acct_1By64KGPZ1iASj5z/invst_JgRjzIOILGeq2MKC9T0KtyXnD5udsLp/pdf",
    "last_finalization_error": null,
    "latest_revision": null,
    "lines": {
      "object": "list",
      "data": [
        {
          "id": "il_1N2CjMBwKQ696a5NeOawRQP2",
          "object": "line_item",
          "amount": 2000,
          "currency": "usd",
          "description": "1 × Gold Special (at $20.00 / month)",
          "discount_amounts": [

          ],
          "discountable": true,
          "discounts": [

          ],
          "invoice": "in_1J34pzGPZ1iASj5zB87qdBNZ",
          "livemode": false,
          "metadata": {
          },
          "parent": {
            "invoice_item_details": null,
            "subscription_item_details":
            {
              "invoice_item": null,
            "proration": false,
            "proration_details":
            {
              "credited_items": null
            },
            "subscription":
            "sub_JgRjFjhKbtD2qz",
            "subscription_item":
              "si_JgRjmS4Ur1khEx"
            },
            "type": "subscription_item_details"
          },
          "period": {
            "end": 1626465347,
            "start": 1623873347
          },
          "plan": {
            "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
            "object": "plan",
            "active": true,
            "amount": 2000,
            "amount_decimal": "2000",
            "billing_scheme": "per_unit",
            "created": 1623864151,
            "currency": "usd",
            "interval": "month",
            "interval_count": 1,
            "livemode": false,
            "metadata": {
            },
            "nickname": null,
            "product": "prod_JgPF5xnq7qBun3",
            "tiers": null,
            "tiers_mode": null,
            "transform_usage": null,
            "trial_period_days": null,
            "usage_type": "licensed"
          },
          "price": {
            "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
            "object": "price",
            "active": true,
            "billing_scheme": "per_unit",
            "created": 1623864151,
            "currency": "usd",
            "livemode": false,
            "lookup_key": null,
            "metadata": {
            },
            "nickname": null,
            "product": "prod_JgPF5xnq7qBun3",
            "recurring": {
              "interval": "month",
              "interval_count": 1,
              "trial_period_days": null,
              "usage_type": "licensed"
            },
            "tiers_mode": null,
            "transform_quantity": null,
            "type": "recurring",
            "unit_amount": 2000,
            "unit_amount_decimal": "2000"
          },
          "quantity": 1,
          "taxes": []
        }
      ],
      "has_more": false,
      "total_count": 1,
      "url": "/v1/invoices/in_1J34pzGPZ1iASj5zB87qdBNZ/lines"
    },
    "livemode": false,
    "metadata": {
    },
    "next_payment_attempt": null,
    "number": "C008FC2-0354",
    "on_behalf_of": null,
    "parent": {
      "quote_details": null,
      "subscription_details": {
        "metadata": {},
        "pause_collection": null,
        "subscription": "sub_JgRjFjhKbtD2qz"
      }
    },
    "payment_intent": {
      "id": "pi_1J34pzGPZ1iASj5zI2nOAaE6",
      "object": "payment_intent",
      "allowed_source_types": [
        "card"
      ],
      "amount": 2000,
      "amount_capturable": 0,
      "amount_received": 0,
      "application": null,
      "application_fee_amount": null,
      "canceled_at": null,
      "cancellation_reason": null,
      "capture_method": "automatic",
      "charges": {
        "object": "list",
        "data": [

        ],
        "has_more": false,
        "total_count": 0,
        "url": "/v1/charges?payment_intent=pi_1J34pzGPZ1iASj5zI2nOAaE6"
      },
      "client_secret": "pi_1J34pzGPZ1iASj5zI2nOAaE6_secret_l7FN6ldFfXiFmJEumenJ2y2wu",
      "confirmation_method": "automatic",
      "created": 1623873347,
      "currency": "usd",
      "customer": "cus_CMqDWO2xODTZqt",
      "description": "Subscription creation",
      "invoice": "in_1J34pzGPZ1iASj5zB87qdBNZ",
      "last_payment_error": null,
      "livemode": false,
      "metadata": {
      },
      "next_action": null,
      "next_source_action": null,
      "on_behalf_of": null,
      "payment_method": null,
      "payment_method_options": {
        "card": {
          "installments": null,
          "network": null,
          "request_three_d_secure": "automatic"
        }
      },
      "payment_method_types": [
        "card"
      ],
      "receipt_email": null,
      "review": null,
      "setup_future_usage": "off_session",
      "shipping": null,
      "source": "card_1By6iQGPZ1iASj5z7ijKBnXJ",
      "statement_descriptor": null,
      "statement_descriptor_suffix": null,
      "status": "requires_confirmation",
      "transfer_data": null,
      "transfer_group": null
    },
    "payment_settings": {
      "payment_method_options": null,
      "payment_method_types": null,
      "save_default_payment_method": "on_subscription"
    },
    "period_end": 1623873347,
    "period_start": 1623873347,
    "post_payment_credit_notes_amount": 0,
    "pre_payment_credit_notes_amount": 0,
    "receipt_number": null,
    "starting_balance": 0,
    "statement_descriptor": null,
    "status": "open",
    "status_transitions": {
      "finalized_at": 1623873347,
      "marked_uncollectible_at": null,
      "paid_at": null,
      "voided_at": null
    },
    "subscription": "sub_JgRjFjhKbtD2qz",
    "subtotal": 2000,
    "tax": null,
    "tax_percent": null,
    "total": 2000,
    "total_discount_amounts": [],
    "total_tax_amounts": [],
    "transfer_data": null,
    "webhooks_delivered_at": 1623873347
  },
  "livemode": false,
  "metadata": {
  },
  "next_pending_invoice_item_invoice": null,
  "pause_collection": null,
  "pending_invoice_item_interval": null,
  "pending_setup_intent": null,
  "pending_update": null,
  "plan": {
    "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
    "object": "plan",
    "active": true,
    "amount": 2000,
    "amount_decimal": "2000",
    "billing_scheme": "per_unit",
    "created": 1623864151,
    "currency": "usd",
    "interval": "month",
    "interval_count": 1,
    "livemode": false,
    "metadata": {
    },
    "nickname": null,
    "product": "prod_JgPF5xnq7qBun3",
    "tiers": null,
    "tiers_mode": null,
    "transform_usage": null,
    "trial_period_days": null,
    "usage_type": "licensed"
  },
  "quantity": 1,
  "schedule": null,
  "start": 1623873347,
  "start_date": 1623873347,
  "status": "incomplete",
  "tax_percent": null,
  "transfer_data": null,
  "trial_end": null,
  "trial_start": null
}
```

#### Customers&nbsp;v1

```json
{"id": "sub_JgRjFjhKbtD2qz",
  "object": "subscription",
  "application_fee_percent": null,
  "automatic_tax": {
    "disabled_reason": null,
    "enabled": false,
    "liability": "null"
  },
  "billing_cycle_anchor": 1623873347,
  "billing_cycle_anchor_config": null,
  "cancel_at": null,
  "cancel_at_period_end": false,
  "canceled_at": null,
  "cancellation_details": {
    "comment": null,
    "feedback": null,
    "reason": null
  },
  "collection_method": "charge_automatically",
  "created": 1623873347,
  "currency": "usd","customer": identifier("customer"),
  "days_until_due": null,
  "default_payment_method": null,
  "default_source": null,
  "default_tax_rates": [

  ],
  "discounts": [],
  "ended_at": null,
  "invoice_customer_balance_settings": {
    "account_tax_ids": null,
    "issuer": {
      "type": "self"
    }
  },
  "items": {
    "object": "list",
    "data": [
      {
        "id": "si_JgRjmS4Ur1khEx",
        "object": "subscription_item",
        "created": 1623873347,"current_period_end": 1626465347,
        "current_period_start": 1623873347,
        "discounts": [],
        "metadata": {
        },
        "plan": {
          "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
          "object": "plan",
          "active": true,
          "amount": 2000,
          "amount_decimal": "2000",
          "billing_scheme": "per_unit",
          "created": 1623864151,
          "currency": "usd",
          "interval": "month",
          "interval_count": 1,
          "livemode": false,
          "metadata": {
          },
          "nickname": null,
          "product": "prod_JgPF5xnq7qBun3",
          "tiers": null,
          "tiers_mode": null,
          "transform_usage": null,
          "trial_period_days": null,
          "usage_type": "licensed"
        },
        "price": {
          "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
          "object": "price",
          "active": true,
          "billing_scheme": "per_unit",
          "created": 1623864151,
          "currency": "usd",
          "livemode": false,
          "lookup_key": null,
          "metadata": {
          },
          "nickname": null,
          "product": "prod_JgPF5xnq7qBun3",
          "recurring": {
            "interval": "month",
            "interval_count": 1,
            "trial_period_days": null,
            "usage_type": "licensed"
          },
          "tiers_mode": null,
          "transform_quantity": null,
          "type": "recurring",
          "unit_amount": 2000,
          "unit_amount_decimal": "2000"
        },
        "quantity": 1,
        "subscription": "sub_JgRjFjhKbtD2qz",
        "tax_rates": [

        ]
      }
    ],
    "has_more": false,
    "total_count": 1,
    "url": "/v1/subscription_items?subscription=sub_JgRjFjhKbtD2qz"
  },
  "latest_invoice": {
    "id": "in_1J34pzGPZ1iASj5zB87qdBNZ",
    "object": "invoice",
    "account_country": "US",
    "account_name": "Angelina's Store",
    "account_tax_ids": null,
    "amount_due": 2000,
    "amount_overpaid": 0,
    "amount_paid": 0,
    "amount_remaining": 2000,
    "amount_shipping": 0,
    "attempt_count": 0,
    "attempted": false,
    "auto_advance": false,
    "automatic_tax": {
      "disabled_reason": null,
      "enabled": false,
      "liability": null,
      "status": null
    },
    "automatically_finalizes_at": null,
    "billing_reason": "subscription_update",
    "collection_method": "charge_automatically",
    "created": 1623873347,
    "currency": "usd",
    "custom_fields": null,
    "customer": identifier("customer"),
    "customer_address": null,
    "customer_email": "angelina@stripe.com",
    "customer_name": null,
    "customer_phone": null,
    "customer_shipping": {
      "address": {
        "city": "",
        "country": "US",
        "line1": "Berry",
        "line2": "",
        "postal_code": "",
        "state": ""
      },
      "name": "",
      "phone": null
    },
    "customer_tax_exempt": "none",
    "customer_tax_ids": [

    ],
    "default_payment_method": null,
    "default_source": null,
    "default_tax_rates": [

    ],
    "description": null,
    "discounts": [],
    "due_date": null,
    "effective_at": "1623873347",
    "ending_balance": 0,
    "footer": null,
    "from_invoice": null,
    "hosted_invoice_url": "https://invoice.stripe.com/i/acct_1By64KGPZ1iASj5z/invst_JgRjzIOILGeq2MKC9T0KtyXnD5udsLp",
    "invoice_pdf": "https://pay.stripe.com/invoice/acct_1By64KGPZ1iASj5z/invst_JgRjzIOILGeq2MKC9T0KtyXnD5udsLp/pdf",
    "last_finalization_error": null,
    "latest_revision": null,
    "lines": {
      "object": "list",
      "data": [
        {
          "id": "il_1N2CjMBwKQ696a5NeOawRQP2",
          "object": "line_item",
          "amount": 2000,
          "currency": "usd",
          "description": "1 × Gold Special (at $20.00 / month)",
          "discount_amounts": [

          ],
          "discountable": true,
          "discounts": [

          ],
          "invoice": "in_1J34pzGPZ1iASj5zB87qdBNZ",
          "livemode": false,
          "metadata": {
          },
          "parent": {
            "invoice_item_details": null,
            "subscription_item_details":
            {
              "invoice_item": null,
            "proration": false,
            "proration_details":
            {
              "credited_items": null
            },
            "subscription":
            "sub_JgRjFjhKbtD2qz",
            "subscription_item":
              "si_JgRjmS4Ur1khEx"
            },
            "type": "subscription_item_details"
          },
          "period": {
            "end": 1626465347,
            "start": 1623873347
          },
          "plan": {
            "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
            "object": "plan",
            "active": true,
            "amount": 2000,
            "amount_decimal": "2000",
            "billing_scheme": "per_unit",
            "created": 1623864151,
            "currency": "usd",
            "interval": "month",
            "interval_count": 1,
            "livemode": false,
            "metadata": {
            },
            "nickname": null,
            "product": "prod_JgPF5xnq7qBun3",
            "tiers": null,
            "tiers_mode": null,
            "transform_usage": null,
            "trial_period_days": null,
            "usage_type": "licensed"
          },
          "price": {
            "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
            "object": "price",
            "active": true,
            "billing_scheme": "per_unit",
            "created": 1623864151,
            "currency": "usd",
            "livemode": false,
            "lookup_key": null,
            "metadata": {
            },
            "nickname": null,
            "product": "prod_JgPF5xnq7qBun3",
            "recurring": {
              "interval": "month",
              "interval_count": 1,
              "trial_period_days": null,
              "usage_type": "licensed"
            },
            "tiers_mode": null,
            "transform_quantity": null,
            "type": "recurring",
            "unit_amount": 2000,
            "unit_amount_decimal": "2000"
          },
          "quantity": 1,
          "taxes": []
        }
      ],
      "has_more": false,
      "total_count": 1,
      "url": "/v1/invoices/in_1J34pzGPZ1iASj5zB87qdBNZ/lines"
    },
    "livemode": false,
    "metadata": {
    },
    "next_payment_attempt": null,
    "number": "C008FC2-0354",
    "on_behalf_of": null,
    "parent": {
      "quote_details": null,
      "subscription_details": {
        "metadata": {},
        "pause_collection": null,
        "subscription": "sub_JgRjFjhKbtD2qz"
      }
    },
    "payment_intent": {
      "id": "pi_1J34pzGPZ1iASj5zI2nOAaE6",
      "object": "payment_intent",
      "allowed_source_types": [
        "card"
      ],
      "amount": 2000,
      "amount_capturable": 0,
      "amount_received": 0,
      "application": null,
      "application_fee_amount": null,
      "canceled_at": null,
      "cancellation_reason": null,
      "capture_method": "automatic",
      "charges": {
        "object": "list",
        "data": [

        ],
        "has_more": false,
        "total_count": 0,
        "url": "/v1/charges?payment_intent=pi_1J34pzGPZ1iASj5zI2nOAaE6"
      },
      "client_secret": "pi_1J34pzGPZ1iASj5zI2nOAaE6_secret_l7FN6ldFfXiFmJEumenJ2y2wu",
      "confirmation_method": "automatic",
      "created": 1623873347,
      "currency": "usd",
      "customer": "cus_CMqDWO2xODTZqt",
      "description": "Subscription creation",
      "invoice": "in_1J34pzGPZ1iASj5zB87qdBNZ",
      "last_payment_error": null,
      "livemode": false,
      "metadata": {
      },
      "next_action": null,
      "next_source_action": null,
      "on_behalf_of": null,
      "payment_method": null,
      "payment_method_options": {
        "card": {
          "installments": null,
          "network": null,
          "request_three_d_secure": "automatic"
        }
      },
      "payment_method_types": [
        "card"
      ],
      "receipt_email": null,
      "review": null,
      "setup_future_usage": "off_session",
      "shipping": null,
      "source": "card_1By6iQGPZ1iASj5z7ijKBnXJ",
      "statement_descriptor": null,
      "statement_descriptor_suffix": null,
      "status": "requires_confirmation",
      "transfer_data": null,
      "transfer_group": null
    },
    "payment_settings": {
      "payment_method_options": null,
      "payment_method_types": null,
      "save_default_payment_method": "on_subscription"
    },
    "period_end": 1623873347,
    "period_start": 1623873347,
    "post_payment_credit_notes_amount": 0,
    "pre_payment_credit_notes_amount": 0,
    "receipt_number": null,
    "starting_balance": 0,
    "statement_descriptor": null,
    "status": "open",
    "status_transitions": {
      "finalized_at": 1623873347,
      "marked_uncollectible_at": null,
      "paid_at": null,
      "voided_at": null
    },
    "subscription": "sub_JgRjFjhKbtD2qz",
    "subtotal": 2000,
    "tax": null,
    "tax_percent": null,
    "total": 2000,
    "total_discount_amounts": [],
    "total_tax_amounts": [],
    "transfer_data": null,
    "webhooks_delivered_at": 1623873347
  },
  "livemode": false,
  "metadata": {
  },
  "next_pending_invoice_item_invoice": null,
  "pause_collection": null,
  "pending_invoice_item_interval": null,
  "pending_setup_intent": null,
  "pending_update": null,
  "plan": {
    "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
    "object": "plan",
    "active": true,
    "amount": 2000,
    "amount_decimal": "2000",
    "billing_scheme": "per_unit",
    "created": 1623864151,
    "currency": "usd",
    "interval": "month",
    "interval_count": 1,
    "livemode": false,
    "metadata": {
    },
    "nickname": null,
    "product": "prod_JgPF5xnq7qBun3",
    "tiers": null,
    "tiers_mode": null,
    "transform_usage": null,
    "trial_period_days": null,
    "usage_type": "licensed"
  },
  "quantity": 1,
  "schedule": null,
  "start": 1623873347,
  "start_date": 1623873347,
  "status": "incomplete",
  "tax_percent": null,
  "transfer_data": null,
  "trial_end": null,
  "trial_start": null
}
```

## Zahlungsinformationen erfassen [Client]

Verwenden Sie [Stripe Elements](https://docs.stripe.com/payments/elements.md), um Zahlungsdetails zu erfassen und das Abo zu aktivieren. Sie können Elements an das Erscheinungsbild Ihrer Anwendung anpassen.

Das [Payment Element](https://docs.stripe.com/payments/payment-element.md) unterstützt [Link](https://docs.stripe.com/payments/link.md), Kreditkarten, SEPA-Lastschrift und BECS-Lastschriftverfahren für Abonnements. Sie können die aktivierten Zahlungsmethoden anzeigen und die auf der Kundenauswahl basierenden Zahlungsdetails sicher erfassen.

### Stripe Elements einrichten

Das Payment Element ist automatisch als Funktion von Stripe.js verfügbar. Binden Sie das Stripe.js-Skript auf Ihrer Zahlungsseite ein, indem Sie es in den `head` Ihrer HTML-Datei einfügen. Laden Sie Stripe.js stets direkt von js.stripe.com, um PCI-konform zu bleiben. Binden Sie das Skript nicht in ein Bundle ein und hosten Sie keine eigene Kopie.

```html
<head>
  <title>Checkout</title>
  <script src="https://js.stripe.com/dahlia/stripe.js"></script>
</head>
<body>
  <!-- content here -->
</body>
```

Erstellen Sie eine Instanz von Stripe mit dem folgenden JavaScript-Code auf Ihrer Zahlungsseite:

```javascript
// Set your publishable key: remember to change this to your live publishable key in production
// See your keys here: https://dashboard.stripe.com/apikeys
const stripe = Stripe('<<YOUR_PUBLISHABLE_KEY>>');
```

### Payment Element zu Ihrer Seite hinzufügen

Das Payment Element benötigt einen festen Platz auf Ihrer Zahlungsseite. Erstellen Sie einen leeren DOM-Knoten (Container) mit einer eindeutigen ID in Ihrem Zahlungsformular.

```html
<form id="payment-form">
  <div id="payment-element">
    <!-- Elements will create form elements here -->
  </div>
  <button id="submit">Subscribe</button>
  <div id="error-message">
    <!-- Display error message to your customers here -->
  </div>
</form>
```

Nachdem das Formular geladen wurde, erstellen Sie eine Instanz des Payment Element und verbinden es mit dem Container-DOM-Knoten. Beim [Erstellen des Abos](https://docs.stripe.com/billing/subscriptions/build-subscriptions.md#create-subscription) haben Sie den Wert `client_secret` an das Frontend übergeben. Übergeben Sie diesen Wert als Option beim Erstellen einer Instanz von Elements.

```javascript
const options = {
  clientSecret: '{{CLIENT_SECRET}}',
  // Fully customizable with appearance API.
  appearance: {/*...*/},
};

// Set up Stripe.js and Elements to use in the payment form, passing the client secret obtained in step 5
const elements = stripe.elements(options);

const paymentElementOptions = {
  layout: "tabs",
};

// Create and mount the Payment Element
const paymentElement = elements.create('payment', paymentElementOptions);
paymentElement.mount('#payment-element');
```

Das Payment Element stellt ein dynamisches Formular dar, mit dem Ihre Kundinnen und Kunden eine Zahlungsmethode auswählen können. Das Formular erfasst automatisch alle notwendigen Zahlungsdetails für die ausgewählte Zahlungsmethode.

#### Optionale Konfigurationen für das Payment Element

Optional können Sie Folgendes tun:

- Sie können das Payment Element an das Design Ihrer Website anpassen, indem Sie beim Erstellen einer Instanz von Elements das [Appearance-Objekt](https://docs.stripe.com/js/elements_object/create#stripe_elements-options-appearance) an `options` übergeben.
- Konfigurieren Sie die Apple&nbsp;Pay-Schnittstelle so, dass ein [Händler-Token](https://docs.stripe.com/apple-pay/merchant-tokens.md?pay-element=web-pe) zurückgegeben wird, um wiederkehrende Zahlungen, automatisches Neuladen und verzögerte Zahlungen zu unterstützen.

### Zahlung abschließen

Verwenden Sie `stripe.confirmPayment`, um die Zahlung mit den Details aus dem Payment Element abzuschließen und das Abo zu aktivieren. Dadurch wird eine PaymentMethod erstellt und der erste PaymentIntent des unvollständigen Abos bestätigt, wodurch eine Abbuchung entsteht. Wenn die Zahlung die *starke Kundenauthentifizierung* (Strong Customer Authentication (SCA) is a regulatory requirement in effect as of September 14, 2019, that impacts many European online payments. It requires customers to use two-factor authentication like 3D Secure to verify their purchase) (SCA) erfordert, übernimmt das Payment Element den Authentifizierungsprozess, bevor der PaymentIntent bestätigt wird.

Geben Sie eine [return_url](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-return_url) an, um anzugeben, wohin Stripe die Nutzer/innen nach Durchführung der Zahlung weiterleitet. Ihre Nutzer/innen werden möglicherweise an eine zwischengeschaltete Seite weitergeleitet, wie z.&nbsp;B. eine Bankautorisierungsseite, bevor sie zur `return_url` weitergeleitet werden. Bei Kartenzahlungen werden sie sofort zur `return_url` weitergeleitet, wenn die Zahlung erfolgreich war.

```javascript
const form = document.getElementById('payment-form');

form.addEventListener('submit', async (event) => {
  event.preventDefault();
const {error} = await stripe.confirmPayment({
    //`Elements` instance that was used to create the Payment Element
    elements,
    confirmParams: {
      return_url: "https://example.com/order/123/complete",
    }
  });

  if (error) {
    // This point is reached only if there's an immediate error when
    // confirming the payment. Show an error to your customer (for example, payment
    // details incomplete)
    const messageContainer = document.querySelector('#error-message');
    messageContainer.textContent = error.message;
  } else {
    // Your customer redirects to your `return_url`. For some payment
    // methods, such as iDEAL, your customer redirects to an intermediate
    // site first to authorize the payment, and then redirects to the `return_url`.
  }
});
```

Wenn Ihr Kunde/Ihre Kundin eine Zahlung übermittelt, leitet Stripe ihn an die `return_url` weiter und fügt die folgenden URL-Abfrageparameter ein. Die Rückgabeseite kann diese nutzen, um den Status des PaymentIntent abzurufen, damit der Kunde/die Kundin den Zahlungsstatus anzeigen kann.

Wenn Sie die `return_url` angeben, können Sie auch Ihre eigenen Abfrageparameter für die Verwendung auf der Rückgabeseite anhängen.

| Parameter                      | Beschreibung                                                                                                                                                                                                                                                                                                                                                   |
| ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `payment_intent`               | Die eindeutige ID für den `PaymentIntent`.                                                                                                                                                                                                                                                                                                                     |
| `payment_intent_client_secret` | Das [Client-Geheimnis](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-client_secret) des `PaymentIntent`-Objekts. Bei Abonnementintegrationen wird dieses client_secret auch über [`confirmation_secret`](https://docs.stripe.com/api/invoices/object.md#invoice_object-confirmation_secret) im `Invoice`-Objekt sichtbar gemacht |

Wenn Kundinnen und Kunden auf Ihre Seite weitergeleitet werden, können Sie `payment_intent_client_secret` nutzen, um den PaymentIntent abzufragen und Ihren Kundinnen und Kunden den Transaktionsstatus anzuzeigen.

> Wenn Sie über Tools verfügen, die die Browser-Sitzung der Kund/innen tracken, müssen Sie möglicherweise die Domain `stripe.com` zur Referenz-Ausschlussliste hinzufügen. Weiterleitungen haben zur Folge, dass einige Tools neue Sitzungen erstellen. Dies wiederum hindert Sie daran, die gesamte Sitzung zu tracken.

Verwenden Sie einen der Abfrageparameter, um den PaymentIntent abzurufen. Überprüfen Sie den [Status des PaymentIntent](https://docs.stripe.com/payments/paymentintents/lifecycle.md), um zu entscheiden, was Ihren Kund/innen angezeigt werden soll. Sie können bei der Angabe der `return_url` auch Ihre eigenen Abfrageparameter anhängen, die während des Weiterleitungsvorgangs erhalten bleiben.

```javascript
// Initialize Stripe.js using your publishable key
const stripe = Stripe('<<YOUR_PUBLISHABLE_KEY>>');

// Retrieve the "payment_intent_client_secret" query parameter appended to
// your return_url by Stripe.js
const clientSecret = new URLSearchParams(window.location.search).get(
  'payment_intent_client_secret'
);

// Retrieve the PaymentIntent
stripe.retrievePaymentIntent(clientSecret).then(({paymentIntent}) => {
  const message = document.querySelector('#message')

  // Inspect the PaymentIntent `status` to indicate the status of the payment
  // to your customer.
  //
  // Some payment methods [immediately succeed or fail][0] upon
  // confirmation, while others first enter a `processing` status.
  //
  // [0]: https://stripe.com/docs/payments/payment-methods#payment-notification
  switch (paymentIntent.status) {
    case 'succeeded':
      message.innerText = 'Success! Payment received.';
      break;

    case 'processing':
      message.innerText = "Payment processing. We'll update you when payment is received.";
      break;

    case 'requires_payment_method':
      message.innerText = 'Payment failed. Please try another payment method.';
      // Redirect your user back to your payment page to attempt collecting
      // payment again
      break;

    default:
      message.innerText = 'Something went wrong.';
      break;
  }
});
```

## Webhooks überwachen [Server]

Um die Integration abzuschließen, müssen Sie die von Stripe gesendeten *Webhooks* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) verarbeiten. Diese Ereignisse werden immer dann ausgelöst, wenn sich der Status in Stripe ändert, z.&nbsp;B. wenn für Abos neue Rechnungen erzeugt werden. Richten Sie in Ihrer Anwendung einen HTTP-Handler ein, der eine POST-Anfrage akzeptiert, die das Webhook-Ereignis enthält, und die Signatur des Ereignisses überprüft:

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/webhook' do
  # You can use webhooks to receive information about asynchronous payment events.
  # For more about our webhook events, see https://stripe.com/docs/webhooks.
  webhook_secret = ENV['STRIPE_WEBHOOK_SECRET']
  payload = request.body.read
  if !webhook_secret.empty?
    # Retrieve the event by verifying the signature using the raw body and secret if webhook signing is configured.
    sig_header = request.env['HTTP_STRIPE_SIGNATURE']
    event = nil

    begin
      event = Stripe::Webhook.construct_event(
        payload, sig_header, webhook_secret
      )
    rescue JSON::ParserError => e
      # Invalid payload
      status 400
      return
    rescue Stripe::SignatureVerificationError => e
      # Invalid signature
      puts '⚠️  Webhook signature verification failed.'
      status 400
      return
    end
  else
    data = JSON.parse(payload, symbolize_names: true)
    event = Stripe::Event.construct_from(data)
  end
  # Get the type of webhook event sent - used to check the status of PaymentIntents.
  event_type = event['type']
  data = event['data']
  data_object = data['object']

  if event_type == 'invoice.paid'
    # Used to provision services after the trial has ended.
    # The status of the invoice shows up as paid. Store the status in your
    # database to reference when a user accesses your service to avoid hitting rate
    # limits.
    # puts data_object
  end

  if event_type == 'invoice.payment_failed'
    # If the payment fails or the customer doesn't have a valid payment method,
    # an invoice.payment_failed event is sent and the subscription becomes past_due.
    # Use this webhook to notify your user that their payment has
    # failed and to retrieve new card details.
    # puts data_object
  end

  if event_type == 'customer.subscription.deleted'
    # handle subscription canceled automatically based
    # upon your subscription settings. Or if the user cancels it.
    # puts data_object
  end

  content_type 'application/json'
  { status: 'success' }.to_json
end
```

Verwenden Sie während der Entwicklung die Stripe CLI, um [Webhooks zu überwachen und an Ihre Anwendung weiterzuleiten](https://docs.stripe.com/webhooks.md#test-webhook). Führen Sie Folgendes in einem neuen Datenterminal aus, während Ihre Entwicklungs-App ausgeführt wird:

#### curl

```bash
  stripe listen --forward-to localhost:4242/webhook
```

Für die Produktionsphase können Sie einen Webhook Endpoint in [Workbench](https://docs.stripe.com/workbench.md) einrichten oder die [Webhook Endpoints API](https://docs.stripe.com/api/webhook_endpoints.md) verwenden.

Sie müssen auf einige Ereignisse achten, um die verbleibenden Schritte in diesem Leitfaden abzuschließen. Weitere Informationen zu abonnementbezogenen Webhooks finden Sie unter [Abo-Ereignisse](https://docs.stripe.com/billing/subscriptions/webhooks.md#events).

## Zugang zu Ihrer Dienstleistung bereitstellen [Client und Server]

Nachdem das Abo nun aktiv ist, gewähren Sie Ihren Nutzer/innen Zugriff auf Ihren Dienst. Überwachen Sie dazu die Ereignisse `customer.subscription.created`, `customer.subscription.updated` und `customer.subscription.deleted`. Diese Ereignisse übergeben ein `Subscription`-Objekt, das ein `status`-Feld enthält, welches anzeigt, ob das Abo aktiv oder überfällig ist oder gekündigt wurde. Eine vollständige Statusliste finden Sie unter [Abonnementlebenszyklus](https://docs.stripe.com/billing/subscriptions/overview.md#subscription-lifecycle).

In Ihrem Webhook-Handler:

1. Überprüfen Sie den Status des Abos. Wenn er `active` ist, hat der/die Nutzer/in für Ihr Produkt bezahlt.
1. Prüfen Sie das Produkt, für das die Kundin/der Kunde ein Abo abgeschlossen hat, und gewähren Sie Zugang zu Ihrem Dienst. Das Überprüfen des Produkts anstelle des Preises gibt Ihnen mehr Flexibilität, falls Sie die Preisgestaltung oder den Rechnungsstellungszeitraum ändern müssen.
1. Speichern Sie die `product.id`, `Abonnement.id` und den `Abonnement.status` in Ihrer Datenbank zusammen mit der bereits gespeicherten `customer_account.id` oder `customer.id`. Überprüfen Sie diesen Datensatz, wenn Sie entscheiden, welche Funktionen für die Nutzer/innen Ihrer Anwendung aktiviert werden sollen.

Der Status eines Abos kann sich während seiner Laufzeit jederzeit ändern, auch wenn Ihre Anwendung keine direkten Aufrufe an Stripe tätigt. So kann beispielsweise eine Verlängerung aufgrund einer abgelaufenen Karte fehlschlagen, wodurch das Abo in einen `past due`-Status versetzt wird. Oder, wenn Sie das [Kundenportal](https://docs.stripe.com/customer-management.md) implementieren, könnte ein/e Nutzer/in das Abo kündigen, ohne Ihre Anwendung direkt aufzurufen. Durch die korrekte Implementierung Ihres Handlers bleibt der Status Ihrer Anwendung mit Stripe synchronisiert.

## Abo kündigen [Client und Server]

Sie können Kund/innen die Möglichkeit bieten, ihre Abos zu kündigen. Im folgenden Beispiel wird eine Kündigungsoption zur Seite mit den Kontoeinstellungen hinzugefügt.
![Beispiel für eine Benutzeroberfläche zur Abo-Kündigung](https://b.stripecdn.com/docs-statics-srv/assets/fixed-price-subscriptions-guide-account-settings.6559626ba4b434826a67abfea165e097.png)

Kontoeinstellungen mit der Option, das Abo zu kündigen

```javascript
function cancelSubscription(subscriptionId) {
  return fetch('/cancel-subscription', {
    method: 'post',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      subscriptionId: subscriptionId,
    }),
  })
    .then(response => {
      return response.json();
    })
    .then(cancelSubscriptionResponse => {
      // Display to the user that the subscription has been canceled.
    });
}
```

Definieren Sie im Backend den Endpoint, den Ihr Frontend aufrufen soll.

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/cancel-subscription' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  deleted_subscription = client.v1.subscriptions.cancel(data['subscriptionId'])

  deleted_subscription.to_json
end
```

Ihre Anwendung empfängt ein Ereignis vom Typ `customer.subscription.deleted`.

Aktualisieren Sie nach der Kündigung des Abonnements Ihre Datenbank, um die zuvor gespeicherte Stripe-Abonnement-ID zu entfernen, und schränken Sie den Zugang zu Ihrer Dienstleistung ein.

Wenn ein Abo gekündigt wurde, kann es nicht reaktiviert werden. Sie müssen stattdessen die aktualisierten Rechnungsinformationen von Ihrer Kundinnen/Kunden erfassen, deren Standard-Zahlungsmethode aktualisieren und ein neues Abo für den bestehenden Kundendatensatz erstellen.

## Testen Sie Ihre Integration.

### Zahlungsmethoden testen

Verwenden Sie die folgende Tabelle, um verschiedene Zahlungsmethoden und -szenarien zu testen.

| Zahlungsmethode  | Szenario                                                                                                                                                                                                                                                                                                           | So führen Sie den Test durch                                                                                                                                                                                          |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| BECS-Lastschrift | Ihr/e Kund/in zahlt erfolgreich mit dem BECS-Lastschriftverfahren.                                                                                                                                                                                                                                                 | Füllen Sie das Formular mit der Kontonummer `900123456` und BSB `000000` aus. Der bestätigte PaymentIntent geht zunächst in den Status `processing` über und dann drei&nbsp;Minuten später in den Status `succeeded`. |
| BECS-Lastschrift | Die Zahlung Ihres/Ihrer Kund/in schlägt fehl mit Code `account_closed` fehl.                                                                                                                                                                                                                                       | Füllen Sie das Formular mit der Kontonummer `111111113` und BSB `000000` aus.                                                                                                                                         |
| Kreditkarte      | Die Kartenzahlung ist erfolgreich, und es ist keine Authentifizierung erforderlich.                                                                                                                                                                                                                                | Füllen Sie das Kreditkartenformular aus und geben Sie die Kreditkartennummer `4242 4242 4242 4242` mit beliebiger Gültigkeitsdauer, CVC und Postleitzahl an.                                                          |
| Kreditkarte      | Für die Kartenzahlung ist eine *Authentifizierung* (Strong Customer Authentication (SCA) is a regulatory requirement in effect as of September 14, 2019, that impacts many European online payments. It requires customers to use two-factor authentication like 3D Secure to verify their purchase) erforderlich. | Füllen Sie das Kreditkartenformular aus und geben Sie die Kreditkartennummer `4000 0025 0000 3155` mit beliebiger Gültigkeitsdauer, CVC und Postleitzahl an.                                                          |
| Kreditkarte      | Die Karte wird mit einem Ablehnungscode wie `insufficient_funds` abgelehnt.                                                                                                                                                                                                                                        | Füllen Sie das Kreditkartenformular aus und geben Sie die Kreditkartennummer `4000 0000 0000 9995` mit beliebiger Gültigkeitsdauer, CVC und Postleitzahl an.                                                          |
| SEPA-Lastschrift | Ihr/e Kund/in zahlt erfolgreich mit dem SEPA-Lastschriftverfahren.                                                                                                                                                                                                                                                 | Füllen Sie das Formular mit der Kontonummer `AT321904300235473204` aus. Die bestätigte PaymentIntent geht zunächst in den Status „wird verarbeitet“ und dann drei Minuten später in den Status „erfolgreich“ über.    |
| SEPA-Lastschrift | Der Status der PaymentIntent Ihrer Kundin/Ihre Kundin wechselt von `processing` zu `requires_payment_method`.                                                                                                                                                                                                      | Füllen Sie das Formular mit der Kontonummer `AT861904300235473202` aus.                                                                                                                                               |

### Ereignisse überwachen

Richten Sie Webhooks ein, um Abo-Änderungsereignisse wie Upgrades und Kündigungen zu überwachen. Erfahren Sie mehr über [Abo-Webhooks](https://docs.stripe.com/billing/subscriptions/webhooks.md). Sie können Ereignisse im [Dashboard](https://dashboard.stripe.com/test/events) oder mit der [Stripe CLI](https://docs.stripe.com/webhooks.md#test-webhook) anzeigen.

Weitere Informationen finden Sie unter [Billing-Integration testen](https://docs.stripe.com/billing/testing.md).

## Optional: Planänderungen auf Kundenseite zulassen [Client und Server]

Um Ihre Kund/innen Ihr Abo ändern zu lassen, erfassen Sie die Preis-ID der Option, zu der sie wechseln möchten. Übermitteln Sie dann die neue Preis-ID vom Frontend an einen Backend-Endpoint. In diesem Beispiel wird auch die Abo-ID übergeben, Sie können sie jedoch für Ihre angemeldeten Nutzer/innen aus Ihrer Datenbank abrufen.

```javascript
function updateSubscription(priceId, subscriptionId) {
  return fetch('/update-subscription', {
    method: 'post',
    headers: {
      'Content-type': 'application/json',
    },
    body: JSON.stringify({
      subscriptionId: subscriptionId,
      newPriceId: priceId,
    }),
  })
    .then(response => {
      return response.json();
    })
    .then(response => {
      return response;
    });
}
```

Definieren Sie im Backend den Endpoint für den Aufruf durch Ihr Frontend und übergeben Sie dabei die Abo-ID und die neue Preis-ID. Für das Abo gilt jetzt der Aufpreis-Tarif zum Preis von 15&nbsp;USD pro Monat anstelle des Basis-Tarifs zum Preis von 5&nbsp;USD pro Monat.

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/update-subscription' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  subscription = client.v1.subscriptions.retrieve(data['subscriptionId'])

  updated_subscription =
    client.v1.subscriptions.update(
      data['subscriptionId'],
      cancel_at_period_end: false,
      items: [
        { id: subscription.items.data[0].id, price: data['newPriceId'] }
      ]
    )

  updated_subscription.to_json
end
```

Ihre Anwendung empfängt ein Ereignis vom Typ `customer.subscription.updated`.

## Optional: Vorschau einer Preisänderung anzeigen [Client und Server]

Bei Änderungen eines Abos durch Kund/innen wird häufig der geschuldete Betrag angepasst. Diese Anpassung wird als [anteilmäßige Verrechnung](https://docs.stripe.com/billing/subscriptions/prorations.md) bezeichnet. Mithilfe des [Endpoints zum Erstellen einer Rechnungsvorschau](https://docs.stripe.com/api/invoices/create_preview.md) können Sie Ihren Kund/innen den angepassten Betrag anzeigen.

Übergeben Sie im Frontend die Details zum `create preview invoice` an einen Backend-Endpoint.

#### Accounts&nbsp;v2

```javascript
function createPreviewInvoice(
  customerAccountId,
  subscriptionId,
  newPriceId,
  trialEndDate
) {
  return fetch('/create-preview-invoice', {
    method: 'post',
    headers: {
      'Content-type': 'application/json',
    },
    body: JSON.stringify({
      customerAccountId: customerAccountId,
      subscriptionId: subscriptionId,
      newPriceId: newPriceId,
    }),
  })
    .then(response => {
      return response.json();
    })
    .then((invoice) => {
      return invoice;
    });
}
```

#### Customers&nbsp;v1

```javascript
function createPreviewInvoice(
  customerId,
  subscriptionId,
  newPriceId,
  trialEndDate
) {
  return fetch('/create-preview-invoice', {
    method: 'post',
    headers: {
      'Content-type': 'application/json',
    },
    body: JSON.stringify({
      customerId: customerId,
      subscriptionId: subscriptionId,
      newPriceId: newPriceId,
    }),
  })
    .then(response => {
      return response.json();
    })
    .then((invoice) => {
      return invoice;
    });
}
```

Definieren Sie im Backend den Endpoint, den Ihr Frontend aufrufen soll.

#### Accounts&nbsp;v2

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/create-preview-invoice' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  subscription = Stripe::Subscription.retrieve(data['subscriptionId'])

  invoice =
    Stripe::Invoice.create_preview(
      customer_account: data['customerAccountId'],
      subscription: data['subscriptionId'],
      subscription_details: {
        items: [
          { id: subscription.items.data[0].id, deleted: true },
          { price: data['newPriceId'], deleted: false }
        ]
      }
    )

  invoice.to_json
end
```

#### Customers&nbsp;v1

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/create-preview-invoice' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  subscription = client.v1.subscriptions.retrieve(data['subscriptionId'])

  invoice =
    client.v1.invoices.create_preview(
      customer: data['customerId'],
      subscription: data['subscriptionId'],
      subscription_details: {
        items: [
          { id: subscription.items.data[0].id, deleted: true },
          { price: data['newPriceId'], deleted: false }
        ]
      }
    )

  invoice.to_json
end
```

## Optional: Zahlungsmethode der Kunden anzeigen [Client und Server]

Wenn der Kartenaussteller und die letzten vier Ziffern der Karte angezeigt werden, wissen Kunden eher, welche Karte belastet wird, und können gegebenenfalls die Zahlungsmethode aktualisieren.

Senden Sie im Frontend die ID der Zahlungsmethode an einen Backend-Endpoint, der die Details zur Zahlungsmethode abruft.

```javascript
function retrieveCustomerPaymentMethod(paymentMethodId) {
  return fetch('/retrieve-customer-payment-method', {
    method: 'post',
    headers: {
      'Content-type': 'application/json',
    },
    body: JSON.stringify({
      paymentMethodId: paymentMethodId,
    }),
  })
    .then((response) => {
      return response.json();
    })
    .then((response) => {
      return response;
    });
}
```

Definieren Sie im Backend den Endpoint, den Ihr Frontend aufrufen soll.

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/retrieve-customer-payment-method' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  payment_method = client.v1.payment_methods.retrieve(data['paymentMethodId'])

  payment_method.to_json
end
```

Beispielantwort:

```json
{
  "id": "pm_1GcbHY2eZvKYlo2CoqlVxo42",
  "object": "payment_method",
  "billing_details": {
    "address": {
      "city": null,
      "country": null,
      "line1": null,
      "line2": null,
      "postal_code": null,
      "state": null
    },
    "email": null,
    "name": null,
    "phone": null
  },
  "card": {
    "brand": "visa",
    "checks": {
      "address_line1_check": null,
      "address_postal_code_check": null,
      "cvc_check": "pass"
    },
    "country": "US",
    "exp_month": 8,
    "exp_year": 2021,
    "fingerprint": "Xt5EWLLDS7FJjR1c",
    "funding": "credit",
    "generated_from": null,
    "last4": "4242",
    "three_d_secure_usage": {
      "supported": true
    },
    "wallet": null
  },
  "created": 1588010536,
  "customer": "cus_HAxB7dVQxhoKLh",
  "livemode": false,
  "metadata": {},
  "type": "card"
}
```

> Wir empfehlen, `paymentMethod.id` und `last4` in Ihrer Datenbank zu speichern (zum Beispiel `paymentMethod.id` als `stripeCustomerPaymentMethodId` in Ihrer Auflistung oder Tabelle für `users`). Optional können Sie je nach Bedarf `exp_month`, `exp_year`, `fingerprint` und `billing_details` speichern. Dadurch wird die Anzahl der Aufrufe an Stripe beschränkt, um die Leistung zu steigern und eventuelle Begrenzungen zu vermeiden.

## Stripe Ihren Kundinnen/Kunden anzeigen

Stripe erfasst Informationen über Kundeninteraktionen mit Elements , um Ihnen Dienste bereitzustellen, Betrug vorzubeugen und seine Dienste zu verbessern. Dies umfasst auch die Verwendung von Cookies und IP-Adressen, um zu ermitteln, welche Elements ein/e Kund/in während einer einzelnen Checkout-Sitzung gesehen hat. Sie sind dafür verantwortlich, alle Rechte und Zustimmungen offenzulegen und einzuholen, die Stripe benötigen, um Ihre Daten auf diese Weise zu nutzen. Weitere Informationen finden Sie in unserem [Datenschutzcenter](https://stripe.com/legal/privacy-center#as-a-business-user-what-notice-do-i-provide-to-my-end-customers-about-stripe).

#### Mobil

#### iOS

Erfahren Sie, wie Sie Abos mit festem Preis *verkaufen* (A Subscription represents the product details associated with the plan that your customer subscribes to. Allows you to charge the customer on a recurring basis). Sie verwenden das [Mobile Payment Element](https://docs.stripe.com/payments/accept-a-payment.md), um ein benutzerdefiniertes Zahlungsformular zu erstellen, das Sie in Ihre App einbetten.
![Seite für Festpreisabonnements mit Mobile Payment Element](https://b.stripecdn.com/docs-statics-srv/assets/fixed-price-collect-payment-details-mobile.b11cdc8fa8952d753238df4df3375fa6.png)

> Wenn Sie digitale Produkte oder Dienstleistungen verkaufen, die in Ihrer App verwendet werden (zum Beispiel Abonnements, In-Game-Währungen, Level in einem Spiel, Zugriff auf Premium-Inhalte oder das Freischalten einer Vollversion), müssen Sie die In-App-Kauf-APIs von Apple nutzen. Einige Verkäufe sind von dieser Regel ausgenommen, darunter persönliche Dienste an Einzelpersonen und [Apps in bestimmten Regionen](https://support.stripe.com/questions/changes-to-mobile-app-store-rules). Weitere Informationen finden Sie in [den Überprüfungsrichtlinien des App Store](https://developer.apple.com/app-store/review/guidelines/#payments).

## Abonnement erstellen

Dieser Leitfaden bietet Informationen zu den folgenden Vorgehensweisen:

- Modellieren Sie Ihr Unternehmen, indem Sie einen Produktkatalog erstellen.
- Erstellen Sie einen Registrierungsprozess, um Kundinnen/Kunden hinzuzufügen.
- Abonnements erstellen und Zahlungsinformationen erfassen.
- Den Status von Zahlungen und Abonnements testen und überwachen.
- Kundinnen/Kunden ihren Plan ändern oder das Abonnement kündigen lassen.
- Erfahren Sie, wie Sie mit dem [flexiblen Abrechnungsmodus](https://docs.stripe.com/billing/subscriptions/billing-mode.md) von einem verbesserten Abrechnungsverhalten profitieren und auf zusätzliche Funktionen zugreifen können.

## So modellieren Sie das Abonnement bei Stripe

[Subscriptions](https://docs.stripe.com/api/subscriptions.md) vereinfachen Ihre Billing, indem sie automatisch *Rechnungen* (Invoices are statements of amounts owed by a customer. They track the status of payments from draft through paid or otherwise finalized. Subscriptions automatically generate invoices, or you can manually create a one-off invoice) und [PaymentIntents](https://docs.stripe.com/api/payment_intents.md) für Sie erstellen. Um ein Abo zu erstellen und zu aktivieren, müssen Sie zunächst ein *Produkt* (Products represent what your business sells—whether that's a good or a service) erstellen, um das verkaufte Produkt zu modellieren, sowie einen *Preis* (Prices define how much and how often to charge for products. This includes how much the product costs, what currency to use, and the interval if the price is for subscriptions), der das Intervall und den zu berechnenden Betrag festlegt. Außerdem benötigen Sie entweder ein vom Kunden oder von der Kundin konfiguriertes `Konto`-Objekt oder ein `Kunden`-Objekt, um die *Zahlungsmethoden* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs) zu speichern, die für die einzelnen wiederkehrenden Zahlungen verwendet werden.

#### Accounts&nbsp;v2
Ein Diagramm, das gängige Abrechnungsobjekte und ihre Beziehungen veranschaulicht (See full diagram at https://docs.stripe.com/billing/subscriptions/build-subscriptions)
#### Customer&nbsp;v1
Ein Diagramm, das gängige Abrechnungsobjekte und ihre Beziehungen veranschaulicht (See full diagram at https://docs.stripe.com/billing/subscriptions/build-subscriptions)
### API-Objekt-Definitionen

| Ressource                                                                                                                                 | Definition                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| ----------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Als Kunde/Kundin konfiguriertes Konto](https://docs.stripe.com/api/v2/core/accounts/create.md#v2_create_accounts-configuration-customer) | Stellt in der Accounts v2 API eine Kundin/einen Kunden dar, die/der ein Abonnement erwirbt. Konfigurieren Sie ein `Account`-Objekt als Kundin/Kunde und verknüpfen Sie es mit einem Abonnement, um wiederkehrende Zahlungen zu erheben und nachzuverfolgen sowie die abonnierten Produkte zu verwalten. Weitere Informationen finden Sie im [Leitfaden zur Verwendung von Accounts als Kundin/Kunde](https://docs.stripe.com/connect/use-accounts-as-customers.md).                                                                                     |
| [Kundin/Kunde](https://docs.stripe.com/api/customers.md)                                                                                  | Stellt eine Kundin/einen Kundin in der Customers API dar, die/der ein Abonnement erwirbt. Verwenden Sie das mit einem Abonnement verknüpfte `Customer`-Objekt, um wiederkehrende Zahlungen durchzuführen und zu verfolgen und die abonnierten Produkte zu verwalten.                                                                                                                                                                                                                                                                                    |
| [Berechtigung](https://docs.stripe.com/api/entitlements/active-entitlement.md)                                                            | Stellt den Zugriff eines Kunden/einer Kundin auf eine Funktion dar, die in einem Dienstleistungsprodukt enthalten ist, das er/sie abonniert hat. Wenn Sie ein Abonnement für den wiederkehrenden Kauf eines Produkts durch einen Kunden/eine Kundin erstellen, wird automatisch eine aktive Berechtigung für jede diesem Produkt zugeordnete Funktion erstellt. Wenn ein Kunde/eine Kundin auf Ihre Dienstleistungen zugreift, verwenden Sie seine/ihre aktiven Berechtigungen, um die in seinem/ihrem Abonnement enthaltenen Funktionen zu aktivieren. |
| [Funktion](https://docs.stripe.com/api/entitlements/feature.md)                                                                           | Stellt eine Funktion oder Fähigkeit dar, auf die Ihre Kundinnen und Kunden zugreifen können, wenn sie ein Dienstleistungsprodukt abonnieren. Sie können Funktionen in ein Produkt einfügen, indem Sie ProductFeatures erstellen.                                                                                                                                                                                                                                                                                                                        |
| [Rechnung](https://docs.stripe.com/api/invoices.md)                                                                                       | Eine Aufstellung der Beträge, die ein Kunde/eine Kundin schuldet, die den Zahlungsstatus vom Entwurf bis zur Bezahlung oder anderweitigem Abschluss verfolgt. Bei Abonnements werden automatisch Rechnungen erstellt.                                                                                                                                                                                                                                                                                                                                   |
| [PaymentIntent](https://docs.stripe.com/api/payment_intents.md)                                                                           | Eine Möglichkeit zum Erstellen dynamischer Zahlungsabläufe. Mit einem PaymentIntent wird der Lebenszyklus der Bezahlvorgänge von Kundinnen/Kunden verfolgt, und es werden zusätzliche Authentifizierungsschritte ausgelöst, wenn dies aufgrund von gesetzlichen Vorschriften, nutzerdefinierten Radar-Betrugsregeln oder auf Weiterleitung basierenden Zahlungsmethoden erforderlich ist. Rechnungen erstellen automatisch PaymentIntents.                                                                                                              |
| [PaymentMethod](https://docs.stripe.com/api/payment_methods.md)                                                                           | Die Zahlungsmethoden einer Kundin/eines Kunden, mit denen sie/er für Ihre Produkte bezahlt. Sie können beispielsweise eine Kreditkarte in einem kundenkonfigurierten `Account` oder `Customer` speichern und damit wiederkehrende Zahlungen für diese Kundin/diesen Kunden/ vornehmen. Wird in der Regel mit der Payment Intents API oder der Setup Intents API verwendet.                                                                                                                                                                              |
| [Preis](https://docs.stripe.com/api/prices.md)                                                                                            | Definiert den Stückpreis, die Währung und den Rechnungszyklus für ein Produkt.                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| [Produkt](https://docs.stripe.com/api/products.md)                                                                                        | Eine Ware oder Dienstleistung, die Ihr Unternehmen verkauft. Ein Dienstleistungsprodukt kann eine oder mehrere Funktionen beinhalten.                                                                                                                                                                                                                                                                                                                                                                                                                   |
| [ProductFeature](https://docs.stripe.com/api/product-feature.md)                                                                          | Stellt die Aufnahme einer einzelnen Funktion in ein einzelnes Produkt dar. Jedes Produkt ist für jede Funktion, die es enthält, mit einer ProductFeature verknüpft, und jede Funktion ist für jedes Produkt, das sie enthält, mit einer ProductFeature verknüpft.                                                                                                                                                                                                                                                                                       |
| [Abonnement](https://docs.stripe.com/api/subscriptions.md)                                                                                | Stellt den geplanten wiederkehrenden Kauf eines Produkts durch einen Kunden/eine Kundin dar. Verwenden Sie ein Abonnement, um Zahlungen einzuziehen und eine wiederholte Lieferung oder einen kontinuierlichen Zugriff auf ein Produkt zu ermöglichen.                                                                                                                                                                                                                                                                                                  |

Hier ist ein Beispiel dafür, wie Produkte, Funktionen und Berechtigungen zusammen funktionieren. Stellen Sie sich vor, Sie möchten einen wiederkehrenden Service einrichten, der zwei Stufen anbietet: ein Standard-Produkt mit grundlegenden Funktionalitäten und ein erweitertes Produkt, das erweiterte Funktionalitäten bietet.

1. Sie erstellen zwei Funktionen: `basic_features` und `extended_features`.
1. Sie erstellen zwei Produkte: `standard_product` und `advanced_product`.
1. Für das Standardprodukt erstellen Sie eine ProductFeature, die `basic_features` mit `standard_product` verknüpft.
1. Für das erweiterte Produkt erstellen Sie zwei ProductFeatures: eine, die `basic_features` mit `advanced_product` verknüpft, und eine, die `extended_features` mit `advanced_product` verknüpft.

Ein Kunde/eine Kundin, `first_customer`, abonniert das Standardprodukt. Wenn Sie das Abonnement erstellen, erstellt Stripe automatisch eine Berechtigung, die `first_customer` mit `basic_features` verknüpft.

Ein anderer Kunde/eine andere Kundin, `second_customer`, abonniert das erweiterte Produkt. Wenn Sie das Abonnement erstellen, erstellt Stripe automatisch zwei Berechtigungen: eine, die `second_customer` mit `basic_features` verknüpft, und eine, die `second_customer` mit `extended_features` verknüpft.

Sie können festlegen, welche Funktionen für einen Kunden/eine Kundin bereitgestellt werden sollen, indem Sie [seine/ihre aktiven Berechtigungen abrufen oder das Ereignis mit der Zusammenfassung der aktiven Berechtigungen überwachen](https://docs.stripe.com/billing/entitlements.md#entitlements). Sie müssen ihre Abonnements, Produkte und Funktionen nicht abrufen.

## Stripe einrichten

Das [Stripe iOS SDK](https://github.com/stripe/stripe-ios) ist Open Source, [vollständig dokumentiert](https://stripe.dev/stripe-ios/index.html) und kompatibel mit Apps, die iOS 13 oder höher unterstützen.

#### Swift Package Manager

Führen Sie zur Installation des SDK die folgenden Schritte aus:

1. Wählen Sie in Xcode **Datei** > **Add Package Dependencies** (Paketabhängigkeiten hinzufügen) aus und geben Sie als Repository-URL `https://github.com/stripe/stripe-ios-spm` ein.
1. Wählen auf unserer [Veröffentlichungsseite](https://github.com/stripe/stripe-ios/releases) die neueste Version aus.
1. Fügen Sie das Produkt **StripePaymentSheet** zum [Ziel Ihrer App](https://developer.apple.com/documentation/swift_packages/adding_package_dependencies_to_your_app) hinzu.

#### CocoaPods

1. Falls noch nicht geschehen, installieren Sie bitte die aktuellste Version von [CocoaPods](https://guides.cocoapods.org/using/getting-started.html).
1. Wenn Sie keine bestehende [Podfile](https://guides.cocoapods.org/syntax/podfile.html) haben, führen Sie folgenden Befehl aus, um eine zu erstellen:
   ```bash
   pod init
   ```
1. Fügen Sie folgende Zeile in Ihre `Podfile` ein:
   ```podfile
   pod 'StripePaymentSheet'
   ```
1. Führen Sie folgenden Befehl aus:
   ```bash
   pod install
   ```
1. Vergessen Sie nicht, ab jetzt in Zukunft anstelle der Datei `.xcodeproj` die Datei `.xcworkspace` zum Öffnen Ihres Projekts in Xcode zu verwenden.
1. Führen Sie für zukünftige Updates auf die jeweils aktuelle Version des SDK Folgendes aus:
   ```bash
   pod update StripePaymentSheet
   ```

#### Carthage

1. Falls noch nicht geschehen, installieren Sie bitte die aktuelle Version von [Carthage](https://github.com/Carthage/Carthage#installing-carthage).
1. Fügen Sie folgende Zeile in Ihre `Cartfile` ein:
   ```cartfile
   github "stripe/stripe-ios"
   ```
1. Befolgen Sie die [Carthage-Installationsanweisungen](https://github.com/Carthage/Carthage#if-youre-building-for-ios-tvos-or-watchos). Vergewissern Sie sich, dass Sie alle [hier](https://github.com/stripe/stripe-ios/tree/master/StripePaymentSheet/README.md#manual-linking) aufgeführten erforderlichen Frameworks einbetten.
1. Führen Sie für zukünftige Updates auf die aktuelle Version unseres SDK einfach folgenden Befehl aus:
   ```bash
   carthage update stripe-ios --platform ios
   ```

#### Manuelles Framework

1. Gehen Sie auf unsere [GitHub-Release-Seite](https://github.com/stripe/stripe-ios/releases/latest), laden Sie **Stripe.xcframework.zip** herunter und entpacken Sie die Datei.
1. Ziehen Sie **StripePaymentSheet.xcframework** in den Abschnitt **Embedded Binaries** (Eingebettete Binärdateien) der Einstellungen unter **General** (Allgemeines) Ihres Xcode-Projekts. Aktivieren Sie dabei die Option **Copy items if needed** (Elemente kopieren, falls nötig).
1. Wiederholen Sie Schritt 2 für alle [hier](https://github.com/stripe/stripe-ios/tree/master/StripePaymentSheet/README.md#manual-linking) aufgeführten erforderlichen Frameworks.
1. Wiederholen Sie für zukünftige Updates auf die jeweils aktuelle Version des SDK die Schritte 1–3.

> Details zur aktuellen SDK-Version und zu vorherigen Versionen finden Sie auf der Seite [Releases](https://github.com/stripe/stripe-ios/releases) auf GitHub. Um bei Veröffentlichung einer neuen Version eine Benachrichtigung zu erhalten, [achten Sie auf die Releases zum jeweiligen Repository](https://help.github.com/en/articles/watching-and-unwatching-releases-for-a-repository#watching-releases-for-a-repository).

Konfigurieren Sie das SDK mit Ihrem [veröffentlichbaren Schlüssel](https://dashboard.stripe.com/test/apikeys) von Stripe, um es beim Start der App auszuführen. Dadurch kann Ihre App Anfragen an die Stripe-API senden.

#### Swift

```swift
import UIKitimportStripePaymentSheet

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {StripeAPI.defaultPublishableKey = "<<YOUR_PUBLISHABLE_KEY>>"
        // do any other necessary launch configuration
        return true
    }
}
```

> Verwenden Sie Ihre [Testschlüssel](https://docs.stripe.com/keys.md#obtain-api-keys) beim Testen und Entwickeln Ihrer App und Ihre [Live-Modus](https://docs.stripe.com/keys.md#test-live-modes)-Schlüssel beim Veröffentlichen Ihrer App.

Installieren Sie dann die Stripe-CLI. Mit der Stripe-CLI können Sie Webhooks testen und Stripe-APIs aufrufen. In einem späteren Abschnitt dieses Leitfadens wird erklärt, wie Sie mithilfe der CLI ein Preismodell einrichten können.
Weitere Installationsoptionen finden Sie unter [Mit der Stripe-CLI loslegen](https://docs.stripe.com/stripe-cli.md).
## Preismodell erstellen [Stripe-CLI oder Dashboard]

[Wiederkehrende Preismodelle](https://docs.stripe.com/products-prices/pricing-models.md) umfassen die Produkte und Dienstleistungen, die Sie anbieten, die Preise dafür, welche Währungen Sie für Zahlungen verwenden und den Leistungszeitraum (für Abos). Verwenden Sie zum Aufbau des Preismodells [Produkte](https://docs.stripe.com/api/products.md) (was Sie anbieten) und [Preise](https://docs.stripe.com/api/prices.md) (Höhe und Abrechnungsintervall).

In diesem Beispiel wird ein Pauschalpreisdienst mit zwei verschiedenen Service-Optionen verwendet: Basis und Premium. Für jede Service-Option müssen Sie ein Produkt und einen wiederkehrenden Preis erstellen. Um eine einmalige Gebühr, z.&nbsp;B. für die Einrichtung, hinzufügen möchten, erstellen Sie ein drittes Produkt mit einem einmaligen Preis.

Jedes Produkt wird in monatlichen Intervallen abgerechnet. Der Preis für das Basisprodukt beträgt 5&nbsp;USD. Der Preis für das Premiumprodukt beträgt 15 USD. Ein Beispiel mit drei Stufen finden Sie im Leitfaden zu [Pauschalpreismodellen](https://docs.stripe.com/subscriptions/pricing-models/flat-rate-pricing.md).

#### Dashboard

Gehen Sie zur Seite [Produkt hinzufügen](https://dashboard.stripe.com/test/products/create) und erstellen Sie zwei Produkte. Fügen Sie für jedes Produkt einen Preis hinzu, jeweils mit einem monatlich wiederkehrenden Abrechnungszeitraum:

- Premium-Produkt: Premium-Dienstleistung mit zusätzlichen Funktionen

  - Preis: Pauschalpreis&nbsp;|&nbsp;15 USD

- Basic-Produkt: Basic-Dienstleistung mit minimalem Funktionsumfang

  - Preis: Pauschalpreis&nbsp;|&nbsp;5 USD

Zeichnen Sie nach Erstellung der Preise die Preis-IDs auf, sodass diese in anderen Schritten verwendet werden können. Preis-IDs sehen in etwa wie folgt aus: `price_G0FvDp6vZvdwRZ`.

Wenn Sie bereit sind, verwenden Sie die Schaltfläche **In Live-Modus kopieren** oben rechts auf der Seite, um Ihr Produkt aus der [Sandbox in den Live-Modus zu kopieren](https://docs.stripe.com/keys.md#test-live-modes).

#### API

Sie können die API zum Erstellen der [Produkte](https://docs.stripe.com/api/products.md) und [Preise](https://docs.stripe.com/api/prices.md) verwenden.

Premiumprodukt erstellen:

```curl
curl https://api.stripe.com/v1/products \
  -u "<<YOUR_SECRET_KEY>>:" \
  --data-urlencode "name=Billing Guide: Premium Service" \
  -d "description=Premium service with extra features"
```

Basisprodukt erstellen:

```curl
curl https://api.stripe.com/v1/products \
  -u "<<YOUR_SECRET_KEY>>:" \
  --data-urlencode "name=Billing Guide: Basic Service" \
  -d "description=Basic service with minimum features"
```

Zeichnen Sie Preis-ID für jedes Produkt auf. Die Preis-IDs sehen in etwa wie folgt aus:

```json
{
  "id": "prod_H94k5odtwJXMtQ",
  "object": "product",
  "active": true,
  "attributes": [

  ],
  "created": 1587577341,
  "description": "Premium service with extra features",
  "images": [

  ],
  "livemode": false,
  "metadata": {
  },
  "name": "Billing Guide: Premium Service",
  "statement_descriptor": null,
  "type": "service",
  "unit_label": null,
  "updated": 1587577341
}
```

Verwenden Sie die Produkt-IDs, um einen Preis für jedes Produkt zu erstellen. Die Zahl [unit_amount](https://docs.stripe.com/api/prices/object.md#price_object-unit_amount) wird in Cent angegeben, also z.&nbsp;B.`1500` = 15 USD.

Premiumpreis erstellen:

```curl
curl https://api.stripe.com/v1/prices \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d product={{PREMIUM_PRODUCT_ID}} \
  -d unit_amount=1500 \
  -d currency=usd \
  -d "recurring[interval]=month"
```

Basispreis erstellen:

```curl
curl https://api.stripe.com/v1/prices \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d product={{BASIC_PRODUCT_ID}} \
  -d unit_amount=500 \
  -d currency=usd \
  -d "recurring[interval]=month"
```

Zeichnen Sie Preis-ID für jeden Preis auf, sodass diese in nachfolgenden Schritten verwendet werden können. Die Preis-IDs sehen in etwa wie folgt aus:

```json
{
  "id": "price_HGd7M3DV3IMXkC",
  "object": "price",
  "product": "prod_HGd6W1VUqqXGvr",
  "type": "recurring",
  "currency": "usd",
  "recurring": {
    "interval": "month",
    "interval_count": 1,
    "trial_period_days": null,
    "usage_type": "licensed"
  },
  "active": true,
  "billing_scheme": "per_unit",
  "created": 1589319695,
  "livemode": false,
  "lookup_key": null,
  "metadata": {},
  "nickname": null,
  "unit_amount": 1500,
  "unit_amount_decimal": "1500",
  "tiers": null,
  "tiers_mode": null,
  "transform_quantity": null
}
```

## Kundin/Kunden erstellen [Client und Server]

Stripe benötigt für jedes Abonnement einen Kunden bzw. eine Kundin. Erfassen Sie in der Nutzeroberfläche Ihrer Anwendung alle erforderlichen Informationen von Ihren Nutzerinnen und Nutzern und leiten Sie diese an das Backend weiter.

Wenn Sie Adressdaten erfassen müssen, können Sie mit dem Address Element Versand- und Rechnungsadressen Ihrer Kundinnen/Kunden erfassen. Weitere Informationen zu dem Thema finden Sie auf der Seite [Address Element](https://docs.stripe.com/elements/address-element.md).

```swift
struct RegisterView: View {
    @State var email = ""
    var body: some View {
        VStack {
            TextField(text: $email) {
                Text("Email")
            }
            Button {
                Task {
                    var request = URLRequest(url: URL(string: "http://localhost:4242/create-customer")!)
                    request.httpMethod = "POST"
                    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
                    request.httpBody = try! JSONEncoder().encode(["email": email])
                    let (data, _) = try! await URLSession.shared.data(for: request)
                    let responseJSON = try! JSONSerialization.jsonObject(with: data) as! [String: Any]
                    // Return the customer ID here
                    print(responseJSON["customer"])
                }
            } label: {
                Text("Submit")
            }
        }
    }
}
```

Erstellen Sie das Stripe Customer-Objekt auf dem Server.

> #### Verwenden Sie die Accounts&nbsp;v2 API zum Darstellen von Kundinnen und Kunden
> 
> The Accounts v2 API is generally available for Connect users, and in public preview for other Stripe users. If you’re part of the Accounts v2 preview, you need to specify a [specify a preview version](https://docs.stripe.com/api-v2-overview.md#sdk-and-api-versioning) in your code.
> 
> To request access to the Accounts v2 preview, 
> 
> Für die meisten Anwendungsfälle empfehlen wir, [Ihre Kundinnen und Kunden als vom Kunden bzw. von der Kundin konfigurierte Account-Objekte abzubilden](https://docs.stripe.com/connect/use-accounts-as-customers.md), anstatt das [Kundenobjekt](https://docs.stripe.com/api/customers.md) zu verwenden.

#### Accounts&nbsp;v2

```curl
curl -X POST https://api.stripe.com/v2/core/accounts \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-03-25.preview" \
  --json '{
    "contact_email": "jenny.rosen@example.com",
    "display_name": "Jenny Rosen",
    "identity": {
        "individual": {
            "given_name": "Jenny Rosen",
            "address": {
                "city": "San Francisco",
                "country": "US",
                "line1": "123 Main Street",
                "postal_code": "94605",
                "state": "CA"
            }
        }
    },
    "configuration": {
        "customer": {
            "capabilities": {
                "automatic_indirect_tax": {
                    "requested": true
                }
            },
            "shipping": {
                "address": {
                    "city": "San Francisco",
                    "country": "US",
                    "line1": "123 Main Street",
                    "postal_code": "94605",
                    "state": "CA"
                }
            }
        }
    },
    "include": [
        "configuration.customer",
        "identity"
    ]
  }'
```

#### Customers&nbsp;v1

```curl
curl https://api.stripe.com/v1/customers \
  -u "<<YOUR_SECRET_KEY>>:" \
  --data-urlencode "email=jenny.rosen@example.com" \
  -d "name=Jenny Rosen" \
  -d "shipping[address][city]=San Francisco" \
  -d "shipping[address][country]=US" \
  -d "shipping[address][line1]=123 Main Street" \
  -d "shipping[address][postal_code]=9460" \
  -d "shipping[address][state]=CA" \
  -d "shipping[name]=Jenny Rosen" \
  -d "address[city]=San Francisco" \
  -d "address[country]=US" \
  -d "address[line1]=123 Main Street" \
  -d "address[postal_code]=9460" \
  -d "address[state]=CA"
```

## Abonnement erstellen [Client und Server]

> Wie Sie das Payment Element rendern, ohne vorab ein Abonnement zu erstellen, finden Sie weitere Informationen unter [Zahlungsdaten vor dem Erstellen eines Intent erfassen](https://docs.stripe.com/payments/accept-a-payment-deferred.md?type=subscription).

Lassen Sie neuen Kundinnen und Kunden einen Plan auswählen und dann ein Abonnement erstellen. In diesem Leitfaden stehen einen Basic- und ein Premium-Plan zur Auswahl.

Übergeben Sie in Ihrer App die ausgewählte Preis-ID und die ID des Kundendatensatzes an das Backend.

#### Accounts&nbsp;v2

```swift
func createSubscription(priceId: String, customerAccountId: String) async -> SubscriptionsResponse {
    var request = URLRequest(url: URL(string: "http://localhost:4242/create-subscription")!)
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.httpBody = try! JSONEncoder().encode(["customerAccountId": customerAccountId, "priceId": priceId])
    let (responseData, _) = try! await URLSession.shared.data(for: request)
    // SubscriptionsResponse is a Decodable struct conforming to the expected response from your backend.
    // It should include the client_secret, as discussed below.
    let subscriptionsResponse = try! JSONDecoder().decode(SubscriptionsResponse.self, from: responseData)
    return subscriptionsResponse
}
```

#### Customers&nbsp;v1

```swift
func createSubscription(priceId: String, customerId: String) async -> SubscriptionsResponse {
    var request = URLRequest(url: URL(string: "http://localhost:4242/create-subscription")!)
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.httpBody = try! JSONEncoder().encode(["customerId": customerId, "priceId": priceId])
    let (responseData, _) = try! await URLSession.shared.data(for: request)
    // SubscriptionsResponse is a Decodable struct conforming to the expected response from your backend.
    // It should include the client_secret, as discussed below.
    let subscriptionsResponse = try! JSONDecoder().decode(SubscriptionsResponse.self, from: responseData)
    return subscriptionsResponse
}
```

Erstellen Sie im Backend mithilfe von `payment_behavior=default_incomplete` das Abonnement mit dem Status `incomplete`. Geben Sie dann das `client_secret` aus dem ersten [Payment Intent](https://docs.stripe.com/payments/payment-intents.md) des Abonnements an das Frontend zurück, um die Zahlung abzuschließen, indem Sie das [`confirmation_secret`](https://docs.stripe.com/api/invoices/object.md#invoice_object-confirmation_secret) auf der letzten Rechnung des Abonnements erweitern.

Um das [verbesserte Aboverhalten](https://docs.stripe.com/billing/subscriptions/billing-mode.md) zu aktivieren, setzen Sie `billing_mode[type]` auf `flexible`. Sie müssen die Stripe API Version [2025-06-30.basil](https://docs.stripe.com/changelog/basil.md#2025-06-30.basil) oder höher verwenden.

Legen Sie [save_default_payment_method](https://docs.stripe.com/api/subscriptions/object.md#subscription_object-payment_settings-save_default_payment_method) auf `on_subscription` fest, um die Zahlungsmethode bei erfolgreicher Zahlung als Standard für ein Abonnement zu speichern. Das Speichern einer Standardzahlungsmethode erhöht die Erfolgsquote künftiger Abonnementzahlungen.

Im folgenden Beispiel wird ein `Abonnement` erstellt und das `confirmation_secret` aus der letzten Rechnung in der Antwort erweitert. So können Sie das Geheimnis an das Frontend übergeben, um die Zahlung zu bestätigen.

#### Accounts&nbsp;v2

```curl
curl https://api.stripe.com/v1/subscriptions \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d "customer_account={{CUSTOMERACCOUNT_ID}}" \
  -d "items[0][price]={{PRICE_ID}}" \
  -d payment_behavior=default_incomplete \
  -d "payment_settings[save_default_payment_method]=on_subscription" \
  -d "billing_mode[type]=flexible" \
  -d "expand[0]=latest_invoice.confirmation_secret"
```

#### Customers&nbsp;v1

```curl
curl https://api.stripe.com/v1/subscriptions \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d "customer={{CUSTOMER_ID}}" \
  -d "items[0][price]={{PRICE_ID}}" \
  -d payment_behavior=default_incomplete \
  -d "payment_settings[save_default_payment_method]=on_subscription" \
  -d "billing_mode[type]=flexible" \
  -d "expand[0]=latest_invoice.confirmation_secret"
```

> Wenn Sie einen *Preis mit mehreren Währungen* (A single Price object can support multiple currencies. Each purchase uses one of the supported currencies for the Price, depending on how you use the Price in your integration) verwenden, verwenden Sie den Parameter [currency](https://docs.stripe.com/api/subscriptions/create.md#create_subscription-currency), um das Abonnement darüber zu informieren, welche Währung des Preises verwendet werden soll. (Wenn Sie den Parameter `currency` weglassen, wird für das Abonnement die Standardwährung des Preises verwendet.)

Das Abonnement ist derzeit `inaktiv` und wartet auf die Zahlung. Die folgende Beispielantwort zeigt die mindestens zu speichernden Felder, jedoch können Sie alle Felder speichern, auf die Ihre Anwendung häufig zugreift.

#### Accounts&nbsp;v2

```json
{"id": "sub_JgRjFjhKbtD2qz",
  "object": "subscription",
  "application_fee_percent": null,
  "automatic_tax": {
    "disabled_reason": null,
    "enabled": false,
    "liability": "null"
  },
  "billing_cycle_anchor": 1623873347,
  "billing_cycle_anchor_config": null,
  "cancel_at": null,
  "cancel_at_period_end": false,
  "canceled_at": null,
  "cancellation_details": {
    "comment": null,
    "feedback": null,
    "reason": null
  },
  "collection_method": "charge_automatically",
  "created": 1623873347,
  "currency": "usd","customer_account": identifier("customerAccount"),
  "days_until_due": null,
  "default_payment_method": null,
  "default_source": null,
  "default_tax_rates": [

  ],
  "discounts": [],
  "ended_at": null,
  "invoice_customer_balance_settings": {
    "account_tax_ids": null,
    "issuer": {
      "type": "self"
    }
  },
  "items": {
    "object": "list",
    "data": [
      {
        "id": "si_JgRjmS4Ur1khEx",
        "object": "subscription_item",
        "created": 1623873347,"current_period_end": 1626465347,
        "current_period_start": 1623873347,
        "discounts": [],
        "metadata": {
        },
        "plan": {
          "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
          "object": "plan",
          "active": true,
          "amount": 2000,
          "amount_decimal": "2000",
          "billing_scheme": "per_unit",
          "created": 1623864151,
          "currency": "usd",
          "interval": "month",
          "interval_count": 1,
          "livemode": false,
          "metadata": {
          },
          "nickname": null,
          "product": "prod_JgPF5xnq7qBun3",
          "tiers": null,
          "tiers_mode": null,
          "transform_usage": null,
          "trial_period_days": null,
          "usage_type": "licensed"
        },
        "price": {
          "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
          "object": "price",
          "active": true,
          "billing_scheme": "per_unit",
          "created": 1623864151,
          "currency": "usd",
          "livemode": false,
          "lookup_key": null,
          "metadata": {
          },
          "nickname": null,
          "product": "prod_JgPF5xnq7qBun3",
          "recurring": {
            "interval": "month",
            "interval_count": 1,
            "trial_period_days": null,
            "usage_type": "licensed"
          },
          "tiers_mode": null,
          "transform_quantity": null,
          "type": "recurring",
          "unit_amount": 2000,
          "unit_amount_decimal": "2000"
        },
        "quantity": 1,
        "subscription": "sub_JgRjFjhKbtD2qz",
        "tax_rates": [

        ]
      }
    ],
    "has_more": false,
    "total_count": 1,
    "url": "/v1/subscription_items?subscription=sub_JgRjFjhKbtD2qz"
  },
  "latest_invoice": {
    "id": "in_1J34pzGPZ1iASj5zB87qdBNZ",
    "object": "invoice",
    "account_country": "US",
    "account_name": "Angelina's Store",
    "account_tax_ids": null,
    "amount_due": 2000,
    "amount_overpaid": 0,
    "amount_paid": 0,
    "amount_remaining": 2000,
    "amount_shipping": 0,
    "attempt_count": 0,
    "attempted": false,
    "auto_advance": false,
    "automatic_tax": {
      "disabled_reason": null,
      "enabled": false,
      "liability": null,
      "status": null
    },
    "automatically_finalizes_at": null,
    "billing_reason": "subscription_update",
    "collection_method": "charge_automatically",
    "created": 1623873347,
    "currency": "usd",
    "custom_fields": null,
    "customer_account": identifier("customerAccount"),
    "customer_address": null,
    "customer_email": "angelina@stripe.com",
    "customer_name": null,
    "customer_phone": null,
    "customer_shipping": {
      "address": {
        "city": "",
        "country": "US",
        "line1": "Berry",
        "line2": "",
        "postal_code": "",
        "state": ""
      },
      "name": "",
      "phone": null
    },
    "customer_tax_exempt": "none",
    "customer_tax_ids": [

    ],
    "default_payment_method": null,
    "default_source": null,
    "default_tax_rates": [

    ],
    "description": null,
    "discounts": [],
    "due_date": null,
    "effective_at": "1623873347",
    "ending_balance": 0,
    "footer": null,
    "from_invoice": null,
    "hosted_invoice_url": "https://invoice.stripe.com/i/acct_1By64KGPZ1iASj5z/invst_JgRjzIOILGeq2MKC9T0KtyXnD5udsLp",
    "invoice_pdf": "https://pay.stripe.com/invoice/acct_1By64KGPZ1iASj5z/invst_JgRjzIOILGeq2MKC9T0KtyXnD5udsLp/pdf",
    "last_finalization_error": null,
    "latest_revision": null,
    "lines": {
      "object": "list",
      "data": [
        {
          "id": "il_1N2CjMBwKQ696a5NeOawRQP2",
          "object": "line_item",
          "amount": 2000,
          "currency": "usd",
          "description": "1 × Gold Special (at $20.00 / month)",
          "discount_amounts": [

          ],
          "discountable": true,
          "discounts": [

          ],
          "invoice": "in_1J34pzGPZ1iASj5zB87qdBNZ",
          "livemode": false,
          "metadata": {
          },
          "parent": {
            "invoice_item_details": null,
            "subscription_item_details":
            {
              "invoice_item": null,
            "proration": false,
            "proration_details":
            {
              "credited_items": null
            },
            "subscription":
            "sub_JgRjFjhKbtD2qz",
            "subscription_item":
              "si_JgRjmS4Ur1khEx"
            },
            "type": "subscription_item_details"
          },
          "period": {
            "end": 1626465347,
            "start": 1623873347
          },
          "plan": {
            "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
            "object": "plan",
            "active": true,
            "amount": 2000,
            "amount_decimal": "2000",
            "billing_scheme": "per_unit",
            "created": 1623864151,
            "currency": "usd",
            "interval": "month",
            "interval_count": 1,
            "livemode": false,
            "metadata": {
            },
            "nickname": null,
            "product": "prod_JgPF5xnq7qBun3",
            "tiers": null,
            "tiers_mode": null,
            "transform_usage": null,
            "trial_period_days": null,
            "usage_type": "licensed"
          },
          "price": {
            "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
            "object": "price",
            "active": true,
            "billing_scheme": "per_unit",
            "created": 1623864151,
            "currency": "usd",
            "livemode": false,
            "lookup_key": null,
            "metadata": {
            },
            "nickname": null,
            "product": "prod_JgPF5xnq7qBun3",
            "recurring": {
              "interval": "month",
              "interval_count": 1,
              "trial_period_days": null,
              "usage_type": "licensed"
            },
            "tiers_mode": null,
            "transform_quantity": null,
            "type": "recurring",
            "unit_amount": 2000,
            "unit_amount_decimal": "2000"
          },
          "quantity": 1,
          "taxes": []
        }
      ],
      "has_more": false,
      "total_count": 1,
      "url": "/v1/invoices/in_1J34pzGPZ1iASj5zB87qdBNZ/lines"
    },
    "livemode": false,
    "metadata": {
    },
    "next_payment_attempt": null,
    "number": "C008FC2-0354",
    "on_behalf_of": null,
    "parent": {
      "quote_details": null,
      "subscription_details": {
        "metadata": {},
        "pause_collection": null,
        "subscription": "sub_JgRjFjhKbtD2qz"
      }
    },
    "payment_intent": {
      "id": "pi_1J34pzGPZ1iASj5zI2nOAaE6",
      "object": "payment_intent",
      "allowed_source_types": [
        "card"
      ],
      "amount": 2000,
      "amount_capturable": 0,
      "amount_received": 0,
      "application": null,
      "application_fee_amount": null,
      "canceled_at": null,
      "cancellation_reason": null,
      "capture_method": "automatic",
      "charges": {
        "object": "list",
        "data": [

        ],
        "has_more": false,
        "total_count": 0,
        "url": "/v1/charges?payment_intent=pi_1J34pzGPZ1iASj5zI2nOAaE6"
      },
      "client_secret": "pi_1J34pzGPZ1iASj5zI2nOAaE6_secret_l7FN6ldFfXiFmJEumenJ2y2wu",
      "confirmation_method": "automatic",
      "created": 1623873347,
      "currency": "usd",
      "customer": "cus_CMqDWO2xODTZqt",
      "description": "Subscription creation",
      "invoice": "in_1J34pzGPZ1iASj5zB87qdBNZ",
      "last_payment_error": null,
      "livemode": false,
      "metadata": {
      },
      "next_action": null,
      "next_source_action": null,
      "on_behalf_of": null,
      "payment_method": null,
      "payment_method_options": {
        "card": {
          "installments": null,
          "network": null,
          "request_three_d_secure": "automatic"
        }
      },
      "payment_method_types": [
        "card"
      ],
      "receipt_email": null,
      "review": null,
      "setup_future_usage": "off_session",
      "shipping": null,
      "source": "card_1By6iQGPZ1iASj5z7ijKBnXJ",
      "statement_descriptor": null,
      "statement_descriptor_suffix": null,
      "status": "requires_confirmation",
      "transfer_data": null,
      "transfer_group": null
    },
    "payment_settings": {
      "payment_method_options": null,
      "payment_method_types": null,
      "save_default_payment_method": "on_subscription"
    },
    "period_end": 1623873347,
    "period_start": 1623873347,
    "post_payment_credit_notes_amount": 0,
    "pre_payment_credit_notes_amount": 0,
    "receipt_number": null,
    "starting_balance": 0,
    "statement_descriptor": null,
    "status": "open",
    "status_transitions": {
      "finalized_at": 1623873347,
      "marked_uncollectible_at": null,
      "paid_at": null,
      "voided_at": null
    },
    "subscription": "sub_JgRjFjhKbtD2qz",
    "subtotal": 2000,
    "tax": null,
    "tax_percent": null,
    "total": 2000,
    "total_discount_amounts": [],
    "total_tax_amounts": [],
    "transfer_data": null,
    "webhooks_delivered_at": 1623873347
  },
  "livemode": false,
  "metadata": {
  },
  "next_pending_invoice_item_invoice": null,
  "pause_collection": null,
  "pending_invoice_item_interval": null,
  "pending_setup_intent": null,
  "pending_update": null,
  "plan": {
    "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
    "object": "plan",
    "active": true,
    "amount": 2000,
    "amount_decimal": "2000",
    "billing_scheme": "per_unit",
    "created": 1623864151,
    "currency": "usd",
    "interval": "month",
    "interval_count": 1,
    "livemode": false,
    "metadata": {
    },
    "nickname": null,
    "product": "prod_JgPF5xnq7qBun3",
    "tiers": null,
    "tiers_mode": null,
    "transform_usage": null,
    "trial_period_days": null,
    "usage_type": "licensed"
  },
  "quantity": 1,
  "schedule": null,
  "start": 1623873347,
  "start_date": 1623873347,
  "status": "incomplete",
  "tax_percent": null,
  "transfer_data": null,
  "trial_end": null,
  "trial_start": null
}
```

#### Customers&nbsp;v1

```json
{"id": "sub_JgRjFjhKbtD2qz",
  "object": "subscription",
  "application_fee_percent": null,
  "automatic_tax": {
    "disabled_reason": null,
    "enabled": false,
    "liability": "null"
  },
  "billing_cycle_anchor": 1623873347,
  "billing_cycle_anchor_config": null,
  "cancel_at": null,
  "cancel_at_period_end": false,
  "canceled_at": null,
  "cancellation_details": {
    "comment": null,
    "feedback": null,
    "reason": null
  },
  "collection_method": "charge_automatically",
  "created": 1623873347,
  "currency": "usd","customer": identifier("customer"),
  "days_until_due": null,
  "default_payment_method": null,
  "default_source": null,
  "default_tax_rates": [

  ],
  "discounts": [],
  "ended_at": null,
  "invoice_customer_balance_settings": {
    "account_tax_ids": null,
    "issuer": {
      "type": "self"
    }
  },
  "items": {
    "object": "list",
    "data": [
      {
        "id": "si_JgRjmS4Ur1khEx",
        "object": "subscription_item",
        "created": 1623873347,"current_period_end": 1626465347,
        "current_period_start": 1623873347,
        "discounts": [],
        "metadata": {
        },
        "plan": {
          "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
          "object": "plan",
          "active": true,
          "amount": 2000,
          "amount_decimal": "2000",
          "billing_scheme": "per_unit",
          "created": 1623864151,
          "currency": "usd",
          "interval": "month",
          "interval_count": 1,
          "livemode": false,
          "metadata": {
          },
          "nickname": null,
          "product": "prod_JgPF5xnq7qBun3",
          "tiers": null,
          "tiers_mode": null,
          "transform_usage": null,
          "trial_period_days": null,
          "usage_type": "licensed"
        },
        "price": {
          "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
          "object": "price",
          "active": true,
          "billing_scheme": "per_unit",
          "created": 1623864151,
          "currency": "usd",
          "livemode": false,
          "lookup_key": null,
          "metadata": {
          },
          "nickname": null,
          "product": "prod_JgPF5xnq7qBun3",
          "recurring": {
            "interval": "month",
            "interval_count": 1,
            "trial_period_days": null,
            "usage_type": "licensed"
          },
          "tiers_mode": null,
          "transform_quantity": null,
          "type": "recurring",
          "unit_amount": 2000,
          "unit_amount_decimal": "2000"
        },
        "quantity": 1,
        "subscription": "sub_JgRjFjhKbtD2qz",
        "tax_rates": [

        ]
      }
    ],
    "has_more": false,
    "total_count": 1,
    "url": "/v1/subscription_items?subscription=sub_JgRjFjhKbtD2qz"
  },
  "latest_invoice": {
    "id": "in_1J34pzGPZ1iASj5zB87qdBNZ",
    "object": "invoice",
    "account_country": "US",
    "account_name": "Angelina's Store",
    "account_tax_ids": null,
    "amount_due": 2000,
    "amount_overpaid": 0,
    "amount_paid": 0,
    "amount_remaining": 2000,
    "amount_shipping": 0,
    "attempt_count": 0,
    "attempted": false,
    "auto_advance": false,
    "automatic_tax": {
      "disabled_reason": null,
      "enabled": false,
      "liability": null,
      "status": null
    },
    "automatically_finalizes_at": null,
    "billing_reason": "subscription_update",
    "collection_method": "charge_automatically",
    "created": 1623873347,
    "currency": "usd",
    "custom_fields": null,
    "customer": identifier("customer"),
    "customer_address": null,
    "customer_email": "angelina@stripe.com",
    "customer_name": null,
    "customer_phone": null,
    "customer_shipping": {
      "address": {
        "city": "",
        "country": "US",
        "line1": "Berry",
        "line2": "",
        "postal_code": "",
        "state": ""
      },
      "name": "",
      "phone": null
    },
    "customer_tax_exempt": "none",
    "customer_tax_ids": [

    ],
    "default_payment_method": null,
    "default_source": null,
    "default_tax_rates": [

    ],
    "description": null,
    "discounts": [],
    "due_date": null,
    "effective_at": "1623873347",
    "ending_balance": 0,
    "footer": null,
    "from_invoice": null,
    "hosted_invoice_url": "https://invoice.stripe.com/i/acct_1By64KGPZ1iASj5z/invst_JgRjzIOILGeq2MKC9T0KtyXnD5udsLp",
    "invoice_pdf": "https://pay.stripe.com/invoice/acct_1By64KGPZ1iASj5z/invst_JgRjzIOILGeq2MKC9T0KtyXnD5udsLp/pdf",
    "last_finalization_error": null,
    "latest_revision": null,
    "lines": {
      "object": "list",
      "data": [
        {
          "id": "il_1N2CjMBwKQ696a5NeOawRQP2",
          "object": "line_item",
          "amount": 2000,
          "currency": "usd",
          "description": "1 × Gold Special (at $20.00 / month)",
          "discount_amounts": [

          ],
          "discountable": true,
          "discounts": [

          ],
          "invoice": "in_1J34pzGPZ1iASj5zB87qdBNZ",
          "livemode": false,
          "metadata": {
          },
          "parent": {
            "invoice_item_details": null,
            "subscription_item_details":
            {
              "invoice_item": null,
            "proration": false,
            "proration_details":
            {
              "credited_items": null
            },
            "subscription":
            "sub_JgRjFjhKbtD2qz",
            "subscription_item":
              "si_JgRjmS4Ur1khEx"
            },
            "type": "subscription_item_details"
          },
          "period": {
            "end": 1626465347,
            "start": 1623873347
          },
          "plan": {
            "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
            "object": "plan",
            "active": true,
            "amount": 2000,
            "amount_decimal": "2000",
            "billing_scheme": "per_unit",
            "created": 1623864151,
            "currency": "usd",
            "interval": "month",
            "interval_count": 1,
            "livemode": false,
            "metadata": {
            },
            "nickname": null,
            "product": "prod_JgPF5xnq7qBun3",
            "tiers": null,
            "tiers_mode": null,
            "transform_usage": null,
            "trial_period_days": null,
            "usage_type": "licensed"
          },
          "price": {
            "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
            "object": "price",
            "active": true,
            "billing_scheme": "per_unit",
            "created": 1623864151,
            "currency": "usd",
            "livemode": false,
            "lookup_key": null,
            "metadata": {
            },
            "nickname": null,
            "product": "prod_JgPF5xnq7qBun3",
            "recurring": {
              "interval": "month",
              "interval_count": 1,
              "trial_period_days": null,
              "usage_type": "licensed"
            },
            "tiers_mode": null,
            "transform_quantity": null,
            "type": "recurring",
            "unit_amount": 2000,
            "unit_amount_decimal": "2000"
          },
          "quantity": 1,
          "taxes": []
        }
      ],
      "has_more": false,
      "total_count": 1,
      "url": "/v1/invoices/in_1J34pzGPZ1iASj5zB87qdBNZ/lines"
    },
    "livemode": false,
    "metadata": {
    },
    "next_payment_attempt": null,
    "number": "C008FC2-0354",
    "on_behalf_of": null,
    "parent": {
      "quote_details": null,
      "subscription_details": {
        "metadata": {},
        "pause_collection": null,
        "subscription": "sub_JgRjFjhKbtD2qz"
      }
    },
    "payment_intent": {
      "id": "pi_1J34pzGPZ1iASj5zI2nOAaE6",
      "object": "payment_intent",
      "allowed_source_types": [
        "card"
      ],
      "amount": 2000,
      "amount_capturable": 0,
      "amount_received": 0,
      "application": null,
      "application_fee_amount": null,
      "canceled_at": null,
      "cancellation_reason": null,
      "capture_method": "automatic",
      "charges": {
        "object": "list",
        "data": [

        ],
        "has_more": false,
        "total_count": 0,
        "url": "/v1/charges?payment_intent=pi_1J34pzGPZ1iASj5zI2nOAaE6"
      },
      "client_secret": "pi_1J34pzGPZ1iASj5zI2nOAaE6_secret_l7FN6ldFfXiFmJEumenJ2y2wu",
      "confirmation_method": "automatic",
      "created": 1623873347,
      "currency": "usd",
      "customer": "cus_CMqDWO2xODTZqt",
      "description": "Subscription creation",
      "invoice": "in_1J34pzGPZ1iASj5zB87qdBNZ",
      "last_payment_error": null,
      "livemode": false,
      "metadata": {
      },
      "next_action": null,
      "next_source_action": null,
      "on_behalf_of": null,
      "payment_method": null,
      "payment_method_options": {
        "card": {
          "installments": null,
          "network": null,
          "request_three_d_secure": "automatic"
        }
      },
      "payment_method_types": [
        "card"
      ],
      "receipt_email": null,
      "review": null,
      "setup_future_usage": "off_session",
      "shipping": null,
      "source": "card_1By6iQGPZ1iASj5z7ijKBnXJ",
      "statement_descriptor": null,
      "statement_descriptor_suffix": null,
      "status": "requires_confirmation",
      "transfer_data": null,
      "transfer_group": null
    },
    "payment_settings": {
      "payment_method_options": null,
      "payment_method_types": null,
      "save_default_payment_method": "on_subscription"
    },
    "period_end": 1623873347,
    "period_start": 1623873347,
    "post_payment_credit_notes_amount": 0,
    "pre_payment_credit_notes_amount": 0,
    "receipt_number": null,
    "starting_balance": 0,
    "statement_descriptor": null,
    "status": "open",
    "status_transitions": {
      "finalized_at": 1623873347,
      "marked_uncollectible_at": null,
      "paid_at": null,
      "voided_at": null
    },
    "subscription": "sub_JgRjFjhKbtD2qz",
    "subtotal": 2000,
    "tax": null,
    "tax_percent": null,
    "total": 2000,
    "total_discount_amounts": [],
    "total_tax_amounts": [],
    "transfer_data": null,
    "webhooks_delivered_at": 1623873347
  },
  "livemode": false,
  "metadata": {
  },
  "next_pending_invoice_item_invoice": null,
  "pause_collection": null,
  "pending_invoice_item_interval": null,
  "pending_setup_intent": null,
  "pending_update": null,
  "plan": {
    "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
    "object": "plan",
    "active": true,
    "amount": 2000,
    "amount_decimal": "2000",
    "billing_scheme": "per_unit",
    "created": 1623864151,
    "currency": "usd",
    "interval": "month",
    "interval_count": 1,
    "livemode": false,
    "metadata": {
    },
    "nickname": null,
    "product": "prod_JgPF5xnq7qBun3",
    "tiers": null,
    "tiers_mode": null,
    "transform_usage": null,
    "trial_period_days": null,
    "usage_type": "licensed"
  },
  "quantity": 1,
  "schedule": null,
  "start": 1623873347,
  "start_date": 1623873347,
  "status": "incomplete",
  "tax_percent": null,
  "transfer_data": null,
  "trial_end": null,
  "trial_start": null
}
```

### Aktualisieren Sie Ihren Server-Endpoint

Fügen Sie die Erstellung eines temporären Schlüssels zum Abonnement-Endpoint hinzu und geben Sie ihn in der Antwort zurück:

#### Accounts&nbsp;v2

#### Ruby

```ruby
ephemeral_key = Stripe::EphemeralKey.create(
  {customer_account: customer_account_id},
  {stripe_version: '2026-03-25.dahlia'}
)

{
  subscriptionId: subscription.id,
  clientSecret: subscription.latest_invoice.confirmation_secret.client_secret,
  ephemeralKey: ephemeral_key.secret,
  customerAccountId: customer_account_id,
}.to_json
```

#### Customers&nbsp;v1

#### Ruby

```ruby
ephemeral_key = client.v1.ephemeral_keys.create(
  {customer: customer_id},
  {stripe_version: '2025-06-30.basil'}
)

{
  subscriptionId: subscription.id,
  clientSecret: subscription.latest_invoice.confirmation_secret.client_secret,
  ephemeralKey: ephemeral_key.secret,
  customerId: customer_id,
}.to_json
```

### Aktualisieren Sie Ihr Antwortmodell

#### Accounts&nbsp;v2

```swift
struct SubscriptionsResponse: Decodable {
    let subscriptionId: String
    let clientSecret: String
    let ephemeralKey: String
    let customerAccountId: String
}
```

#### Customers&nbsp;v1

```swift
struct SubscriptionsResponse: Decodable {
    let subscriptionId: String
    let clientSecret: String
    let ephemeralKey: String
    let customerId: String
}
```

### Übergeben Sie die Kundenkonfiguration an PaymentSheet

#### Accounts&nbsp;v2

Fügen Sie beim Konfigurieren von PaymentSheet Folgendes hinzu:

```swift
config.customerAccount = .init(id: customerAccountId, ephemeralKeySecret: ephemeralKey)
```

#### Customers&nbsp;v1

Fügen Sie beim Konfigurieren von PaymentSheet Folgendes hinzu:

```swift
config.customer = .init(id: customerId, ephemeralKeySecret: ephemeralKey)
```

## Zahlungsinformationen erfassen [Client]

Verwenden Sie das [Payment Sheet](https://docs.stripe.com/payments/mobile/payment-sheet.md) zum Erfassen von Zahlungsdetails und Aktivieren des Abos. Sie können Elements an das Erscheinungsbild Ihrer Anmeldung anpassen.

Mit dem Payment Sheet können Sie alle notwendigen Zahlungsdetails für eine Vielzahl von Zahlungsmethoden sicher erheben. Erfahren Sie mehr über die [unterstützten Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/payment-method-support.md#product-support) für Payment Sheet und Subscriptions.

### Payment Element zu Ihrer App hinzufügen

> Dieser Schritt zeigt eine Möglichkeit zu starten. Sie können jedoch jede [In-App-Zahlungsintegration](https://docs.stripe.com/payments/mobile.md) verwenden.

Initialisieren und präsentieren Sie das Mobile Payment Element mit der PaymentSheet-Klasse.

```swift
struct SubscribeView: View {
    let paymentSheet: PaymentSheet
    @State var isPaymentSheetPresented = false
    init(clientSecret: String) {
        var config = PaymentSheet.Configuration()
        // Set `allowsDelayedPaymentMethods` to true if your business handles
        // delayed notification payment methods like US bank accounts.
        config.allowsDelayedPaymentMethods = true
        config.primaryButtonLabel = "Subscribe for $15/month"
        self.paymentSheet = PaymentSheet(paymentIntentClientSecret: clientSecret, configuration: config)
    }
    var body: some View {
        Button {
            isPaymentSheetPresented = true
        } label: {
            Text("Subscribe")
        }.paymentSheet(isPresented: $isPaymentSheetPresented, paymentSheet: paymentSheet) { result in
            switch result {
            case .completed:
                // Handle completion
            case .canceled:
                break
            case .failed(let error):
                // Handle error
            }
        }
    }
}
```

Das Mobile Payment Element stellt ein Formular dar, mit dem Ihre Kundinnen und Kunden eine Zahlungsmethode auswählen können. Das Formular erfasst automatisch alle notwendigen Zahlungsdetails für die ausgewählte Zahlungsmethode.

Wenn Sie `allowsDelayedPaymentMethods` auf true festlegen, werden Zahlungsmethoden mit [verzögerter Benachrichtigung](https://docs.stripe.com/payments/payment-methods.md#payment-notification) wie US-Bankkonten zugelassen. Für diese Zahlungsmethoden ist der endgültige Zahlungsstatus nicht bekannt, wenn das `PaymentSheet` abgeschlossen wird. Stattdessen ist sie erfolgreich oder schlägt fehl. Wenn Sie diese Art von Zahlungsmethoden unterstützen, informieren Sie den Kunden/die Kundin darüber, dass seine/ihre Bestellung bestätigt ist, und führen seine/ihre Bestellung erst aus (z. B. das Produkt versenden), wenn die Zahlung erfolgreich ist.

Sie können das Payment Element an das Design Ihrer App anpassen, indem Sie die Eigenschaft [`Erscheinungsbild` ](https://docs.stripe.com/elements/appearance-api/mobile.md?platform=ios) auf Ihr `PaymentSheet.Configuration`-Objekt anwenden.

### Zahlung bestätigen

Das Mobile Payment Element erstellt eine PaymentMethod und bestätigt den ersten PaymentIntent des unvollständigen Abonnements, wodurch eine Zahlung ausgeführt wird. Wenn die Zahlung die *starke Kundenauthentifizierung* (Strong Customer Authentication (SCA) is a regulatory requirement in effect as of September 14, 2019, that impacts many European online payments. It requires customers to use two-factor authentication like 3D Secure to verify their purchase) (SCA) erfordert, übernimmt das Payment Element den Authentifizierungsprozess, bevor der PaymentIntent bestätigt wird.

## Rückgabe-URL einrichten [Clientseitig]

Der Kunde/Die Kundin verlässt ggf. Ihre App, um sich zu authentifizieren (z.&nbsp;B. in Safari oder einer Banking-App). Damit sie nach der Authentifizierung automatisch zu Ihrer App zurückkehren können, [konfigurieren Sie ein benutzerdefiniertes URL-Schema](https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app) und richten Sie Ihren App-Delegate so ein, dass die URL an das SDK weitergeleitet wird. Stripe unterstützt keine [universellen Links](https://developer.apple.com/documentation/xcode/allowing-apps-and-websites-to-link-to-your-content).

#### SceneDelegate

#### Swift

```swift
// This method handles opening custom URL schemes (for example, "your-app://stripe-redirect")
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    guard let url = URLContexts.first?.url else {
        return
    }
    let stripeHandled = StripeAPI.handleURLCallback(with: url)
    if (!stripeHandled) {
        // This was not a Stripe url – handle the URL normally as you would
    }
}

```

#### AppDelegate

#### Swift

```swift
// This method handles opening custom URL schemes (for example, "your-app://stripe-redirect")
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
    let stripeHandled = StripeAPI.handleURLCallback(with: url)
    if (stripeHandled) {
        return true
    } else {
        // This was not a Stripe url – handle the URL normally as you would
    }
    return false
}
```

#### SwiftUI

#### Swift

```swift

@main
struct MyApp: App {
  var body: some Scene {
    WindowGroup {
      Text("Hello, world!").onOpenURL { incomingURL in
          let stripeHandled = StripeAPI.handleURLCallback(with: incomingURL)
          if (!stripeHandled) {
            // This was not a Stripe url – handle the URL normally as you would
          }
        }
    }
  }
}
```

Legen Sie zusätzlich die [returnURL](https://stripe.dev/stripe-ios/stripe-paymentsheet/Classes/PaymentSheet/Configuration.html#/s:6Stripe12PaymentSheetC13ConfigurationV9returnURLSSSgvp) in Ihrem [PaymentSheet.Configuration](https://stripe.dev/stripe-ios/stripe-paymentsheet/Classes/PaymentSheet/Configuration.html)-Objekt auf die URL für Ihre App fest.

```swift
var configuration = PaymentSheet.Configuration()
configuration.returnURL = "your-app://stripe-redirect"
```

## Optional: Apple Pay aktivieren

### Für eine Apple-Händler-ID registrieren

Beantragen Sie eine Apple-Händler-ID, indem Sie sich auf der Apple Developer-Website [für eine neue Kennung registrieren](https://developer.apple.com/account/resources/identifiers/add/merchant).

Tragen Sie eine Beschreibung und eine Kennung in das Formular ein. Die Beschreibung ist nur für Ihre internen Zwecke bestimmt und kann später geändert werden. Stripe empfiehlt, dass Sie den Namen Ihrer App als Kennung verwenden, zum Beispiel `merchant.com.{{YOUR_APP_NAME}}`.

### Neues Apple Pay-Zertifikat erstellen

Erstellen Sie ein Zertifikat für Ihre App, um Zahlungsdaten zu verschlüsseln.

Gehen Sie zu den [iOS-Zertifikateinstellungen](https://dashboard.stripe.com/settings/ios_certificates) im Dashboard, klicken Sie auf **Neue Anwendung hinzufügen** und befolgen Sie die Anleitung.

Laden Sie eine Certificate Signing Request (CSR)-Datei herunter, um ein sicheres Zertifikat von Apple zu erhalten, mit dem Sie Apple Pay verwenden können.

Eine CSR-Datei muss verwendet werden, um genau ein Zertifikat auszustellen. Wenn Sie Ihre Apple-Händler-ID wechseln, müssen Sie zu den [iOS-Zertifikateinstellungen](https://dashboard.stripe.com/settings/ios_certificates) im Dashboard gehen, um eine neue CSR und ein Zertifikat zu erhalten.

### Mit Xcode integrieren

Fügen Sie Ihrer App die **Apple Pay**-Funktion hinzu. Öffnen Sie in Xcode Ihre Projekteinstellungen, klicken Sie auf die Registerkarte **Signing & Capabilities** (Anmeldung und Funktionen) und fügen Sie die **Apple Pay**-Funktion hinzu. Möglicherweise werden Sie an dieser Stelle aufgefordert, sich bei Ihrem Entwicklerkonto anzumelden. Wählen Sie die zuvor erstellte Händler-ID aus. Ihre App sollte nun Apple Pay unterstützen.
![](https://b.stripecdn.com/docs-statics-srv/assets/xcode.a701d4c1922d19985e9c614a6f105bf1.png)

Apple Pay-Funktion in Xcode aktivieren

### Apple Pay hinzufügen

#### Wiederkehrende Zahlungen

Um Apple Pay zum PaymentSheet hinzuzufügen, setzen Sie [applePay](https://stripe.dev/stripe-ios/stripe-paymentsheet/Classes/PaymentSheet/Configuration.html#/s:6Stripe12PaymentSheetC13ConfigurationV8applePayAC05ApplefD0VSgvp), nachdem Sie `PaymentSheet.Configuration` mit Ihrer Apple-Händler-ID und dem [Ländercode Ihres Unternehmens](https://dashboard.stripe.com/settings/account) initialisiert haben.

Gemäß den [Apple-Richtlinien](https://developer.apple.com/design/human-interface-guidelines/apple-pay#Supporting-subscriptions) für wiederkehrende Zahlungen müssen Sie auch zusätzliche Attribute für `PKPaymentRequest` festlegen. Fügen Sie in [ApplePayConfiguration.paymentRequestHandlers](https://stripe.dev/stripe-ios/stripepaymentsheet/documentation/stripepaymentsheet/paymentsheet/applepayconfiguration/handlers/paymentrequesthandler) einen Handler hinzu, um die [PKPaymentRequest.paymentSummaryItems](https://developer.apple.com/documentation/passkit/pkpaymentrequest/1619231-paymentsummaryitems) mit dem Betrag zu konfigurieren, den Sie berechnen möchten (z. B. 9,95&nbsp;USD pro Monat).

Sie können auch [Händler-Token](https://developer.apple.com/apple-pay/merchant-tokens/) übernehmen, indem Sie die Eigenschaften `recurringPaymentRequest` oder `automaticReloadPaymentRequest` für `PKPaymentRequest` festlegen.

Weitere Informationen zur Verwendung wiederkehrender Zahlungen mit Apple Pay finden Sie in der [PassKit-Dokumentation von Apple](https://developer.apple.com/documentation/passkit/pkpaymentrequest).

#### iOS (Swift)

```swift
let customHandlers = PaymentSheet.ApplePayConfiguration.Handlers(
    paymentRequestHandler: { request in
        // PKRecurringPaymentSummaryItem is available on iOS 15 or later
        if #available(iOS 15.0, *) {
            let billing = PKRecurringPaymentSummaryItem(label: "My Subscription", amount: NSDecimalNumber(string: "59.99"))

            // Payment starts today
            billing.startDate = Date()

            // Payment ends in one year
            billing.endDate = Date().addingTimeInterval(60 * 60 * 24 * 365)

            // Pay once a month.
            billing.intervalUnit = .month
            billing.intervalCount = 1

            // recurringPaymentRequest is only available on iOS 16 or later
            if #available(iOS 16.0, *) {
                request.recurringPaymentRequest = PKRecurringPaymentRequest(paymentDescription: "Recurring",
                                                                            regularBilling: billing,
                                                                            managementURL: URL(string: "https://my-backend.example.com/customer-portal")!)
                request.recurringPaymentRequest?.billingAgreement = "You'll be billed $59.99 every month for the next 12 months. To cancel at any time, go to Account and click 'Cancel Membership.'"
            }
            request.paymentSummaryItems = [billing]
            request.currencyCode = "USD"
        } else {
            // On older iOS versions, set alternative summary items.
            request.paymentSummaryItems = [PKPaymentSummaryItem(label: "Monthly plan starting July 1, 2022", amount: NSDecimalNumber(string: "59.99"), type: .final)]
        }
        return request
    }
)
var configuration = PaymentSheet.Configuration()
configuration.applePay = .init(merchantId: "merchant.com.your_app_name",
                                merchantCountryCode: "US",
                                customHandlers: customHandlers)
```

### Bestellverfolgung

Um Informationen zur [Bestellverfolgung](https://developer.apple.com/design/human-interface-guidelines/technologies/wallet/designing-order-tracking) in iOS&nbsp;16 oder höher hinzuzufügen, konfigurieren Sie einen [authorizationResultHandler](https://stripe.dev/stripe-ios/stripepaymentsheet/documentation/stripepaymentsheet/paymentsheet/applepayconfiguration/handlers/authorizationresulthandler) in Ihren `PaymentSheet.ApplePayConfiguration.Handlers`. Stripe ruft Ihre Implementierung auf, nachdem die Zahlung durchgeführt wurde, aber bevor iOS das Apple Pay-Formular schließt.

Rufen Sie in Ihrer Implementierung von `authorizationResultHandler` die Bestelldetails für die abgeschlossene Bestellung von Ihrem Server ab. Fügen Sie die Details dem bereitgestellten [PKPaymentAuthorizationResult](https://developer.apple.com/documentation/passkit/pkpaymentauthorizationresult) hinzu und geben Sie das geänderte Ergebnis zurück.

Weitere Informationen zur Bestellverfolgung finden Sie in der [Dokumentation zu Wallet-Bestellungen von Apple](https://developer.apple.com/documentation/walletorders).

#### iOS (Swift)

```swift
let customHandlers = PaymentSheet.ApplePayConfiguration.Handlers(
    authorizationResultHandler: { result in
      do {
        // Fetch the order details from your service
        let myOrderDetails = try await MyAPIClient.shared.fetchOrderDetails(orderID: orderID)
        result.orderDetails = PKPaymentOrderDetails(
          orderTypeIdentifier: myOrderDetails.orderTypeIdentifier, // "com.myapp.order"
          orderIdentifier: myOrderDetails.orderIdentifier, // "ABC123-AAAA-1111"
          webServiceURL: myOrderDetails.webServiceURL, // "https://my-backend.example.com/apple-order-tracking-backend"
          authenticationToken: myOrderDetails.authenticationToken) // "abc123"
        // Return your modified PKPaymentAuthorizationResult
        return result
      } catch {
        return PKPaymentAuthorizationResult(status: .failure, errors: [error])
      }
    }
)
var configuration = PaymentSheet.Configuration()
configuration.applePay = .init(merchantId: "merchant.com.your_app_name",
                               merchantCountryCode: "US",
                               customHandlers: customHandlers)
```

## Webhooks überwachen [Server]

Um Ihre Integration abzuschließen, müssen Sie von Stripe gesendete *Webhooks* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) verarbeiten. Dies sind Ereignisse, die ausgelöst werden, wenn sich ein Status innerhalb von Stripe ändert, z.&nbsp;B. wenn Abonnements neue Rechnungen erstellen. Richten Sie in Ihrer Anwendung einen HTTP-Handler ein, um eine POST-Anfrage mit dem Webhook-Ereignis zu akzeptieren und verifizieren Sie die Signatur des Ereignisses.

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/webhook' do
  # You can use webhooks to receive information about asynchronous payment events.
  # For more about our webhook events check out https://stripe.com/docs/webhooks.
  webhook_secret = ENV['STRIPE_WEBHOOK_SECRET']
  payload = request.body.read
  if !webhook_secret.empty?
    # Retrieve the event by verifying the signature using the raw body and secret if webhook signing is configured.
    sig_header = request.env['HTTP_STRIPE_SIGNATURE']
    event = nil

    begin
      event = Stripe::Webhook.construct_event(
        payload, sig_header, webhook_secret
      )
    rescue JSON::ParserError => e
      # Invalid payload
      status 400
      return
    rescue Stripe::SignatureVerificationError => e
      # Invalid signature
      puts '⚠️  Webhook signature verification failed.'
      status 400
      return
    end
  else
    data = JSON.parse(payload, symbolize_names: true)
    event = Stripe::Event.construct_from(data)
  end
  # Get the type of webhook event sent - used to check the status of PaymentIntents.
  event_type = event['type']
  data = event['data']
  data_object = data['object']

  if event_type == 'invoice.paid'
    # Used to provision services after the trial has ended.
    # The status of the invoice will show up as paid. Store the status in your
    # database to reference when a user accesses your service to avoid hitting rate
    # limits.
    # puts data_object
  end

  if event_type == 'invoice.payment_failed'
    # If the payment fails or the customer does not have a valid payment method,
    # an invoice.payment_failed event is sent, the subscription becomes past_due.
    # Use this webhook to notify your user that their payment has
    # failed and to retrieve new card details.
    # puts data_object
  end

  if event_type == 'customer.subscription.deleted'
    # handle subscription canceled automatically based
    # upon your subscription settings. Or if the user cancels it.
    # puts data_object
  end

  content_type 'application/json'
  { status: 'success' }.to_json
end
```

Verwenden Sie während der Entwicklung die Stripe-CLI, um [Webhooks zu beobachten und an Ihre Anwendung weiterzuleiten](https://docs.stripe.com/webhooks.md#test-webhook). Führen Sie Folgendes in einem neuen Datenterminal aus, während Ihre Entwicklungs-App ausgeführt wird:

#### curl

```bash
  stripe listen --forward-to localhost:4242/webhook
```

Für die Produktionsphase können Sie eine Webhook-Endpoint-URL über das Dashboard oder mit der [Webhook Endpoints API](https://docs.stripe.com/api/webhook_endpoints.md) einrichten.

Sie müssen auf einige Ereignisse achten, um die restlichen Schritte in diesem Leitfaden ausführen zu können. Unter [Abonnements-Ereignissen](https://docs.stripe.com/billing/subscriptions/webhooks.md#events) finden Sie weitere Einzelheiten zu abonnementspezifischen Webhooks.

## Zugang zu Ihrer Dienstleistung bereitstellen [Client und Server]

Nachdem das Abo nun aktiv ist, gewähren Sie Ihren Nutzer/innen Zugriff auf Ihren Dienst. Überwachen Sie dazu die Ereignisse `customer.subscription.created`, `customer.subscription.updated` und `customer.subscription.deleted`. Diese Ereignisse übergeben ein Abo-Objekt, das ein `status`-Feld enthält, das anzeigt, ob das Abo aktiv oder überfällig ist oder gekündigt wurde. Eine vollständige Statusliste finden Sie unter [Abonnementlebenszyklus](https://docs.stripe.com/billing/subscriptions/overview.md#subscription-lifecycle).

In Ihrem Webhook-Handler:

1. Überprüfen Sie den Abo-Status. Wenn er `active` lautet, hat Ihr/e Nutzer/in für Ihr Produkt bezahlt.
1. Überprüfen Sie das Produkt, das die Kundin/der Kunde abonniert hat, und gewähren Sie Zugang zu Ihrer Dienstleistung. Bei der Überprüfung des Produkts sind Sie im Vergleich zur Überprüfung des Preises flexibler, falls Sie den Preis oder das Abrechnungsintervall ändern müssen.
1. Speichern Sie `product.id`, `subscription.id` und `subscription.status` in Ihrer Datenbank zusammen mit der bereits gespeicherten `customer.id`. Überprüfen Sie diesen Datensatz, wenn Sie entscheiden, welche Funktionen für die Nutzer/innen Ihrer Anwendung aktiviert werden sollen.

Der Status eines Abonnements kann sich während seiner Laufzeit jederzeit ändern, auch wenn Ihre Anwendung Stripe nicht direkt aufruft. Beispielsweise kann eine Verlängerung aufgrund einer abgelaufenen Kreditkarte fehlschlagen, wodurch das Abonnement in einen überfälligen Status versetzt wird. Oder wenn Sie das[Kundenportal](https://docs.stripe.com/customer-management.md) implementieren, können Nutzer/innen ihr Abonnement kündigen, ohne Ihre Anwendung direkt aufzurufen. Durch die korrekte Implementierung Ihres Handlers wird der Anwendungsstatus mit Stripe synchronisiert.

## Abonnement kündigen [Client und Server]

Es ist gängige Praxis, dass Kundinnen/Kunden ihr Abonnement selbst kündigen können. In diesem Beispiel wird zur Seite mit den Kontoeinstellungen eine Kündigungsoption hinzugefügt.

In diesem Beispiel wird die Abonnement-ID im Frontend erfasst. Im Produktionsbetrieb kann Ihre Anwendung diese Information für Ihre angemeldeten Nutzer/innen aus Ihrer Datenbank abrufen.
![Beispiel für eine Benutzeroberfläche zur Kündigung eines Abonnements.](https://b.stripecdn.com/docs-statics-srv/assets/fixed-price-subscriptions-guide-account-settings.6559626ba4b434826a67abfea165e097.png)

Kontoeinstellungen mit der Option, das Abonnement zu kündigen

```swift
func cancelSubscription() async {
    var request = URLRequest(url: URL(string: "http://localhost:4242/cancel-subscription")!)
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.httpBody = try! JSONEncoder().encode(["subscriptionId": subscription.id])
    let (subscriptionResponse, _) = try! await URLSession.shared.data(for: request)
    // Update the state to show the subscription has been cancelled
}
```

Definieren Sie im Backend den Endpoint für den Aufruf durch Ihre App.

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/cancel-subscription' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  deleted_subscription = client.v1.subscriptions.cancel(data['subscriptionId'])

  deleted_subscription.to_json
end
```

Ihr Backend erhält ein Ereignis vom Typ `customer.subscription.deleted`.

Aktualisieren Sie nach der Kündigung des Abonnements Ihre Datenbank, um die zuvor gespeicherte Stripe-Abonnement-ID zu entfernen, und schränken Sie den Zugang zu Ihrer Dienstleistung ein.

Wenn ein Abonnement gekündigt wurde, kann es nicht reaktiviert werden. Sie müssen stattdessen die aktualisierten Rechnungsinformationen von Ihrer Kundinnen/Kunden erfassen, deren Standard-Zahlungsmethode aktualisieren und ein neues Abonnement für den bestehenden Kundendatensatz erstellen.

## Integration testen

### Zahlungsmethoden testen

Verwenden Sie die folgende Tabelle, um verschiedene Zahlungsmethoden und -szenarien zu testen.

| Zahlungsmethode  | Szenario                                                                                                                                                                                                                                                                                                           | So führen Sie den Test durch                                                                                                                                                                                          |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| BECS-Lastschrift | Ihr/e Kund/in zahlt erfolgreich mit dem BECS-Lastschriftverfahren.                                                                                                                                                                                                                                                 | Füllen Sie das Formular mit der Kontonummer `900123456` und BSB `000000` aus. Der bestätigte PaymentIntent geht zunächst in den Status `processing` über und dann drei&nbsp;Minuten später in den Status `succeeded`. |
| BECS-Lastschrift | Die Zahlung Ihres/Ihrer Kund/in schlägt fehl mit Code `account_closed` fehl.                                                                                                                                                                                                                                       | Füllen Sie das Formular mit der Kontonummer `111111113` und BSB `000000` aus.                                                                                                                                         |
| Kreditkarte      | Die Kartenzahlung ist erfolgreich, und es ist keine Authentifizierung erforderlich.                                                                                                                                                                                                                                | Füllen Sie das Kreditkartenformular aus und geben Sie die Kreditkartennummer `4242 4242 4242 4242` mit beliebiger Gültigkeitsdauer, CVC und Postleitzahl an.                                                          |
| Kreditkarte      | Für die Kartenzahlung ist eine *Authentifizierung* (Strong Customer Authentication (SCA) is a regulatory requirement in effect as of September 14, 2019, that impacts many European online payments. It requires customers to use two-factor authentication like 3D Secure to verify their purchase) erforderlich. | Füllen Sie das Kreditkartenformular aus und geben Sie die Kreditkartennummer `4000 0025 0000 3155` mit beliebiger Gültigkeitsdauer, CVC und Postleitzahl an.                                                          |
| Kreditkarte      | Die Karte wird mit einem Ablehnungscode wie `insufficient_funds` abgelehnt.                                                                                                                                                                                                                                        | Füllen Sie das Kreditkartenformular aus und geben Sie die Kreditkartennummer `4000 0000 0000 9995` mit beliebiger Gültigkeitsdauer, CVC und Postleitzahl an.                                                          |
| SEPA-Lastschrift | Ihr/e Kund/in zahlt erfolgreich mit dem SEPA-Lastschriftverfahren.                                                                                                                                                                                                                                                 | Füllen Sie das Formular mit der Kontonummer `AT321904300235473204` aus. Die bestätigte PaymentIntent geht zunächst in den Status „wird verarbeitet“ und dann drei Minuten später in den Status „erfolgreich“ über.    |
| SEPA-Lastschrift | Der Status der PaymentIntent Ihrer Kundin/Ihre Kundin wechselt von `processing` zu `requires_payment_method`.                                                                                                                                                                                                      | Füllen Sie das Formular mit der Kontonummer `AT861904300235473202` aus.                                                                                                                                               |

### Ereignisse überwachen

Richten Sie Webhooks ein, um Abonnementänderungsereignisse wie Upgrades und Kündigungen zu überwachen. Erfahren Sie mehr über [Abonnement-Webhooks](https://docs.stripe.com/billing/subscriptions/webhooks.md). Sie können Ereignisse im [Dashboard](https://dashboard.stripe.com/test/events) oder mit der [Stripe-CLI](https://docs.stripe.com/webhooks.md#test-webhook) anzeigen.

Weitere Informationen finden Sie unter [Billing-Integration testen](https://docs.stripe.com/billing/testing.md).

## Optional: Planänderungen auf Kundenseite zulassen [Client und Server]

Damit Ihre Kundinnen/Kunden ihr Abonnement selbst ändern können, erfassen Sie die Preis-ID der Option, zu der gewechselt werden soll. Übermitteln Sie dann die neue Preis-ID von der App an einen Backend-Endpoint. In diesem Beispiel wird auch die Abonnement-ID übergeben, Sie können diese jedoch für Ihre angemeldeten Nutzer/innen aus Ihrer Datenbank abrufen.

```swift
func updateSubscription(priceId: String, subscriptionId: String) async -> SubscriptionsResponse {
    var request = URLRequest(url: URL(string: "http://localhost:4242/update-subscription")!)
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.httpBody = try! JSONEncoder().encode(["subscriptionId": subscriptionId, "priceId": priceId])
    let (responseData, _) = try! await URLSession.shared.data(for: request)
    // SubscriptionsResponse is a Decodable struct conforming to the expected response from your backend
    let subscriptionsResponse = try! JSONDecoder().decode(SubscriptionsResponse.self, from: responseData)
    return subscriptionsResponse
}
```

Definieren Sie im Backend den Endpoint für den Aufruf durch Ihr Frontend und übergeben Sie dabei die Abonnement-ID und die neue Preis-ID. Für das Abonnement gilt jetzt der Premium-Plan zum Preis von 15&nbsp;USD pro Monat anstelle des Basic-Plans zum Preis von 5&nbsp;USD pro Monat.

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/update-subscription' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  subscription = client.v1.subscriptions.retrieve(data['subscriptionId'])

  updated_subscription =
    client.v1.subscriptions.update(
      data['subscriptionId'],
      cancel_at_period_end: false,
      items: [
        { id: subscription.items.data[0].id, price: data['newPriceId'] }
      ]
    )

  updated_subscription.to_json
end
```

Ihre Anwendung erhält ein Ereignis vom Typ `customer.subscription.updated`.

## Optional: Vorschau einer Preisänderung anzeigen [Client und Server]

Bei Änderungen eines Abonnements durch Kundinnen/Kunden wird häufig der geschuldete Betrag angepasst. Diese Anpassung wird als [anteilsmäßige Verrechnung](https://docs.stripe.com/billing/subscriptions/prorations.md) bezeichnet. Mithilfe des [Endpoints zum Erstellen einer Rechnungsvorschau](https://docs.stripe.com/api/invoices/create_preview.md) können Sie Ihren Kundinnen und Kunden den angepassten Betrag anzeigen.

Übergeben Sie in der App die Rechnungsvorschau an einen Backend-Endpoint.

```swift
func createPreviewInvoice(customerId: String, subscriptionId: String, newPriceId: String) async -> InvoiceResponse {
    var request = URLRequest(url: URL(string: "http://localhost:4242/create-preview-invoice")!)
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.httpBody = try! JSONEncoder().encode(["subscriptionId": subscriptionId, "customerId": customerId, "newPriceId": newPriceId])
    let (responseData, _) = try! await URLSession.shared.data(for: request)
    // Invoice is a Decodable struct conforming to the expected response from your backend
    let invoiceResponse = try! JSONDecoder().decode(InvoiceResponse.self, from: responseData)
    return invoiceResponse
}
```

Definieren Sie im Backend den Endpoint für den Aufruf durch Ihr Frontend.

#### Accounts&nbsp;v2

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/create-preview-invoice' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  subscription = Stripe::Subscription.retrieve(data['subscriptionId'])

  invoice =
    Stripe::Invoice.create_preview(
      customer_account: data['customerAccountId'],
      subscription: data['subscriptionId'],
      subscription_details: {
        items: [
          { id: subscription.items.data[0].id, deleted: true },
          { price: data['newPriceId'], deleted: false }
        ]
      }
    )

  invoice.to_json
end
```

#### Customers&nbsp;v1

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/create-preview-invoice' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  subscription = client.v1.subscriptions.retrieve(data['subscriptionId'])

  invoice =
    client.v1.invoices.create_preview(
      customer: data['customerId'],
      subscription: data['subscriptionId'],
      subscription_details: {
        items: [
          { id: subscription.items.data[0].id, deleted: true },
          { price: data['newPriceId'], deleted: false }
        ]
      }
    )

  invoice.to_json
end
```

## Optional: Zahlungsmethode der Kundin/des Kunden anzeigen [Client und Server]

Wenn der Kartenaussteller und die letzten vier Ziffern der Karte angezeigt werden, wissen Kundinnen/Kunden eher, welche Karte belastet wird, und können gegebenenfalls die Zahlungsmethode aktualisieren.

Senden Sie im Fronend die ID der Zahlungsmethode an einen Backend-Endpoint, der die Details zur Zahlungsmethode abruft.

```swift
func retrieveCustomerPaymentMethod(paymentMethodId: String) async -> PaymentMethodResponse {
    var request = URLRequest(url: URL(string: "http://localhost:4242/retrieve-customer-payment-method")!)
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.httpBody = try! JSONEncoder().encode(["paymentMethodId": paymentMethodId])
    let (responseData, _) = try! await URLSession.shared.data(for: request)
    // PaymentMethodResponse is a Decodable struct conforming to the expected response from your backend
    let paymentMethodResponse = try! JSONDecoder().decode(PaymentMethodResponse.self, from: responseData)
    return paymentMethodResponse
}
```

Definieren Sie im Backend den Endpoint für den Aufruf durch Ihre App.

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/retrieve-customer-payment-method' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  payment_method = client.v1.payment_methods.retrieve(data['paymentMethodId'])

  payment_method.to_json
end
```

Beispielantwort:

```json
{
  "id": "pm_1GcbHY2eZvKYlo2CoqlVxo42",
  "object": "payment_method",
  "billing_details": {
    "address": {
      "city": null,
      "country": null,
      "line1": null,
      "line2": null,
      "postal_code": null,
      "state": null
    },
    "email": null,
    "name": null,
    "phone": null
  },
  "card": {
    "brand": "visa",
    "checks": {
      "address_line1_check": null,
      "address_postal_code_check": null,
      "cvc_check": "pass"
    },
    "country": "US",
    "exp_month": 8,
    "exp_year": 2021,
    "fingerprint": "Xt5EWLLDS7FJjR1c",
    "funding": "credit",
    "generated_from": null,
    "last4": "4242",
    "three_d_secure_usage": {
      "supported": true
    },
    "wallet": null
  },
  "created": 1588010536,
  "customer": "cus_HAxB7dVQxhoKLh",
  "livemode": false,
  "metadata": {},
  "type": "card"
}
```

> Wir empfehlen, die `paymentMethod.id` und die `last4` in Ihrer Datenbank zu speichern (zum Beispiel `paymentMethod.id` als `stripeCustomerPaymentMethodId` in Ihrer Auflistung oder Tabelle für `users`). Optional können Sie je nach Bedarf `exp_month`, `exp_year`, `fingerprint` und `billing_details` speichern. Dadurch können Sie die Anzahl der Aufrufe an Stripe begrenzen, um sowohl die Leistung zu steigern als auch eventuelle Ratenbegrenzungen zu vermeiden.

## Stripe Ihren Kundinnen/Kunden anzeigen

Stripe erfasst Informationen über Kundeninteraktionen mit Elements , um Ihnen Dienste bereitzustellen, Betrug vorzubeugen und seine Dienste zu verbessern. Dies umfasst auch die Verwendung von Cookies und IP-Adressen, um zu ermitteln, welche Elements ein/e Kund/in während einer einzelnen Checkout-Sitzung gesehen hat. Sie sind dafür verantwortlich, alle Rechte und Zustimmungen offenzulegen und einzuholen, die Stripe benötigen, um Ihre Daten auf diese Weise zu nutzen. Weitere Informationen finden Sie in unserem [Datenschutzcenter](https://stripe.com/legal/privacy-center#as-a-business-user-what-notice-do-i-provide-to-my-end-customers-about-stripe).

#### Android

Erfahren Sie, wie Sie Abos mit festem Preis *verkaufen* (A Subscription represents the product details associated with the plan that your customer subscribes to. Allows you to charge the customer on a recurring basis). Sie verwenden das [Mobile Payment Element](https://docs.stripe.com/payments/accept-a-payment.md), um ein benutzerdefiniertes Zahlungsformular zu erstellen, das Sie in Ihre App einbetten.
![Seite für Festpreisabonnements mit Mobile Payment Element](https://b.stripecdn.com/docs-statics-srv/assets/fixed-price-collect-payment-details-mobile.b11cdc8fa8952d753238df4df3375fa6.png)

> Wenn Sie digitale Produkte oder Dienstleistungen verkaufen, die in Ihrer App verwendet werden (zum Beispiel Abonnements, In-Game-Währungen, Level in einem Spiel, Zugriff auf Premium-Inhalte oder das Freischalten einer Vollversion), müssen Sie die In-App-Kauf-APIs von Apple nutzen. Einige Verkäufe sind von dieser Regel ausgenommen, darunter persönliche Dienste an Einzelpersonen und [Apps in bestimmten Regionen](https://support.stripe.com/questions/changes-to-mobile-app-store-rules). Weitere Informationen finden Sie in [den Überprüfungsrichtlinien des App Store](https://developer.apple.com/app-store/review/guidelines/#payments).

## Abonnement erstellen

Dieser Leitfaden bietet Informationen zu den folgenden Vorgehensweisen:

- Modellieren Sie Ihr Unternehmen, indem Sie einen Produktkatalog erstellen.
- Erstellen Sie einen Registrierungsprozess, um Kundinnen/Kunden hinzuzufügen.
- Abonnements erstellen und Zahlungsinformationen erfassen.
- Den Status von Zahlungen und Abonnements testen und überwachen.
- Kundinnen/Kunden ihren Plan ändern oder das Abonnement kündigen lassen.
- Erfahren Sie, wie Sie mit dem [flexiblen Abrechnungsmodus](https://docs.stripe.com/billing/subscriptions/billing-mode.md) von einem verbesserten Abrechnungsverhalten profitieren und auf zusätzliche Funktionen zugreifen können.

## So modellieren Sie das Abonnement bei Stripe

[Subscriptions](https://docs.stripe.com/api/subscriptions.md) vereinfachen Ihre Billing, indem sie automatisch *Rechnungen* (Invoices are statements of amounts owed by a customer. They track the status of payments from draft through paid or otherwise finalized. Subscriptions automatically generate invoices, or you can manually create a one-off invoice) und [PaymentIntents](https://docs.stripe.com/api/payment_intents.md) für Sie erstellen. Um ein Abo zu erstellen und zu aktivieren, müssen Sie zunächst ein *Produkt* (Products represent what your business sells—whether that's a good or a service) erstellen, um das verkaufte Produkt zu modellieren, sowie einen *Preis* (Prices define how much and how often to charge for products. This includes how much the product costs, what currency to use, and the interval if the price is for subscriptions), der das Intervall und den zu berechnenden Betrag festlegt. Außerdem benötigen Sie entweder ein vom Kunden oder von der Kundin konfiguriertes `Konto`-Objekt oder ein `Kunden`-Objekt, um die *Zahlungsmethoden* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs) zu speichern, die für die einzelnen wiederkehrenden Zahlungen verwendet werden.

#### Accounts&nbsp;v2
Ein Diagramm, das gängige Abrechnungsobjekte und ihre Beziehungen veranschaulicht (See full diagram at https://docs.stripe.com/billing/subscriptions/build-subscriptions)
#### Customer&nbsp;v1
Ein Diagramm, das gängige Abrechnungsobjekte und ihre Beziehungen veranschaulicht (See full diagram at https://docs.stripe.com/billing/subscriptions/build-subscriptions)
### API-Objekt-Definitionen

| Ressource                                                                                                                                 | Definition                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| ----------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Als Kunde/Kundin konfiguriertes Konto](https://docs.stripe.com/api/v2/core/accounts/create.md#v2_create_accounts-configuration-customer) | Stellt in der Accounts v2 API eine Kundin/einen Kunden dar, die/der ein Abonnement erwirbt. Konfigurieren Sie ein `Account`-Objekt als Kundin/Kunde und verknüpfen Sie es mit einem Abonnement, um wiederkehrende Zahlungen zu erheben und nachzuverfolgen sowie die abonnierten Produkte zu verwalten. Weitere Informationen finden Sie im [Leitfaden zur Verwendung von Accounts als Kundin/Kunde](https://docs.stripe.com/connect/use-accounts-as-customers.md).                                                                                     |
| [Kundin/Kunde](https://docs.stripe.com/api/customers.md)                                                                                  | Stellt eine Kundin/einen Kundin in der Customers API dar, die/der ein Abonnement erwirbt. Verwenden Sie das mit einem Abonnement verknüpfte `Customer`-Objekt, um wiederkehrende Zahlungen durchzuführen und zu verfolgen und die abonnierten Produkte zu verwalten.                                                                                                                                                                                                                                                                                    |
| [Berechtigung](https://docs.stripe.com/api/entitlements/active-entitlement.md)                                                            | Stellt den Zugriff eines Kunden/einer Kundin auf eine Funktion dar, die in einem Dienstleistungsprodukt enthalten ist, das er/sie abonniert hat. Wenn Sie ein Abonnement für den wiederkehrenden Kauf eines Produkts durch einen Kunden/eine Kundin erstellen, wird automatisch eine aktive Berechtigung für jede diesem Produkt zugeordnete Funktion erstellt. Wenn ein Kunde/eine Kundin auf Ihre Dienstleistungen zugreift, verwenden Sie seine/ihre aktiven Berechtigungen, um die in seinem/ihrem Abonnement enthaltenen Funktionen zu aktivieren. |
| [Funktion](https://docs.stripe.com/api/entitlements/feature.md)                                                                           | Stellt eine Funktion oder Fähigkeit dar, auf die Ihre Kundinnen und Kunden zugreifen können, wenn sie ein Dienstleistungsprodukt abonnieren. Sie können Funktionen in ein Produkt einfügen, indem Sie ProductFeatures erstellen.                                                                                                                                                                                                                                                                                                                        |
| [Rechnung](https://docs.stripe.com/api/invoices.md)                                                                                       | Eine Aufstellung der Beträge, die ein Kunde/eine Kundin schuldet, die den Zahlungsstatus vom Entwurf bis zur Bezahlung oder anderweitigem Abschluss verfolgt. Bei Abonnements werden automatisch Rechnungen erstellt.                                                                                                                                                                                                                                                                                                                                   |
| [PaymentIntent](https://docs.stripe.com/api/payment_intents.md)                                                                           | Eine Möglichkeit zum Erstellen dynamischer Zahlungsabläufe. Mit einem PaymentIntent wird der Lebenszyklus der Bezahlvorgänge von Kundinnen/Kunden verfolgt, und es werden zusätzliche Authentifizierungsschritte ausgelöst, wenn dies aufgrund von gesetzlichen Vorschriften, nutzerdefinierten Radar-Betrugsregeln oder auf Weiterleitung basierenden Zahlungsmethoden erforderlich ist. Rechnungen erstellen automatisch PaymentIntents.                                                                                                              |
| [PaymentMethod](https://docs.stripe.com/api/payment_methods.md)                                                                           | Die Zahlungsmethoden einer Kundin/eines Kunden, mit denen sie/er für Ihre Produkte bezahlt. Sie können beispielsweise eine Kreditkarte in einem kundenkonfigurierten `Account` oder `Customer` speichern und damit wiederkehrende Zahlungen für diese Kundin/diesen Kunden/ vornehmen. Wird in der Regel mit der Payment Intents API oder der Setup Intents API verwendet.                                                                                                                                                                              |
| [Preis](https://docs.stripe.com/api/prices.md)                                                                                            | Definiert den Stückpreis, die Währung und den Rechnungszyklus für ein Produkt.                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| [Produkt](https://docs.stripe.com/api/products.md)                                                                                        | Eine Ware oder Dienstleistung, die Ihr Unternehmen verkauft. Ein Dienstleistungsprodukt kann eine oder mehrere Funktionen beinhalten.                                                                                                                                                                                                                                                                                                                                                                                                                   |
| [ProductFeature](https://docs.stripe.com/api/product-feature.md)                                                                          | Stellt die Aufnahme einer einzelnen Funktion in ein einzelnes Produkt dar. Jedes Produkt ist für jede Funktion, die es enthält, mit einer ProductFeature verknüpft, und jede Funktion ist für jedes Produkt, das sie enthält, mit einer ProductFeature verknüpft.                                                                                                                                                                                                                                                                                       |
| [Abonnement](https://docs.stripe.com/api/subscriptions.md)                                                                                | Stellt den geplanten wiederkehrenden Kauf eines Produkts durch einen Kunden/eine Kundin dar. Verwenden Sie ein Abonnement, um Zahlungen einzuziehen und eine wiederholte Lieferung oder einen kontinuierlichen Zugriff auf ein Produkt zu ermöglichen.                                                                                                                                                                                                                                                                                                  |

Hier ist ein Beispiel dafür, wie Produkte, Funktionen und Berechtigungen zusammen funktionieren. Stellen Sie sich vor, Sie möchten einen wiederkehrenden Service einrichten, der zwei Stufen anbietet: ein Standard-Produkt mit grundlegenden Funktionalitäten und ein erweitertes Produkt, das erweiterte Funktionalitäten bietet.

1. Sie erstellen zwei Funktionen: `basic_features` und `extended_features`.
1. Sie erstellen zwei Produkte: `standard_product` und `advanced_product`.
1. Für das Standardprodukt erstellen Sie eine ProductFeature, die `basic_features` mit `standard_product` verknüpft.
1. Für das erweiterte Produkt erstellen Sie zwei ProductFeatures: eine, die `basic_features` mit `advanced_product` verknüpft, und eine, die `extended_features` mit `advanced_product` verknüpft.

Ein Kunde/eine Kundin, `first_customer`, abonniert das Standardprodukt. Wenn Sie das Abonnement erstellen, erstellt Stripe automatisch eine Berechtigung, die `first_customer` mit `basic_features` verknüpft.

Ein anderer Kunde/eine andere Kundin, `second_customer`, abonniert das erweiterte Produkt. Wenn Sie das Abonnement erstellen, erstellt Stripe automatisch zwei Berechtigungen: eine, die `second_customer` mit `basic_features` verknüpft, und eine, die `second_customer` mit `extended_features` verknüpft.

Sie können festlegen, welche Funktionen für einen Kunden/eine Kundin bereitgestellt werden sollen, indem Sie [seine/ihre aktiven Berechtigungen abrufen oder das Ereignis mit der Zusammenfassung der aktiven Berechtigungen überwachen](https://docs.stripe.com/billing/entitlements.md#entitlements). Sie müssen ihre Abonnements, Produkte und Funktionen nicht abrufen.

## Stripe einrichten

Das [Stripe Android SDK](https://github.com/stripe/stripe-android) ist Open Source und [vollständig dokumentiert](https://stripe.dev/stripe-android/).

Um das SDK zu installieren, fügen Sie `stripe-android` in den Block `dependencies` Ihrer [app/build.gradle](https://developer.android.com/studio/build/dependencies)-Datei ein:

#### Kotlin

```kotlin
plugins {
    id("com.android.application")
}

android { ... }

dependencies {
  // ...

  // Stripe Android SDK
  implementation("com.stripe:stripe-android:23.3.0")
  // Include the financial connections SDK to support US bank account as a payment method
  implementation("com.stripe:financial-connections:23.3.0")
}
```

> Details zur aktuellen SDK-Version und zu vorherigen Versionen finden Sie auf der Seite [Releases](https://github.com/stripe/stripe-android/releases) auf GitHub. Um bei Veröffentlichung eines neuen Release eine Benachrichtigung zu erhalten, [beobachten Sie Veröffentlichungen für das jeweilige Repository](https://docs.github.com/en/github/managing-subscriptions-and-notifications-on-github/configuring-notifications#configuring-your-watch-settings-for-an-individual-repository).

Konfigurieren Sie das SDK mit Ihrem [veröffentlichbaren Schlüssel](https://dashboard.stripe.com/apikeys) von Stripe so, dass dieser Anfragen an die API stellen kann, wie beispielsweise in Ihrer Unterklasse `Application`:

#### Kotlin

```kotlin
import com.stripe.android.PaymentConfiguration

class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        PaymentConfiguration.init(
            applicationContext,
            "<<YOUR_PUBLISHABLE_KEY>>"
        )
    }
}
```

> Verwenden Sie Ihre [Testschlüssel](https://docs.stripe.com/keys.md#obtain-api-keys) beim Testen und Entwickeln Ihrer App und Ihre [Live-Modus](https://docs.stripe.com/keys.md#test-live-modes)-Schlüssel beim Veröffentlichen Ihrer App.

Installieren Sie dann die Stripe-CLI. Mit der Stripe-CLI können Sie Webhooks testen und Stripe-APIs aufrufen. In einem späteren Abschnitt dieses Leitfadens wird erklärt, wie Sie mithilfe der CLI ein Preismodell einrichten können.
Weitere Installationsoptionen finden Sie unter [Mit der Stripe-CLI loslegen](https://docs.stripe.com/stripe-cli.md).
## Preismodell erstellen [Stripe-CLI oder Dashboard]

[Wiederkehrende Preismodelle](https://docs.stripe.com/products-prices/pricing-models.md) umfassen die Produkte und Dienstleistungen, die Sie anbieten, die Preise dafür, welche Währungen Sie für Zahlungen verwenden und den Leistungszeitraum (für Abos). Verwenden Sie zum Aufbau des Preismodells [Produkte](https://docs.stripe.com/api/products.md) (was Sie anbieten) und [Preise](https://docs.stripe.com/api/prices.md) (Höhe und Abrechnungsintervall).

In diesem Beispiel wird ein Pauschalpreisdienst mit zwei verschiedenen Service-Optionen verwendet: Basis und Premium. Für jede Service-Option müssen Sie ein Produkt und einen wiederkehrenden Preis erstellen. Um eine einmalige Gebühr, z.&nbsp;B. für die Einrichtung, hinzufügen möchten, erstellen Sie ein drittes Produkt mit einem einmaligen Preis.

Jedes Produkt wird in monatlichen Intervallen abgerechnet. Der Preis für das Basisprodukt beträgt 5&nbsp;USD. Der Preis für das Premiumprodukt beträgt 15 USD. Ein Beispiel mit drei Stufen finden Sie im Leitfaden zu [Pauschalpreismodellen](https://docs.stripe.com/subscriptions/pricing-models/flat-rate-pricing.md).

#### Dashboard

Gehen Sie zur Seite [Produkt hinzufügen](https://dashboard.stripe.com/test/products/create) und erstellen Sie zwei Produkte. Fügen Sie für jedes Produkt einen Preis hinzu, jeweils mit einem monatlich wiederkehrenden Abrechnungszeitraum:

- Premium-Produkt: Premium-Dienstleistung mit zusätzlichen Funktionen

  - Preis: Pauschalpreis&nbsp;|&nbsp;15 USD

- Basic-Produkt: Basic-Dienstleistung mit minimalem Funktionsumfang

  - Preis: Pauschalpreis&nbsp;|&nbsp;5 USD

Zeichnen Sie nach Erstellung der Preise die Preis-IDs auf, sodass diese in anderen Schritten verwendet werden können. Preis-IDs sehen in etwa wie folgt aus: `price_G0FvDp6vZvdwRZ`.

Wenn Sie bereit sind, verwenden Sie die Schaltfläche **In Live-Modus kopieren** oben rechts auf der Seite, um Ihr Produkt aus der [Sandbox in den Live-Modus zu kopieren](https://docs.stripe.com/keys.md#test-live-modes).

#### API

Sie können die API zum Erstellen der [Produkte](https://docs.stripe.com/api/products.md) und [Preise](https://docs.stripe.com/api/prices.md) verwenden.

Premiumprodukt erstellen:

```curl
curl https://api.stripe.com/v1/products \
  -u "<<YOUR_SECRET_KEY>>:" \
  --data-urlencode "name=Billing Guide: Premium Service" \
  -d "description=Premium service with extra features"
```

Basisprodukt erstellen:

```curl
curl https://api.stripe.com/v1/products \
  -u "<<YOUR_SECRET_KEY>>:" \
  --data-urlencode "name=Billing Guide: Basic Service" \
  -d "description=Basic service with minimum features"
```

Zeichnen Sie Preis-ID für jedes Produkt auf. Die Preis-IDs sehen in etwa wie folgt aus:

```json
{
  "id": "prod_H94k5odtwJXMtQ",
  "object": "product",
  "active": true,
  "attributes": [

  ],
  "created": 1587577341,
  "description": "Premium service with extra features",
  "images": [

  ],
  "livemode": false,
  "metadata": {
  },
  "name": "Billing Guide: Premium Service",
  "statement_descriptor": null,
  "type": "service",
  "unit_label": null,
  "updated": 1587577341
}
```

Verwenden Sie die Produkt-IDs, um einen Preis für jedes Produkt zu erstellen. Die Zahl [unit_amount](https://docs.stripe.com/api/prices/object.md#price_object-unit_amount) wird in Cent angegeben, also z.&nbsp;B.`1500` = 15 USD.

Premiumpreis erstellen:

```curl
curl https://api.stripe.com/v1/prices \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d product={{PREMIUM_PRODUCT_ID}} \
  -d unit_amount=1500 \
  -d currency=usd \
  -d "recurring[interval]=month"
```

Basispreis erstellen:

```curl
curl https://api.stripe.com/v1/prices \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d product={{BASIC_PRODUCT_ID}} \
  -d unit_amount=500 \
  -d currency=usd \
  -d "recurring[interval]=month"
```

Zeichnen Sie Preis-ID für jeden Preis auf, sodass diese in nachfolgenden Schritten verwendet werden können. Die Preis-IDs sehen in etwa wie folgt aus:

```json
{
  "id": "price_HGd7M3DV3IMXkC",
  "object": "price",
  "product": "prod_HGd6W1VUqqXGvr",
  "type": "recurring",
  "currency": "usd",
  "recurring": {
    "interval": "month",
    "interval_count": 1,
    "trial_period_days": null,
    "usage_type": "licensed"
  },
  "active": true,
  "billing_scheme": "per_unit",
  "created": 1589319695,
  "livemode": false,
  "lookup_key": null,
  "metadata": {},
  "nickname": null,
  "unit_amount": 1500,
  "unit_amount_decimal": "1500",
  "tiers": null,
  "tiers_mode": null,
  "transform_quantity": null
}
```

## Kundin/Kunden erstellen [Client und Server]

Stripe benötigt für jedes Abonnement einen Kunden bzw. eine Kundin. Erfassen Sie in der Nutzeroberfläche Ihrer Anwendung alle erforderlichen Informationen von Ihren Nutzerinnen und Nutzern und leiten Sie diese an das Backend weiter.

Möglicherweise möchten Sie eine Netzwerkbibliothek verwenden, um Netzwerkanforderungen an Ihr Backend zu senden. Dieses Dokument verwendet [okhttp](https://square.github.io/okhttp/), Sie können jedoch jede mit Ihrem Projekt kompatible Bibliothek nutzen.

```groovy
dependencies {
  ...
  implementation "com.squareup.okhttp3:okhttp:4.12.0"
}
```

Wenn Sie Adressdaten erfassen müssen, können Sie mit dem Address Element Versand- und Rechnungsadressen Ihrer Kundinnen/Kunden erfassen. Weitere Informationen zu dem Thema finden Sie auf der Seite [Address Element](https://docs.stripe.com/elements/address-element.md).

```kotlin
import androidx.compose.foundation.layout.Column
import androidx.compose.material3.Button
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import org.json.JSONObject

@Composable
fun RegisterView() {
    var email by remember { mutableStateOf("") }
    Column {
        OutlinedTextField(value = email,
            label = { Text(text = "Email") },
            onValueChange = { email = it })
        Button(onClick = {
            val body = JSONObject().put("email", email).toString()
                .toRequestBody("application/json".toMediaType())
            val request =
                Request.Builder().url("http://10.0.2.2:4567/create-customer").post(body).build()
            CoroutineScope(Dispatchers.IO).launch {
                OkHttpClient().newCall(request).execute().use { response ->
                    if (response.isSuccessful) {
                        println(JSONObject(response.body!!.string()).get("customer"))
                    }
                }
            }
        }) {
            Text(text = "Submit")
        }
    }
}
```

Erstellen Sie das Stripe Customer-Objekt auf dem Server.

> #### Verwenden Sie die Accounts&nbsp;v2 API zum Darstellen von Kundinnen und Kunden
> 
> The Accounts v2 API is generally available for Connect users, and in public preview for other Stripe users. If you’re part of the Accounts v2 preview, you need to specify a [specify a preview version](https://docs.stripe.com/api-v2-overview.md#sdk-and-api-versioning) in your code.
> 
> To request access to the Accounts v2 preview, 
> 
> Für die meisten Anwendungsfälle empfehlen wir, [Ihre Kundinnen und Kunden als vom Kunden bzw. von der Kundin konfigurierte Account-Objekte abzubilden](https://docs.stripe.com/connect/use-accounts-as-customers.md), anstatt das [Kundenobjekt](https://docs.stripe.com/api/customers.md) zu verwenden.

#### Accounts&nbsp;v2

```curl
curl -X POST https://api.stripe.com/v2/core/accounts \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-03-25.preview" \
  --json '{
    "contact_email": "jenny.rosen@example.com",
    "display_name": "Jenny Rosen",
    "identity": {
        "individual": {
            "given_name": "Jenny Rosen",
            "address": {
                "city": "San Francisco",
                "country": "US",
                "line1": "123 Main Street",
                "postal_code": "94605",
                "state": "CA"
            }
        }
    },
    "configuration": {
        "customer": {
            "capabilities": {
                "automatic_indirect_tax": {
                    "requested": true
                }
            },
            "shipping": {
                "address": {
                    "city": "San Francisco",
                    "country": "US",
                    "line1": "123 Main Street",
                    "postal_code": "94605",
                    "state": "CA"
                }
            }
        }
    },
    "include": [
        "configuration.customer",
        "identity"
    ]
  }'
```

#### Customers&nbsp;v1

```curl
curl https://api.stripe.com/v1/customers \
  -u "<<YOUR_SECRET_KEY>>:" \
  --data-urlencode "email=jenny.rosen@example.com" \
  -d "name=Jenny Rosen" \
  -d "shipping[address][city]=San Francisco" \
  -d "shipping[address][country]=US" \
  -d "shipping[address][line1]=123 Main Street" \
  -d "shipping[address][postal_code]=9460" \
  -d "shipping[address][state]=CA" \
  -d "shipping[name]=Jenny Rosen" \
  -d "address[city]=San Francisco" \
  -d "address[country]=US" \
  -d "address[line1]=123 Main Street" \
  -d "address[postal_code]=9460" \
  -d "address[state]=CA"
```

## Abonnement erstellen [Client und Server]

> Wie Sie das Payment Element rendern, ohne vorab ein Abonnement zu erstellen, finden Sie weitere Informationen unter [Zahlungsdaten vor dem Erstellen eines Intent erfassen](https://docs.stripe.com/payments/accept-a-payment-deferred.md?type=subscription).

Lassen Sie neuen Kundinnen und Kunden einen Plan auswählen und dann ein Abonnement erstellen. In diesem Leitfaden stehen einen Basic- und ein Premium-Plan zur Auswahl.

Übergeben Sie in Ihrer App die ausgewählte Preis-ID und die ID des Kundendatensatzes an das Backend.

#### Accounts&nbsp;v2

```kotlin
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import org.json.JSONObject

fun createSubscription(priceId: String, customerAccountId: String): SubscriptionResponse? {
    val body = JSONObject()
        .put("priceId", priceId)
        .put("customerAccountId", customerAccountId).toString()
        .toRequestBody("application/json".toMediaType())
    val request =
        Request.Builder().url("http://10.0.2.2:4567/create-subscription").post(body).build()
    OkHttpClient().newCall(request).execute().use { response ->
        if (response.isSuccessful) {
            // SubscriptionsResponse is data class conforming to the expected response from your backend.
            // It should include the client_secret, as discussed below.
            return Gson().fromJson(response.body!!.string(), SubscriptionResponse::class.java)
        }
    }
    return null
}
```

#### Customers&nbsp;v1

```kotlin
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import org.json.JSONObject

fun createSubscription(priceId: String, customerId: String): SubscriptionResponse? {
    val body = JSONObject()
        .put("priceId", priceId)
        .put("customerId", customerId).toString()
        .toRequestBody("application/json".toMediaType())
    val request =
        Request.Builder().url("http://10.0.2.2:4567/create-subscription").post(body).build()
    OkHttpClient().newCall(request).execute().use { response ->
        if (response.isSuccessful) {
            // SubscriptionsResponse is data class conforming to the expected response from your backend.
            // It should include the client_secret, as discussed below.
            return Gson().fromJson(response.body!!.string(), SubscriptionResponse::class.java)
        }
    }
    return null
}
```

Erstellen Sie im Backend mithilfe von `payment_behavior=default_incomplete` das Abonnement mit dem Status `incomplete`. Geben Sie dann das `client_secret` aus dem ersten [Payment Intent](https://docs.stripe.com/payments/payment-intents.md) des Abonnements an das Frontend zurück, um die Zahlung abzuschließen, indem Sie das [`confirmation_secret`](https://docs.stripe.com/api/invoices/object.md#invoice_object-confirmation_secret) auf der letzten Rechnung des Abonnements erweitern.

Um das [verbesserte Aboverhalten](https://docs.stripe.com/billing/subscriptions/billing-mode.md) zu aktivieren, setzen Sie `billing_mode[type]` auf `flexible`. Sie müssen die Stripe API Version [2025-06-30.basil](https://docs.stripe.com/changelog/basil.md#2025-06-30.basil) oder höher verwenden.

Legen Sie [save_default_payment_method](https://docs.stripe.com/api/subscriptions/object.md#subscription_object-payment_settings-save_default_payment_method) auf `on_subscription` fest, um die Zahlungsmethode bei erfolgreicher Zahlung als Standard für ein Abonnement zu speichern. Das Speichern einer Standardzahlungsmethode erhöht die Erfolgsquote künftiger Abonnementzahlungen.

Im folgenden Beispiel wird ein `Abonnement` erstellt und das `confirmation_secret` aus der letzten Rechnung in der Antwort erweitert. So können Sie das Geheimnis an das Frontend übergeben, um die Zahlung zu bestätigen.

#### Accounts&nbsp;v2

```curl
curl https://api.stripe.com/v1/subscriptions \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d "customer_account={{CUSTOMERACCOUNT_ID}}" \
  -d "items[0][price]={{PRICE_ID}}" \
  -d payment_behavior=default_incomplete \
  -d "payment_settings[save_default_payment_method]=on_subscription" \
  -d "billing_mode[type]=flexible" \
  -d "expand[0]=latest_invoice.confirmation_secret"
```

#### Customers&nbsp;v1

```curl
curl https://api.stripe.com/v1/subscriptions \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d "customer={{CUSTOMER_ID}}" \
  -d "items[0][price]={{PRICE_ID}}" \
  -d payment_behavior=default_incomplete \
  -d "payment_settings[save_default_payment_method]=on_subscription" \
  -d "billing_mode[type]=flexible" \
  -d "expand[0]=latest_invoice.confirmation_secret"
```

> Wenn Sie einen *Preis mit mehreren Währungen* (A single Price object can support multiple currencies. Each purchase uses one of the supported currencies for the Price, depending on how you use the Price in your integration) verwenden, verwenden Sie den Parameter [currency](https://docs.stripe.com/api/subscriptions/create.md#create_subscription-currency), um das Abonnement darüber zu informieren, welche Währung des Preises verwendet werden soll. (Wenn Sie den Parameter `currency` weglassen, wird für das Abonnement die Standardwährung des Preises verwendet.)

Das Abonnement ist derzeit `inaktiv` und wartet auf die Zahlung. Die folgende Beispielantwort zeigt die mindestens zu speichernden Felder, jedoch können Sie alle Felder speichern, auf die Ihre Anwendung häufig zugreift.

#### Accounts&nbsp;v2

```json
{"id": "sub_JgRjFjhKbtD2qz",
  "object": "subscription",
  "application_fee_percent": null,
  "automatic_tax": {
    "disabled_reason": null,
    "enabled": false,
    "liability": "null"
  },
  "billing_cycle_anchor": 1623873347,
  "billing_cycle_anchor_config": null,
  "cancel_at": null,
  "cancel_at_period_end": false,
  "canceled_at": null,
  "cancellation_details": {
    "comment": null,
    "feedback": null,
    "reason": null
  },
  "collection_method": "charge_automatically",
  "created": 1623873347,
  "currency": "usd","customer_account": identifier("customerAccount"),
  "days_until_due": null,
  "default_payment_method": null,
  "default_source": null,
  "default_tax_rates": [

  ],
  "discounts": [],
  "ended_at": null,
  "invoice_customer_balance_settings": {
    "account_tax_ids": null,
    "issuer": {
      "type": "self"
    }
  },
  "items": {
    "object": "list",
    "data": [
      {
        "id": "si_JgRjmS4Ur1khEx",
        "object": "subscription_item",
        "created": 1623873347,"current_period_end": 1626465347,
        "current_period_start": 1623873347,
        "discounts": [],
        "metadata": {
        },
        "plan": {
          "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
          "object": "plan",
          "active": true,
          "amount": 2000,
          "amount_decimal": "2000",
          "billing_scheme": "per_unit",
          "created": 1623864151,
          "currency": "usd",
          "interval": "month",
          "interval_count": 1,
          "livemode": false,
          "metadata": {
          },
          "nickname": null,
          "product": "prod_JgPF5xnq7qBun3",
          "tiers": null,
          "tiers_mode": null,
          "transform_usage": null,
          "trial_period_days": null,
          "usage_type": "licensed"
        },
        "price": {
          "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
          "object": "price",
          "active": true,
          "billing_scheme": "per_unit",
          "created": 1623864151,
          "currency": "usd",
          "livemode": false,
          "lookup_key": null,
          "metadata": {
          },
          "nickname": null,
          "product": "prod_JgPF5xnq7qBun3",
          "recurring": {
            "interval": "month",
            "interval_count": 1,
            "trial_period_days": null,
            "usage_type": "licensed"
          },
          "tiers_mode": null,
          "transform_quantity": null,
          "type": "recurring",
          "unit_amount": 2000,
          "unit_amount_decimal": "2000"
        },
        "quantity": 1,
        "subscription": "sub_JgRjFjhKbtD2qz",
        "tax_rates": [

        ]
      }
    ],
    "has_more": false,
    "total_count": 1,
    "url": "/v1/subscription_items?subscription=sub_JgRjFjhKbtD2qz"
  },
  "latest_invoice": {
    "id": "in_1J34pzGPZ1iASj5zB87qdBNZ",
    "object": "invoice",
    "account_country": "US",
    "account_name": "Angelina's Store",
    "account_tax_ids": null,
    "amount_due": 2000,
    "amount_overpaid": 0,
    "amount_paid": 0,
    "amount_remaining": 2000,
    "amount_shipping": 0,
    "attempt_count": 0,
    "attempted": false,
    "auto_advance": false,
    "automatic_tax": {
      "disabled_reason": null,
      "enabled": false,
      "liability": null,
      "status": null
    },
    "automatically_finalizes_at": null,
    "billing_reason": "subscription_update",
    "collection_method": "charge_automatically",
    "created": 1623873347,
    "currency": "usd",
    "custom_fields": null,
    "customer_account": identifier("customerAccount"),
    "customer_address": null,
    "customer_email": "angelina@stripe.com",
    "customer_name": null,
    "customer_phone": null,
    "customer_shipping": {
      "address": {
        "city": "",
        "country": "US",
        "line1": "Berry",
        "line2": "",
        "postal_code": "",
        "state": ""
      },
      "name": "",
      "phone": null
    },
    "customer_tax_exempt": "none",
    "customer_tax_ids": [

    ],
    "default_payment_method": null,
    "default_source": null,
    "default_tax_rates": [

    ],
    "description": null,
    "discounts": [],
    "due_date": null,
    "effective_at": "1623873347",
    "ending_balance": 0,
    "footer": null,
    "from_invoice": null,
    "hosted_invoice_url": "https://invoice.stripe.com/i/acct_1By64KGPZ1iASj5z/invst_JgRjzIOILGeq2MKC9T0KtyXnD5udsLp",
    "invoice_pdf": "https://pay.stripe.com/invoice/acct_1By64KGPZ1iASj5z/invst_JgRjzIOILGeq2MKC9T0KtyXnD5udsLp/pdf",
    "last_finalization_error": null,
    "latest_revision": null,
    "lines": {
      "object": "list",
      "data": [
        {
          "id": "il_1N2CjMBwKQ696a5NeOawRQP2",
          "object": "line_item",
          "amount": 2000,
          "currency": "usd",
          "description": "1 × Gold Special (at $20.00 / month)",
          "discount_amounts": [

          ],
          "discountable": true,
          "discounts": [

          ],
          "invoice": "in_1J34pzGPZ1iASj5zB87qdBNZ",
          "livemode": false,
          "metadata": {
          },
          "parent": {
            "invoice_item_details": null,
            "subscription_item_details":
            {
              "invoice_item": null,
            "proration": false,
            "proration_details":
            {
              "credited_items": null
            },
            "subscription":
            "sub_JgRjFjhKbtD2qz",
            "subscription_item":
              "si_JgRjmS4Ur1khEx"
            },
            "type": "subscription_item_details"
          },
          "period": {
            "end": 1626465347,
            "start": 1623873347
          },
          "plan": {
            "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
            "object": "plan",
            "active": true,
            "amount": 2000,
            "amount_decimal": "2000",
            "billing_scheme": "per_unit",
            "created": 1623864151,
            "currency": "usd",
            "interval": "month",
            "interval_count": 1,
            "livemode": false,
            "metadata": {
            },
            "nickname": null,
            "product": "prod_JgPF5xnq7qBun3",
            "tiers": null,
            "tiers_mode": null,
            "transform_usage": null,
            "trial_period_days": null,
            "usage_type": "licensed"
          },
          "price": {
            "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
            "object": "price",
            "active": true,
            "billing_scheme": "per_unit",
            "created": 1623864151,
            "currency": "usd",
            "livemode": false,
            "lookup_key": null,
            "metadata": {
            },
            "nickname": null,
            "product": "prod_JgPF5xnq7qBun3",
            "recurring": {
              "interval": "month",
              "interval_count": 1,
              "trial_period_days": null,
              "usage_type": "licensed"
            },
            "tiers_mode": null,
            "transform_quantity": null,
            "type": "recurring",
            "unit_amount": 2000,
            "unit_amount_decimal": "2000"
          },
          "quantity": 1,
          "taxes": []
        }
      ],
      "has_more": false,
      "total_count": 1,
      "url": "/v1/invoices/in_1J34pzGPZ1iASj5zB87qdBNZ/lines"
    },
    "livemode": false,
    "metadata": {
    },
    "next_payment_attempt": null,
    "number": "C008FC2-0354",
    "on_behalf_of": null,
    "parent": {
      "quote_details": null,
      "subscription_details": {
        "metadata": {},
        "pause_collection": null,
        "subscription": "sub_JgRjFjhKbtD2qz"
      }
    },
    "payment_intent": {
      "id": "pi_1J34pzGPZ1iASj5zI2nOAaE6",
      "object": "payment_intent",
      "allowed_source_types": [
        "card"
      ],
      "amount": 2000,
      "amount_capturable": 0,
      "amount_received": 0,
      "application": null,
      "application_fee_amount": null,
      "canceled_at": null,
      "cancellation_reason": null,
      "capture_method": "automatic",
      "charges": {
        "object": "list",
        "data": [

        ],
        "has_more": false,
        "total_count": 0,
        "url": "/v1/charges?payment_intent=pi_1J34pzGPZ1iASj5zI2nOAaE6"
      },
      "client_secret": "pi_1J34pzGPZ1iASj5zI2nOAaE6_secret_l7FN6ldFfXiFmJEumenJ2y2wu",
      "confirmation_method": "automatic",
      "created": 1623873347,
      "currency": "usd",
      "customer": "cus_CMqDWO2xODTZqt",
      "description": "Subscription creation",
      "invoice": "in_1J34pzGPZ1iASj5zB87qdBNZ",
      "last_payment_error": null,
      "livemode": false,
      "metadata": {
      },
      "next_action": null,
      "next_source_action": null,
      "on_behalf_of": null,
      "payment_method": null,
      "payment_method_options": {
        "card": {
          "installments": null,
          "network": null,
          "request_three_d_secure": "automatic"
        }
      },
      "payment_method_types": [
        "card"
      ],
      "receipt_email": null,
      "review": null,
      "setup_future_usage": "off_session",
      "shipping": null,
      "source": "card_1By6iQGPZ1iASj5z7ijKBnXJ",
      "statement_descriptor": null,
      "statement_descriptor_suffix": null,
      "status": "requires_confirmation",
      "transfer_data": null,
      "transfer_group": null
    },
    "payment_settings": {
      "payment_method_options": null,
      "payment_method_types": null,
      "save_default_payment_method": "on_subscription"
    },
    "period_end": 1623873347,
    "period_start": 1623873347,
    "post_payment_credit_notes_amount": 0,
    "pre_payment_credit_notes_amount": 0,
    "receipt_number": null,
    "starting_balance": 0,
    "statement_descriptor": null,
    "status": "open",
    "status_transitions": {
      "finalized_at": 1623873347,
      "marked_uncollectible_at": null,
      "paid_at": null,
      "voided_at": null
    },
    "subscription": "sub_JgRjFjhKbtD2qz",
    "subtotal": 2000,
    "tax": null,
    "tax_percent": null,
    "total": 2000,
    "total_discount_amounts": [],
    "total_tax_amounts": [],
    "transfer_data": null,
    "webhooks_delivered_at": 1623873347
  },
  "livemode": false,
  "metadata": {
  },
  "next_pending_invoice_item_invoice": null,
  "pause_collection": null,
  "pending_invoice_item_interval": null,
  "pending_setup_intent": null,
  "pending_update": null,
  "plan": {
    "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
    "object": "plan",
    "active": true,
    "amount": 2000,
    "amount_decimal": "2000",
    "billing_scheme": "per_unit",
    "created": 1623864151,
    "currency": "usd",
    "interval": "month",
    "interval_count": 1,
    "livemode": false,
    "metadata": {
    },
    "nickname": null,
    "product": "prod_JgPF5xnq7qBun3",
    "tiers": null,
    "tiers_mode": null,
    "transform_usage": null,
    "trial_period_days": null,
    "usage_type": "licensed"
  },
  "quantity": 1,
  "schedule": null,
  "start": 1623873347,
  "start_date": 1623873347,
  "status": "incomplete",
  "tax_percent": null,
  "transfer_data": null,
  "trial_end": null,
  "trial_start": null
}
```

#### Customers&nbsp;v1

```json
{"id": "sub_JgRjFjhKbtD2qz",
  "object": "subscription",
  "application_fee_percent": null,
  "automatic_tax": {
    "disabled_reason": null,
    "enabled": false,
    "liability": "null"
  },
  "billing_cycle_anchor": 1623873347,
  "billing_cycle_anchor_config": null,
  "cancel_at": null,
  "cancel_at_period_end": false,
  "canceled_at": null,
  "cancellation_details": {
    "comment": null,
    "feedback": null,
    "reason": null
  },
  "collection_method": "charge_automatically",
  "created": 1623873347,
  "currency": "usd","customer": identifier("customer"),
  "days_until_due": null,
  "default_payment_method": null,
  "default_source": null,
  "default_tax_rates": [

  ],
  "discounts": [],
  "ended_at": null,
  "invoice_customer_balance_settings": {
    "account_tax_ids": null,
    "issuer": {
      "type": "self"
    }
  },
  "items": {
    "object": "list",
    "data": [
      {
        "id": "si_JgRjmS4Ur1khEx",
        "object": "subscription_item",
        "created": 1623873347,"current_period_end": 1626465347,
        "current_period_start": 1623873347,
        "discounts": [],
        "metadata": {
        },
        "plan": {
          "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
          "object": "plan",
          "active": true,
          "amount": 2000,
          "amount_decimal": "2000",
          "billing_scheme": "per_unit",
          "created": 1623864151,
          "currency": "usd",
          "interval": "month",
          "interval_count": 1,
          "livemode": false,
          "metadata": {
          },
          "nickname": null,
          "product": "prod_JgPF5xnq7qBun3",
          "tiers": null,
          "tiers_mode": null,
          "transform_usage": null,
          "trial_period_days": null,
          "usage_type": "licensed"
        },
        "price": {
          "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
          "object": "price",
          "active": true,
          "billing_scheme": "per_unit",
          "created": 1623864151,
          "currency": "usd",
          "livemode": false,
          "lookup_key": null,
          "metadata": {
          },
          "nickname": null,
          "product": "prod_JgPF5xnq7qBun3",
          "recurring": {
            "interval": "month",
            "interval_count": 1,
            "trial_period_days": null,
            "usage_type": "licensed"
          },
          "tiers_mode": null,
          "transform_quantity": null,
          "type": "recurring",
          "unit_amount": 2000,
          "unit_amount_decimal": "2000"
        },
        "quantity": 1,
        "subscription": "sub_JgRjFjhKbtD2qz",
        "tax_rates": [

        ]
      }
    ],
    "has_more": false,
    "total_count": 1,
    "url": "/v1/subscription_items?subscription=sub_JgRjFjhKbtD2qz"
  },
  "latest_invoice": {
    "id": "in_1J34pzGPZ1iASj5zB87qdBNZ",
    "object": "invoice",
    "account_country": "US",
    "account_name": "Angelina's Store",
    "account_tax_ids": null,
    "amount_due": 2000,
    "amount_overpaid": 0,
    "amount_paid": 0,
    "amount_remaining": 2000,
    "amount_shipping": 0,
    "attempt_count": 0,
    "attempted": false,
    "auto_advance": false,
    "automatic_tax": {
      "disabled_reason": null,
      "enabled": false,
      "liability": null,
      "status": null
    },
    "automatically_finalizes_at": null,
    "billing_reason": "subscription_update",
    "collection_method": "charge_automatically",
    "created": 1623873347,
    "currency": "usd",
    "custom_fields": null,
    "customer": identifier("customer"),
    "customer_address": null,
    "customer_email": "angelina@stripe.com",
    "customer_name": null,
    "customer_phone": null,
    "customer_shipping": {
      "address": {
        "city": "",
        "country": "US",
        "line1": "Berry",
        "line2": "",
        "postal_code": "",
        "state": ""
      },
      "name": "",
      "phone": null
    },
    "customer_tax_exempt": "none",
    "customer_tax_ids": [

    ],
    "default_payment_method": null,
    "default_source": null,
    "default_tax_rates": [

    ],
    "description": null,
    "discounts": [],
    "due_date": null,
    "effective_at": "1623873347",
    "ending_balance": 0,
    "footer": null,
    "from_invoice": null,
    "hosted_invoice_url": "https://invoice.stripe.com/i/acct_1By64KGPZ1iASj5z/invst_JgRjzIOILGeq2MKC9T0KtyXnD5udsLp",
    "invoice_pdf": "https://pay.stripe.com/invoice/acct_1By64KGPZ1iASj5z/invst_JgRjzIOILGeq2MKC9T0KtyXnD5udsLp/pdf",
    "last_finalization_error": null,
    "latest_revision": null,
    "lines": {
      "object": "list",
      "data": [
        {
          "id": "il_1N2CjMBwKQ696a5NeOawRQP2",
          "object": "line_item",
          "amount": 2000,
          "currency": "usd",
          "description": "1 × Gold Special (at $20.00 / month)",
          "discount_amounts": [

          ],
          "discountable": true,
          "discounts": [

          ],
          "invoice": "in_1J34pzGPZ1iASj5zB87qdBNZ",
          "livemode": false,
          "metadata": {
          },
          "parent": {
            "invoice_item_details": null,
            "subscription_item_details":
            {
              "invoice_item": null,
            "proration": false,
            "proration_details":
            {
              "credited_items": null
            },
            "subscription":
            "sub_JgRjFjhKbtD2qz",
            "subscription_item":
              "si_JgRjmS4Ur1khEx"
            },
            "type": "subscription_item_details"
          },
          "period": {
            "end": 1626465347,
            "start": 1623873347
          },
          "plan": {
            "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
            "object": "plan",
            "active": true,
            "amount": 2000,
            "amount_decimal": "2000",
            "billing_scheme": "per_unit",
            "created": 1623864151,
            "currency": "usd",
            "interval": "month",
            "interval_count": 1,
            "livemode": false,
            "metadata": {
            },
            "nickname": null,
            "product": "prod_JgPF5xnq7qBun3",
            "tiers": null,
            "tiers_mode": null,
            "transform_usage": null,
            "trial_period_days": null,
            "usage_type": "licensed"
          },
          "price": {
            "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
            "object": "price",
            "active": true,
            "billing_scheme": "per_unit",
            "created": 1623864151,
            "currency": "usd",
            "livemode": false,
            "lookup_key": null,
            "metadata": {
            },
            "nickname": null,
            "product": "prod_JgPF5xnq7qBun3",
            "recurring": {
              "interval": "month",
              "interval_count": 1,
              "trial_period_days": null,
              "usage_type": "licensed"
            },
            "tiers_mode": null,
            "transform_quantity": null,
            "type": "recurring",
            "unit_amount": 2000,
            "unit_amount_decimal": "2000"
          },
          "quantity": 1,
          "taxes": []
        }
      ],
      "has_more": false,
      "total_count": 1,
      "url": "/v1/invoices/in_1J34pzGPZ1iASj5zB87qdBNZ/lines"
    },
    "livemode": false,
    "metadata": {
    },
    "next_payment_attempt": null,
    "number": "C008FC2-0354",
    "on_behalf_of": null,
    "parent": {
      "quote_details": null,
      "subscription_details": {
        "metadata": {},
        "pause_collection": null,
        "subscription": "sub_JgRjFjhKbtD2qz"
      }
    },
    "payment_intent": {
      "id": "pi_1J34pzGPZ1iASj5zI2nOAaE6",
      "object": "payment_intent",
      "allowed_source_types": [
        "card"
      ],
      "amount": 2000,
      "amount_capturable": 0,
      "amount_received": 0,
      "application": null,
      "application_fee_amount": null,
      "canceled_at": null,
      "cancellation_reason": null,
      "capture_method": "automatic",
      "charges": {
        "object": "list",
        "data": [

        ],
        "has_more": false,
        "total_count": 0,
        "url": "/v1/charges?payment_intent=pi_1J34pzGPZ1iASj5zI2nOAaE6"
      },
      "client_secret": "pi_1J34pzGPZ1iASj5zI2nOAaE6_secret_l7FN6ldFfXiFmJEumenJ2y2wu",
      "confirmation_method": "automatic",
      "created": 1623873347,
      "currency": "usd",
      "customer": "cus_CMqDWO2xODTZqt",
      "description": "Subscription creation",
      "invoice": "in_1J34pzGPZ1iASj5zB87qdBNZ",
      "last_payment_error": null,
      "livemode": false,
      "metadata": {
      },
      "next_action": null,
      "next_source_action": null,
      "on_behalf_of": null,
      "payment_method": null,
      "payment_method_options": {
        "card": {
          "installments": null,
          "network": null,
          "request_three_d_secure": "automatic"
        }
      },
      "payment_method_types": [
        "card"
      ],
      "receipt_email": null,
      "review": null,
      "setup_future_usage": "off_session",
      "shipping": null,
      "source": "card_1By6iQGPZ1iASj5z7ijKBnXJ",
      "statement_descriptor": null,
      "statement_descriptor_suffix": null,
      "status": "requires_confirmation",
      "transfer_data": null,
      "transfer_group": null
    },
    "payment_settings": {
      "payment_method_options": null,
      "payment_method_types": null,
      "save_default_payment_method": "on_subscription"
    },
    "period_end": 1623873347,
    "period_start": 1623873347,
    "post_payment_credit_notes_amount": 0,
    "pre_payment_credit_notes_amount": 0,
    "receipt_number": null,
    "starting_balance": 0,
    "statement_descriptor": null,
    "status": "open",
    "status_transitions": {
      "finalized_at": 1623873347,
      "marked_uncollectible_at": null,
      "paid_at": null,
      "voided_at": null
    },
    "subscription": "sub_JgRjFjhKbtD2qz",
    "subtotal": 2000,
    "tax": null,
    "tax_percent": null,
    "total": 2000,
    "total_discount_amounts": [],
    "total_tax_amounts": [],
    "transfer_data": null,
    "webhooks_delivered_at": 1623873347
  },
  "livemode": false,
  "metadata": {
  },
  "next_pending_invoice_item_invoice": null,
  "pause_collection": null,
  "pending_invoice_item_interval": null,
  "pending_setup_intent": null,
  "pending_update": null,
  "plan": {
    "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
    "object": "plan",
    "active": true,
    "amount": 2000,
    "amount_decimal": "2000",
    "billing_scheme": "per_unit",
    "created": 1623864151,
    "currency": "usd",
    "interval": "month",
    "interval_count": 1,
    "livemode": false,
    "metadata": {
    },
    "nickname": null,
    "product": "prod_JgPF5xnq7qBun3",
    "tiers": null,
    "tiers_mode": null,
    "transform_usage": null,
    "trial_period_days": null,
    "usage_type": "licensed"
  },
  "quantity": 1,
  "schedule": null,
  "start": 1623873347,
  "start_date": 1623873347,
  "status": "incomplete",
  "tax_percent": null,
  "transfer_data": null,
  "trial_end": null,
  "trial_start": null
}
```

### Aktualisieren Sie Ihren Server-Endpoint

Fügen Sie die Erstellung eines temporären Schlüssels zum Abonnement-Endpoint hinzu und geben Sie ihn in der Antwort zurück:

#### Accounts&nbsp;v2

#### Ruby

```ruby
ephemeral_key = Stripe::EphemeralKey.create(
  {customer_account: customer_account_id},
  {stripe_version: '2026-03-25.dahlia'}
)

{
  subscriptionId: subscription.id,
  clientSecret: subscription.latest_invoice.confirmation_secret.client_secret,
  ephemeralKey: ephemeral_key.secret,
  customerAccountId: customer_account_id,
}.to_json
```

#### Customers&nbsp;v1

#### Ruby

```ruby
ephemeral_key = client.v1.ephemeral_keys.create(
  {customer: customer_id},
  {stripe_version: '2025-06-30.basil'}
)

{
  subscriptionId: subscription.id,
  clientSecret: subscription.latest_invoice.confirmation_secret.client_secret,
  ephemeralKey: ephemeral_key.secret,
  customerId: customer_id,
}.to_json
```

### Aktualisieren Sie Ihr Antwortmodell

#### Accounts&nbsp;v2

```kotlin
data class SubscriptionsResponse(
    val subscriptionId: String,
    val clientSecret: String,
    val ephemeralKey: String,
    val customerAccountId: String
)
```

#### Customers&nbsp;v1

```kotlin
data class SubscriptionsResponse(
    val subscriptionId: String,
    val clientSecret: String,
    val ephemeralKey: String,
    val customerId: String
)
```

### Übergeben Sie die Kundenkonfiguration an PaymentSheet

#### Accounts&nbsp;v2

Fügen Sie beim Konfigurieren von PaymentSheet Folgendes hinzu:

```kotlin
PaymentSheet.Configuration(
    primaryButtonLabel = "Subscribe for $15/month",
    merchantDisplayName = "My merchant name",
    customerAccount = PaymentSheet.CustomerConfiguration(
        id = customerAccountId,
        ephemeralKeySecret = ephemeralKey
    )
)
```

#### Customers&nbsp;v1

Fügen Sie beim Konfigurieren von PaymentSheet Folgendes hinzu:

```kotlin
PaymentSheet.Configuration(
    primaryButtonLabel = "Subscribe for $15/month",
    merchantDisplayName = "My merchant name",
    customer = PaymentSheet.CustomerConfiguration(
        id = customerId,
        ephemeralKeySecret = ephemeralKey
    )
)
```

## Zahlungsinformationen erfassen [Client]

Verwenden Sie das [Payment Sheet](https://docs.stripe.com/payments/mobile/payment-sheet.md) zum Erfassen von Zahlungsdetails und Aktivieren des Abos. Sie können Elements an das Erscheinungsbild Ihrer Anmeldung anpassen.

Mit dem Payment Sheet können Sie alle notwendigen Zahlungsdetails für eine Vielzahl von Zahlungsmethoden sicher erheben. Erfahren Sie mehr über die [unterstützten Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/payment-method-support.md#product-support) für Payment Sheet und Subscriptions.

### Payment Element zu Ihrer App hinzufügen

> Dieser Schritt zeigt eine Möglichkeit zu starten. Sie können jedoch jede [In-App-Zahlungsintegration](https://docs.stripe.com/payments/mobile.md) verwenden.

Initialisieren und präsentieren Sie das Mobile Payment Element mit der PaymentSheet-Klasse.

```kotlin
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import com.stripe.android.paymentsheet.PaymentSheet
import com.stripe.android.paymentsheet.PaymentSheetResult
import com.stripe.android.paymentsheet.rememberPaymentSheet

@Composable
fun SubscribeView(clientSecret: String) {
    val paymentSheet = rememberPaymentSheet(::onPaymentSheetResult)

    Button(onClick = {
        paymentSheet.presentWithPaymentIntent(
            clientSecret, PaymentSheet.Configuration(
                primaryButtonLabel = "Subscribe for $15/month",
                merchantDisplayName = "My merchant name",
                // Set `allowsDelayedPaymentMethods` to true if your business handles
                // delayed notification payment methods like US bank accounts.
                allowsDelayedPaymentMethods = true
            )
        )
    }) {
        Text(text = "Subscribe")
    }
}

fun onPaymentSheetResult(paymentSheetResult: PaymentSheetResult) {
    when (paymentSheetResult) {
        is PaymentSheetResult.Canceled -> {
            print("Canceled")
        }

        is PaymentSheetResult.Failed -> {
            print("Error: ${paymentSheetResult.error}")
        }

        is PaymentSheetResult.Completed -> {
            // Display for example, an order confirmation screen
            print("Completed")
        }
    }
}
```

Das Mobile Payment Element stellt ein Formular dar, mit dem Ihre Kundinnen und Kunden eine Zahlungsmethode auswählen können. Das Formular erfasst automatisch alle notwendigen Zahlungsdetails für die ausgewählte Zahlungsmethode.

Wenn Sie `allowsDelayedPaymentMethods` auf true festlegen, werden Zahlungsmethoden mit [verzögerter Benachrichtigung](https://docs.stripe.com/payments/payment-methods.md#payment-notification) wie US-Bankkonten zugelassen. Für diese Zahlungsmethoden ist der endgültige Zahlungsstatus nicht bekannt, wenn das `PaymentSheet` abgeschlossen wird. Stattdessen ist sie erfolgreich oder schlägt fehl. Wenn Sie diese Art von Zahlungsmethoden unterstützen, informieren Sie den Kunden/die Kundin darüber, dass seine/ihre Bestellung bestätigt ist, und führen seine/ihre Bestellung erst aus (z. B. das Produkt versenden), wenn die Zahlung erfolgreich ist.

Sie können das Payment Element an das Design Ihrer App anpassen, indem Sie die Eigenschaft [`Erscheinungsbild` ](https://docs.stripe.com/elements/appearance-api/mobile.md?platform=ios) auf Ihr `PaymentSheet.Configuration`-Objekt anwenden.

### Zahlung bestätigen

Das Mobile Payment Element erstellt eine PaymentMethod und bestätigt den ersten PaymentIntent des unvollständigen Abonnements, wodurch eine Zahlung ausgeführt wird. Wenn die Zahlung die *starke Kundenauthentifizierung* (Strong Customer Authentication (SCA) is a regulatory requirement in effect as of September 14, 2019, that impacts many European online payments. It requires customers to use two-factor authentication like 3D Secure to verify their purchase) (SCA) erfordert, übernimmt das Payment Element den Authentifizierungsprozess, bevor der PaymentIntent bestätigt wird.

## Webhooks überwachen [Server]

Um Ihre Integration abzuschließen, müssen Sie von Stripe gesendete *Webhooks* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) verarbeiten. Dies sind Ereignisse, die ausgelöst werden, wenn sich ein Status innerhalb von Stripe ändert, z.&nbsp;B. wenn Abonnements neue Rechnungen erstellen. Richten Sie in Ihrer Anwendung einen HTTP-Handler ein, um eine POST-Anfrage mit dem Webhook-Ereignis zu akzeptieren und verifizieren Sie die Signatur des Ereignisses.

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/webhook' do
  # You can use webhooks to receive information about asynchronous payment events.
  # For more about our webhook events check out https://stripe.com/docs/webhooks.
  webhook_secret = ENV['STRIPE_WEBHOOK_SECRET']
  payload = request.body.read
  if !webhook_secret.empty?
    # Retrieve the event by verifying the signature using the raw body and secret if webhook signing is configured.
    sig_header = request.env['HTTP_STRIPE_SIGNATURE']
    event = nil

    begin
      event = Stripe::Webhook.construct_event(
        payload, sig_header, webhook_secret
      )
    rescue JSON::ParserError => e
      # Invalid payload
      status 400
      return
    rescue Stripe::SignatureVerificationError => e
      # Invalid signature
      puts '⚠️  Webhook signature verification failed.'
      status 400
      return
    end
  else
    data = JSON.parse(payload, symbolize_names: true)
    event = Stripe::Event.construct_from(data)
  end
  # Get the type of webhook event sent - used to check the status of PaymentIntents.
  event_type = event['type']
  data = event['data']
  data_object = data['object']

  if event_type == 'invoice.paid'
    # Used to provision services after the trial has ended.
    # The status of the invoice will show up as paid. Store the status in your
    # database to reference when a user accesses your service to avoid hitting rate
    # limits.
    # puts data_object
  end

  if event_type == 'invoice.payment_failed'
    # If the payment fails or the customer does not have a valid payment method,
    # an invoice.payment_failed event is sent, the subscription becomes past_due.
    # Use this webhook to notify your user that their payment has
    # failed and to retrieve new card details.
    # puts data_object
  end

  if event_type == 'customer.subscription.deleted'
    # handle subscription canceled automatically based
    # upon your subscription settings. Or if the user cancels it.
    # puts data_object
  end

  content_type 'application/json'
  { status: 'success' }.to_json
end
```

Verwenden Sie während der Entwicklung die Stripe-CLI, um [Webhooks zu beobachten und an Ihre Anwendung weiterzuleiten](https://docs.stripe.com/webhooks.md#test-webhook). Führen Sie Folgendes in einem neuen Datenterminal aus, während Ihre Entwicklungs-App ausgeführt wird:

#### curl

```bash
  stripe listen --forward-to localhost:4242/webhook
```

Für die Produktionsphase können Sie eine Webhook-Endpoint-URL über das Dashboard oder mit der [Webhook Endpoints API](https://docs.stripe.com/api/webhook_endpoints.md) einrichten.

Sie müssen auf einige Ereignisse achten, um die restlichen Schritte in diesem Leitfaden ausführen zu können. Unter [Abonnements-Ereignissen](https://docs.stripe.com/billing/subscriptions/webhooks.md#events) finden Sie weitere Einzelheiten zu abonnementspezifischen Webhooks.

## Zugang zu Ihrer Dienstleistung bereitstellen [Client und Server]

Nachdem das Abo nun aktiv ist, gewähren Sie Ihren Nutzer/innen Zugriff auf Ihren Dienst. Überwachen Sie dazu die Ereignisse `customer.subscription.created`, `customer.subscription.updated` und `customer.subscription.deleted`. Diese Ereignisse übergeben ein Abo-Objekt, das ein `status`-Feld enthält, das anzeigt, ob das Abo aktiv oder überfällig ist oder gekündigt wurde. Eine vollständige Statusliste finden Sie unter [Abonnementlebenszyklus](https://docs.stripe.com/billing/subscriptions/overview.md#subscription-lifecycle).

In Ihrem Webhook-Handler:

1. Überprüfen Sie den Abo-Status. Wenn er `active` lautet, hat Ihr/e Nutzer/in für Ihr Produkt bezahlt.
1. Überprüfen Sie das Produkt, das die Kundin/der Kunde abonniert hat, und gewähren Sie Zugang zu Ihrer Dienstleistung. Bei der Überprüfung des Produkts sind Sie im Vergleich zur Überprüfung des Preises flexibler, falls Sie den Preis oder das Abrechnungsintervall ändern müssen.
1. Speichern Sie `product.id`, `subscription.id` und `subscription.status` in Ihrer Datenbank zusammen mit der bereits gespeicherten `customer.id`. Überprüfen Sie diesen Datensatz, wenn Sie entscheiden, welche Funktionen für die Nutzer/innen Ihrer Anwendung aktiviert werden sollen.

Der Status eines Abonnements kann sich während seiner Laufzeit jederzeit ändern, auch wenn Ihre Anwendung Stripe nicht direkt aufruft. Beispielsweise kann eine Verlängerung aufgrund einer abgelaufenen Kreditkarte fehlschlagen, wodurch das Abonnement in einen überfälligen Status versetzt wird. Oder wenn Sie das[Kundenportal](https://docs.stripe.com/customer-management.md) implementieren, können Nutzer/innen ihr Abonnement kündigen, ohne Ihre Anwendung direkt aufzurufen. Durch die korrekte Implementierung Ihres Handlers wird der Anwendungsstatus mit Stripe synchronisiert.

## Abonnement kündigen [Client und Server]

Es ist gängige Praxis, dass Kundinnen/Kunden ihr Abonnement selbst kündigen können. In diesem Beispiel wird zur Seite mit den Kontoeinstellungen eine Kündigungsoption hinzugefügt.

In diesem Beispiel wird die Abonnement-ID im Frontend erfasst. Im Produktionsbetrieb kann Ihre Anwendung diese Information für Ihre angemeldeten Nutzer/innen aus Ihrer Datenbank abrufen.
![Beispiel für eine Benutzeroberfläche zur Kündigung eines Abonnements.](https://b.stripecdn.com/docs-statics-srv/assets/fixed-price-subscriptions-guide-account-settings.6559626ba4b434826a67abfea165e097.png)

Kontoeinstellungen mit der Option, das Abonnement zu kündigen

```kotlin
fun cancelSubscription(subscriptionId: String): SubscriptionResponse? {
    val body = JSONObject().put("subscriptionId", subscriptionId).toString()
        .toRequestBody("application/json".toMediaType())
    val request =
        Request.Builder().url("http://10.0.2.2:4567/cancel-subscription").post(body).build()
    OkHttpClient().newCall(request).execute().use { response ->
        if (response.isSuccessful) {
            return Gson().fromJson(response.body!!.string(), SubscriptionResponse::class.java)
        }
    }
    return null
}
```

Definieren Sie im Backend den Endpoint für den Aufruf durch Ihre App.

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/cancel-subscription' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  deleted_subscription = client.v1.subscriptions.cancel(data['subscriptionId'])

  deleted_subscription.to_json
end
```

Ihr Backend erhält ein Ereignis vom Typ `customer.subscription.deleted`.

Aktualisieren Sie nach der Kündigung des Abonnements Ihre Datenbank, um die zuvor gespeicherte Stripe-Abonnement-ID zu entfernen, und schränken Sie den Zugang zu Ihrer Dienstleistung ein.

Wenn ein Abonnement gekündigt wurde, kann es nicht reaktiviert werden. Sie müssen stattdessen die aktualisierten Rechnungsinformationen von Ihrer Kundinnen/Kunden erfassen, deren Standard-Zahlungsmethode aktualisieren und ein neues Abonnement für den bestehenden Kundendatensatz erstellen.

## Integration testen

### Zahlungsmethoden testen

Verwenden Sie die folgende Tabelle, um verschiedene Zahlungsmethoden und -szenarien zu testen.

| Zahlungsmethode  | Szenario                                                                                                                                                                                                                                                                                                           | So führen Sie den Test durch                                                                                                                                                                                          |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| BECS-Lastschrift | Ihr/e Kund/in zahlt erfolgreich mit dem BECS-Lastschriftverfahren.                                                                                                                                                                                                                                                 | Füllen Sie das Formular mit der Kontonummer `900123456` und BSB `000000` aus. Der bestätigte PaymentIntent geht zunächst in den Status `processing` über und dann drei&nbsp;Minuten später in den Status `succeeded`. |
| BECS-Lastschrift | Die Zahlung Ihres/Ihrer Kund/in schlägt fehl mit Code `account_closed` fehl.                                                                                                                                                                                                                                       | Füllen Sie das Formular mit der Kontonummer `111111113` und BSB `000000` aus.                                                                                                                                         |
| Kreditkarte      | Die Kartenzahlung ist erfolgreich, und es ist keine Authentifizierung erforderlich.                                                                                                                                                                                                                                | Füllen Sie das Kreditkartenformular aus und geben Sie die Kreditkartennummer `4242 4242 4242 4242` mit beliebiger Gültigkeitsdauer, CVC und Postleitzahl an.                                                          |
| Kreditkarte      | Für die Kartenzahlung ist eine *Authentifizierung* (Strong Customer Authentication (SCA) is a regulatory requirement in effect as of September 14, 2019, that impacts many European online payments. It requires customers to use two-factor authentication like 3D Secure to verify their purchase) erforderlich. | Füllen Sie das Kreditkartenformular aus und geben Sie die Kreditkartennummer `4000 0025 0000 3155` mit beliebiger Gültigkeitsdauer, CVC und Postleitzahl an.                                                          |
| Kreditkarte      | Die Karte wird mit einem Ablehnungscode wie `insufficient_funds` abgelehnt.                                                                                                                                                                                                                                        | Füllen Sie das Kreditkartenformular aus und geben Sie die Kreditkartennummer `4000 0000 0000 9995` mit beliebiger Gültigkeitsdauer, CVC und Postleitzahl an.                                                          |
| SEPA-Lastschrift | Ihr/e Kund/in zahlt erfolgreich mit dem SEPA-Lastschriftverfahren.                                                                                                                                                                                                                                                 | Füllen Sie das Formular mit der Kontonummer `AT321904300235473204` aus. Die bestätigte PaymentIntent geht zunächst in den Status „wird verarbeitet“ und dann drei Minuten später in den Status „erfolgreich“ über.    |
| SEPA-Lastschrift | Der Status der PaymentIntent Ihrer Kundin/Ihre Kundin wechselt von `processing` zu `requires_payment_method`.                                                                                                                                                                                                      | Füllen Sie das Formular mit der Kontonummer `AT861904300235473202` aus.                                                                                                                                               |

### Ereignisse überwachen

Richten Sie Webhooks ein, um Abonnementänderungsereignisse wie Upgrades und Kündigungen zu überwachen. Erfahren Sie mehr über [Abonnement-Webhooks](https://docs.stripe.com/billing/subscriptions/webhooks.md). Sie können Ereignisse im [Dashboard](https://dashboard.stripe.com/test/events) oder mit der [Stripe-CLI](https://docs.stripe.com/webhooks.md#test-webhook) anzeigen.

Weitere Informationen finden Sie unter [Billing-Integration testen](https://docs.stripe.com/billing/testing.md).

## Optional: Planänderungen auf Kundenseite zulassen [Client und Server]

Damit Ihre Kundinnen/Kunden ihr Abonnement selbst ändern können, erfassen Sie die Preis-ID der Option, zu der gewechselt werden soll. Übermitteln Sie dann die neue Preis-ID von der App an einen Backend-Endpoint. In diesem Beispiel wird auch die Abonnement-ID übergeben, Sie können diese jedoch für Ihre angemeldeten Nutzer/innen aus Ihrer Datenbank abrufen.

```kotlin
fun updateSubscription(subscriptionId: String, priceId: String): SubscriptionResponse? {
    val body = JSONObject()
        .put("priceId", priceId)
        .put("subscriptionId", subscriptionId).toString()
        .toRequestBody("application/json".toMediaType())
    val request =
        Request.Builder().url("http://10.0.2.2:4567/update-subscription").post(body).build()
    OkHttpClient().newCall(request).execute().use { response ->
        if (response.isSuccessful) {
            // It should include the client_secret, as discussed below.
            return Gson().fromJson(response.body!!.string(), SubscriptionResponse::class.java)
        }
    }
    return null
}
```

Definieren Sie im Backend den Endpoint für den Aufruf durch Ihr Frontend und übergeben Sie dabei die Abonnement-ID und die neue Preis-ID. Für das Abonnement gilt jetzt der Premium-Plan zum Preis von 15&nbsp;USD pro Monat anstelle des Basic-Plans zum Preis von 5&nbsp;USD pro Monat.

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/update-subscription' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  subscription = client.v1.subscriptions.retrieve(data['subscriptionId'])

  updated_subscription =
    client.v1.subscriptions.update(
      data['subscriptionId'],
      cancel_at_period_end: false,
      items: [
        { id: subscription.items.data[0].id, price: data['newPriceId'] }
      ]
    )

  updated_subscription.to_json
end
```

Ihre Anwendung erhält ein Ereignis vom Typ `customer.subscription.updated`.

## Optional: Vorschau einer Preisänderung anzeigen [Client und Server]

Bei Änderungen eines Abonnements durch Kundinnen/Kunden wird häufig der geschuldete Betrag angepasst. Diese Anpassung wird als [anteilsmäßige Verrechnung](https://docs.stripe.com/billing/subscriptions/prorations.md) bezeichnet. Mithilfe des [Endpoints zum Erstellen einer Rechnungsvorschau](https://docs.stripe.com/api/invoices/create_preview.md) können Sie Ihren Kundinnen und Kunden den angepassten Betrag anzeigen.

Übergeben Sie in der App die Rechnungsvorschau an einen Backend-Endpoint.

```kotlin
fun createPreviewInvoice(
    subscriptionId: String,
    priceId: String,
    newPriceId: String
): InvoiceResponse? {
    val body = JSONObject()
        .put("priceId", priceId)
        .put("subscriptionId", subscriptionId)
        .put("newPriceId", newPriceId).toString()
        .toRequestBody("application/json".toMediaType())
    val request =
        Request.Builder().url("http://10.0.2.2:4567/create-preview-invoice").post(body).build()
    OkHttpClient().newCall(request).execute().use { response ->
        if (response.isSuccessful) {
            // InvoiceResponse is a data class conforming to the expected response from your backend
            return Gson().fromJson(response.body!!.string(), InvoiceResponse::class.java)
        }
    }
    return null
}
```

Definieren Sie im Backend den Endpoint für den Aufruf durch Ihr Frontend.

#### Accounts&nbsp;v2

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/create-preview-invoice' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  subscription = Stripe::Subscription.retrieve(data['subscriptionId'])

  invoice =
    Stripe::Invoice.create_preview(
      customer_account: data['customerAccountId'],
      subscription: data['subscriptionId'],
      subscription_details: {
        items: [
          { id: subscription.items.data[0].id, deleted: true },
          { price: data['newPriceId'], deleted: false }
        ]
      }
    )

  invoice.to_json
end
```

#### Customers&nbsp;v1

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/create-preview-invoice' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  subscription = client.v1.subscriptions.retrieve(data['subscriptionId'])

  invoice =
    client.v1.invoices.create_preview(
      customer: data['customerId'],
      subscription: data['subscriptionId'],
      subscription_details: {
        items: [
          { id: subscription.items.data[0].id, deleted: true },
          { price: data['newPriceId'], deleted: false }
        ]
      }
    )

  invoice.to_json
end
```

## Optional: Zahlungsmethode der Kundin/des Kunden anzeigen [Client und Server]

Wenn der Kartenaussteller und die letzten vier Ziffern der Karte angezeigt werden, wissen Kundinnen/Kunden eher, welche Karte belastet wird, und können gegebenenfalls die Zahlungsmethode aktualisieren.

Senden Sie im Fronend die ID der Zahlungsmethode an einen Backend-Endpoint, der die Details zur Zahlungsmethode abruft.

```kotlin
fun retrieveCustomerPaymentMethod(paymentMethodId: String): PaymentMethodResponse? {
    val body = JSONObject()
        .put("paymentMethodId", paymentMethodId).toString()
        .toRequestBody("application/json".toMediaType())
    val request =
        Request.Builder().url("http://10.0.2.2:4567/retrieve-customer-payment-method").post(body)
            .build()
    OkHttpClient().newCall(request).execute().use { response ->
        if (response.isSuccessful) {
            // PaymentMethodResponse is a data class conforming to the expected response from your backend
            return Gson().fromJson(response.body!!.string(), PaymentMethodResponse::class.java)
        }
    }
    return null
}
```

Definieren Sie im Backend den Endpoint für den Aufruf durch Ihre App.

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/retrieve-customer-payment-method' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  payment_method = client.v1.payment_methods.retrieve(data['paymentMethodId'])

  payment_method.to_json
end
```

Beispielantwort:

```json
{
  "id": "pm_1GcbHY2eZvKYlo2CoqlVxo42",
  "object": "payment_method",
  "billing_details": {
    "address": {
      "city": null,
      "country": null,
      "line1": null,
      "line2": null,
      "postal_code": null,
      "state": null
    },
    "email": null,
    "name": null,
    "phone": null
  },
  "card": {
    "brand": "visa",
    "checks": {
      "address_line1_check": null,
      "address_postal_code_check": null,
      "cvc_check": "pass"
    },
    "country": "US",
    "exp_month": 8,
    "exp_year": 2021,
    "fingerprint": "Xt5EWLLDS7FJjR1c",
    "funding": "credit",
    "generated_from": null,
    "last4": "4242",
    "three_d_secure_usage": {
      "supported": true
    },
    "wallet": null
  },
  "created": 1588010536,
  "customer": "cus_HAxB7dVQxhoKLh",
  "livemode": false,
  "metadata": {},
  "type": "card"
}
```

> Wir empfehlen, die `paymentMethod.id` und die `last4` in Ihrer Datenbank zu speichern (zum Beispiel `paymentMethod.id` als `stripeCustomerPaymentMethodId` in Ihrer Auflistung oder Tabelle für `users`). Optional können Sie je nach Bedarf `exp_month`, `exp_year`, `fingerprint` und `billing_details` speichern. Dadurch können Sie die Anzahl der Aufrufe an Stripe begrenzen, um sowohl die Leistung zu steigern als auch eventuelle Ratenbegrenzungen zu vermeiden.

## Stripe Ihren Kundinnen/Kunden anzeigen

Stripe erfasst Informationen über Kundeninteraktionen mit Elements , um Ihnen Dienste bereitzustellen, Betrug vorzubeugen und seine Dienste zu verbessern. Dies umfasst auch die Verwendung von Cookies und IP-Adressen, um zu ermitteln, welche Elements ein/e Kund/in während einer einzelnen Checkout-Sitzung gesehen hat. Sie sind dafür verantwortlich, alle Rechte und Zustimmungen offenzulegen und einzuholen, die Stripe benötigen, um Ihre Daten auf diese Weise zu nutzen. Weitere Informationen finden Sie in unserem [Datenschutzcenter](https://stripe.com/legal/privacy-center#as-a-business-user-what-notice-do-i-provide-to-my-end-customers-about-stripe).

#### React Native

Erfahren Sie, wie Sie Abos mit festem Preis *verkaufen* (A Subscription represents the product details associated with the plan that your customer subscribes to. Allows you to charge the customer on a recurring basis). Sie verwenden das [Mobile Payment Element](https://docs.stripe.com/payments/accept-a-payment.md), um ein benutzerdefiniertes Zahlungsformular zu erstellen, das Sie in Ihre App einbetten.
![Seite für Festpreisabonnements mit Mobile Payment Element](https://b.stripecdn.com/docs-statics-srv/assets/fixed-price-collect-payment-details-mobile.b11cdc8fa8952d753238df4df3375fa6.png)

> Wenn Sie digitale Produkte oder Dienstleistungen verkaufen, die in Ihrer App verwendet werden (zum Beispiel Abonnements, In-Game-Währungen, Level in einem Spiel, Zugriff auf Premium-Inhalte oder das Freischalten einer Vollversion), müssen Sie die In-App-Kauf-APIs von Apple nutzen. Einige Verkäufe sind von dieser Regel ausgenommen, darunter persönliche Dienste an Einzelpersonen und [Apps in bestimmten Regionen](https://support.stripe.com/questions/changes-to-mobile-app-store-rules). Weitere Informationen finden Sie in [den Überprüfungsrichtlinien des App Store](https://developer.apple.com/app-store/review/guidelines/#payments).

## Abonnement erstellen

Dieser Leitfaden bietet Informationen zu den folgenden Vorgehensweisen:

- Modellieren Sie Ihr Unternehmen, indem Sie einen Produktkatalog erstellen.
- Erstellen Sie einen Registrierungsprozess, um Kundinnen/Kunden hinzuzufügen.
- Abonnements erstellen und Zahlungsinformationen erfassen.
- Den Status von Zahlungen und Abonnements testen und überwachen.
- Kundinnen/Kunden ihren Plan ändern oder das Abonnement kündigen lassen.
- Erfahren Sie, wie Sie mit dem [flexiblen Abrechnungsmodus](https://docs.stripe.com/billing/subscriptions/billing-mode.md) von einem verbesserten Abrechnungsverhalten profitieren und auf zusätzliche Funktionen zugreifen können.

## So modellieren Sie das Abonnement bei Stripe

[Subscriptions](https://docs.stripe.com/api/subscriptions.md) vereinfachen Ihre Billing, indem sie automatisch *Rechnungen* (Invoices are statements of amounts owed by a customer. They track the status of payments from draft through paid or otherwise finalized. Subscriptions automatically generate invoices, or you can manually create a one-off invoice) und [PaymentIntents](https://docs.stripe.com/api/payment_intents.md) für Sie erstellen. Um ein Abo zu erstellen und zu aktivieren, müssen Sie zunächst ein *Produkt* (Products represent what your business sells—whether that's a good or a service) erstellen, um das verkaufte Produkt zu modellieren, sowie einen *Preis* (Prices define how much and how often to charge for products. This includes how much the product costs, what currency to use, and the interval if the price is for subscriptions), der das Intervall und den zu berechnenden Betrag festlegt. Außerdem benötigen Sie entweder ein vom Kunden oder von der Kundin konfiguriertes `Konto`-Objekt oder ein `Kunden`-Objekt, um die *Zahlungsmethoden* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs) zu speichern, die für die einzelnen wiederkehrenden Zahlungen verwendet werden.

#### Accounts&nbsp;v2
Ein Diagramm, das gängige Abrechnungsobjekte und ihre Beziehungen veranschaulicht (See full diagram at https://docs.stripe.com/billing/subscriptions/build-subscriptions)
#### Customer&nbsp;v1
Ein Diagramm, das gängige Abrechnungsobjekte und ihre Beziehungen veranschaulicht (See full diagram at https://docs.stripe.com/billing/subscriptions/build-subscriptions)
### API-Objekt-Definitionen

| Ressource                                                                                                                                 | Definition                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| ----------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Als Kunde/Kundin konfiguriertes Konto](https://docs.stripe.com/api/v2/core/accounts/create.md#v2_create_accounts-configuration-customer) | Stellt in der Accounts v2 API eine Kundin/einen Kunden dar, die/der ein Abonnement erwirbt. Konfigurieren Sie ein `Account`-Objekt als Kundin/Kunde und verknüpfen Sie es mit einem Abonnement, um wiederkehrende Zahlungen zu erheben und nachzuverfolgen sowie die abonnierten Produkte zu verwalten. Weitere Informationen finden Sie im [Leitfaden zur Verwendung von Accounts als Kundin/Kunde](https://docs.stripe.com/connect/use-accounts-as-customers.md).                                                                                     |
| [Kundin/Kunde](https://docs.stripe.com/api/customers.md)                                                                                  | Stellt eine Kundin/einen Kundin in der Customers API dar, die/der ein Abonnement erwirbt. Verwenden Sie das mit einem Abonnement verknüpfte `Customer`-Objekt, um wiederkehrende Zahlungen durchzuführen und zu verfolgen und die abonnierten Produkte zu verwalten.                                                                                                                                                                                                                                                                                    |
| [Berechtigung](https://docs.stripe.com/api/entitlements/active-entitlement.md)                                                            | Stellt den Zugriff eines Kunden/einer Kundin auf eine Funktion dar, die in einem Dienstleistungsprodukt enthalten ist, das er/sie abonniert hat. Wenn Sie ein Abonnement für den wiederkehrenden Kauf eines Produkts durch einen Kunden/eine Kundin erstellen, wird automatisch eine aktive Berechtigung für jede diesem Produkt zugeordnete Funktion erstellt. Wenn ein Kunde/eine Kundin auf Ihre Dienstleistungen zugreift, verwenden Sie seine/ihre aktiven Berechtigungen, um die in seinem/ihrem Abonnement enthaltenen Funktionen zu aktivieren. |
| [Funktion](https://docs.stripe.com/api/entitlements/feature.md)                                                                           | Stellt eine Funktion oder Fähigkeit dar, auf die Ihre Kundinnen und Kunden zugreifen können, wenn sie ein Dienstleistungsprodukt abonnieren. Sie können Funktionen in ein Produkt einfügen, indem Sie ProductFeatures erstellen.                                                                                                                                                                                                                                                                                                                        |
| [Rechnung](https://docs.stripe.com/api/invoices.md)                                                                                       | Eine Aufstellung der Beträge, die ein Kunde/eine Kundin schuldet, die den Zahlungsstatus vom Entwurf bis zur Bezahlung oder anderweitigem Abschluss verfolgt. Bei Abonnements werden automatisch Rechnungen erstellt.                                                                                                                                                                                                                                                                                                                                   |
| [PaymentIntent](https://docs.stripe.com/api/payment_intents.md)                                                                           | Eine Möglichkeit zum Erstellen dynamischer Zahlungsabläufe. Mit einem PaymentIntent wird der Lebenszyklus der Bezahlvorgänge von Kundinnen/Kunden verfolgt, und es werden zusätzliche Authentifizierungsschritte ausgelöst, wenn dies aufgrund von gesetzlichen Vorschriften, nutzerdefinierten Radar-Betrugsregeln oder auf Weiterleitung basierenden Zahlungsmethoden erforderlich ist. Rechnungen erstellen automatisch PaymentIntents.                                                                                                              |
| [PaymentMethod](https://docs.stripe.com/api/payment_methods.md)                                                                           | Die Zahlungsmethoden einer Kundin/eines Kunden, mit denen sie/er für Ihre Produkte bezahlt. Sie können beispielsweise eine Kreditkarte in einem kundenkonfigurierten `Account` oder `Customer` speichern und damit wiederkehrende Zahlungen für diese Kundin/diesen Kunden/ vornehmen. Wird in der Regel mit der Payment Intents API oder der Setup Intents API verwendet.                                                                                                                                                                              |
| [Preis](https://docs.stripe.com/api/prices.md)                                                                                            | Definiert den Stückpreis, die Währung und den Rechnungszyklus für ein Produkt.                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| [Produkt](https://docs.stripe.com/api/products.md)                                                                                        | Eine Ware oder Dienstleistung, die Ihr Unternehmen verkauft. Ein Dienstleistungsprodukt kann eine oder mehrere Funktionen beinhalten.                                                                                                                                                                                                                                                                                                                                                                                                                   |
| [ProductFeature](https://docs.stripe.com/api/product-feature.md)                                                                          | Stellt die Aufnahme einer einzelnen Funktion in ein einzelnes Produkt dar. Jedes Produkt ist für jede Funktion, die es enthält, mit einer ProductFeature verknüpft, und jede Funktion ist für jedes Produkt, das sie enthält, mit einer ProductFeature verknüpft.                                                                                                                                                                                                                                                                                       |
| [Abonnement](https://docs.stripe.com/api/subscriptions.md)                                                                                | Stellt den geplanten wiederkehrenden Kauf eines Produkts durch einen Kunden/eine Kundin dar. Verwenden Sie ein Abonnement, um Zahlungen einzuziehen und eine wiederholte Lieferung oder einen kontinuierlichen Zugriff auf ein Produkt zu ermöglichen.                                                                                                                                                                                                                                                                                                  |

Hier ist ein Beispiel dafür, wie Produkte, Funktionen und Berechtigungen zusammen funktionieren. Stellen Sie sich vor, Sie möchten einen wiederkehrenden Service einrichten, der zwei Stufen anbietet: ein Standard-Produkt mit grundlegenden Funktionalitäten und ein erweitertes Produkt, das erweiterte Funktionalitäten bietet.

1. Sie erstellen zwei Funktionen: `basic_features` und `extended_features`.
1. Sie erstellen zwei Produkte: `standard_product` und `advanced_product`.
1. Für das Standardprodukt erstellen Sie eine ProductFeature, die `basic_features` mit `standard_product` verknüpft.
1. Für das erweiterte Produkt erstellen Sie zwei ProductFeatures: eine, die `basic_features` mit `advanced_product` verknüpft, und eine, die `extended_features` mit `advanced_product` verknüpft.

Ein Kunde/eine Kundin, `first_customer`, abonniert das Standardprodukt. Wenn Sie das Abonnement erstellen, erstellt Stripe automatisch eine Berechtigung, die `first_customer` mit `basic_features` verknüpft.

Ein anderer Kunde/eine andere Kundin, `second_customer`, abonniert das erweiterte Produkt. Wenn Sie das Abonnement erstellen, erstellt Stripe automatisch zwei Berechtigungen: eine, die `second_customer` mit `basic_features` verknüpft, und eine, die `second_customer` mit `extended_features` verknüpft.

Sie können festlegen, welche Funktionen für einen Kunden/eine Kundin bereitgestellt werden sollen, indem Sie [seine/ihre aktiven Berechtigungen abrufen oder das Ereignis mit der Zusammenfassung der aktiven Berechtigungen überwachen](https://docs.stripe.com/billing/entitlements.md#entitlements). Sie müssen ihre Abonnements, Produkte und Funktionen nicht abrufen.

## Stripe einrichten

Das [React Native SDK](https://github.com/stripe/stripe-react-native) ist Open Source und vollständig dokumentiert. Intern werden [native iOS](https://github.com/stripe/stripe-ios) und [Android](https://github.com/stripe/stripe-android) SDKs verwendet. Um das React Native SDK von Stripe zu installieren, führen Sie einen der folgenden Befehle im Verzeichnis Ihres Projekts aus (je nachdem, welchen Paket-Manager Sie verwenden):

#### yarn

```bash
yarn add @stripe/stripe-react-native
```

#### npm

```bash
npm install @stripe/stripe-react-native
```

Installieren Sie als Nächstes einige weitere erforderliche Abhängigkeiten:

- Für iOS wechseln Sie in das Verzeichnis **ios** und führen Sie `pod install` aus, um sicherzustellen, dass Sie auch die erforderlichen nativen Dependencies installiert haben.
- Für Android müssen keine Abhängigkeiten mehr installiert werden.

> Wir empfehlen Ihnen, die [offizielle Anleitung zu TypeScript](https://reactnative.dev/docs/typescript#adding-typescript-to-an-existing-project) zu befolgen, um TypeScript zu unterstützen.

### Stripe Initialisierung

Um Stripe in Ihrer React Native-App zu initialisieren, umschließen Sie entweder Ihren Zahlungsbildschirm mit der Komponente `StripeProvider` oder verwenden Sie die Initialisierungsmethode `initStripe`. Nur der [veröffentlichbare API-Schlüssel](https://docs.stripe.com/keys.md#obtain-api-keys) in `publishableKey` ist erforderlich. Das folgende Beispiel zeigt, wie Stripe mithilfe der Komponente `StripeProvider` initialisiert wird.

```jsx
import { useState, useEffect } from 'react';
import { StripeProvider } from '@stripe/stripe-react-native';

function App() {
  const [publishableKey, setPublishableKey] = useState('');

  const fetchPublishableKey = async () => {
    const key = await fetchKey(); // fetch key from your server here
    setPublishableKey(key);
  };

  useEffect(() => {
    fetchPublishableKey();
  }, []);

  return (
    <StripeProvider
      publishableKey={publishableKey}
      merchantIdentifier="merchant.identifier" // required for Apple Pay
      urlScheme="your-url-scheme" // required for 3D Secure and bank redirects
    >
      {/* Your app code here */}
    </StripeProvider>
  );
}
```

> Verwenden Sie Ihre API-[Testschlüssel](https://docs.stripe.com/keys.md#obtain-api-keys) beim Testen und Entwickeln Ihrer App und Ihre [Live-Modus](https://docs.stripe.com/keys.md#test-live-modes)-Schlüssel beim Veröffentlichen Ihrer App.

Installieren Sie dann die Stripe-CLI. Mit der Stripe-CLI können Sie Webhooks testen und Stripe-APIs aufrufen. In einem späteren Abschnitt dieses Leitfadens wird erklärt, wie Sie mithilfe der CLI ein Preismodell einrichten können.
Weitere Installationsoptionen finden Sie unter [Mit der Stripe-CLI loslegen](https://docs.stripe.com/stripe-cli.md).
## Preismodell erstellen [Stripe-CLI oder Dashboard]

[Wiederkehrende Preismodelle](https://docs.stripe.com/products-prices/pricing-models.md) umfassen die Produkte und Dienstleistungen, die Sie anbieten, die Preise dafür, welche Währungen Sie für Zahlungen verwenden und den Leistungszeitraum (für Abos). Verwenden Sie zum Aufbau des Preismodells [Produkte](https://docs.stripe.com/api/products.md) (was Sie anbieten) und [Preise](https://docs.stripe.com/api/prices.md) (Höhe und Abrechnungsintervall).

In diesem Beispiel wird ein Pauschalpreisdienst mit zwei verschiedenen Service-Optionen verwendet: Basis und Premium. Für jede Service-Option müssen Sie ein Produkt und einen wiederkehrenden Preis erstellen. Um eine einmalige Gebühr, z.&nbsp;B. für die Einrichtung, hinzufügen möchten, erstellen Sie ein drittes Produkt mit einem einmaligen Preis.

Jedes Produkt wird in monatlichen Intervallen abgerechnet. Der Preis für das Basisprodukt beträgt 5&nbsp;USD. Der Preis für das Premiumprodukt beträgt 15 USD. Ein Beispiel mit drei Stufen finden Sie im Leitfaden zu [Pauschalpreismodellen](https://docs.stripe.com/subscriptions/pricing-models/flat-rate-pricing.md).

#### Dashboard

Gehen Sie zur Seite [Produkt hinzufügen](https://dashboard.stripe.com/test/products/create) und erstellen Sie zwei Produkte. Fügen Sie für jedes Produkt einen Preis hinzu, jeweils mit einem monatlich wiederkehrenden Abrechnungszeitraum:

- Premium-Produkt: Premium-Dienstleistung mit zusätzlichen Funktionen

  - Preis: Pauschalpreis&nbsp;|&nbsp;15 USD

- Basic-Produkt: Basic-Dienstleistung mit minimalem Funktionsumfang

  - Preis: Pauschalpreis&nbsp;|&nbsp;5 USD

Zeichnen Sie nach Erstellung der Preise die Preis-IDs auf, sodass diese in anderen Schritten verwendet werden können. Preis-IDs sehen in etwa wie folgt aus: `price_G0FvDp6vZvdwRZ`.

Wenn Sie bereit sind, verwenden Sie die Schaltfläche **In Live-Modus kopieren** oben rechts auf der Seite, um Ihr Produkt aus der [Sandbox in den Live-Modus zu kopieren](https://docs.stripe.com/keys.md#test-live-modes).

#### API

Sie können die API zum Erstellen der [Produkte](https://docs.stripe.com/api/products.md) und [Preise](https://docs.stripe.com/api/prices.md) verwenden.

Premiumprodukt erstellen:

```curl
curl https://api.stripe.com/v1/products \
  -u "<<YOUR_SECRET_KEY>>:" \
  --data-urlencode "name=Billing Guide: Premium Service" \
  -d "description=Premium service with extra features"
```

Basisprodukt erstellen:

```curl
curl https://api.stripe.com/v1/products \
  -u "<<YOUR_SECRET_KEY>>:" \
  --data-urlencode "name=Billing Guide: Basic Service" \
  -d "description=Basic service with minimum features"
```

Zeichnen Sie Preis-ID für jedes Produkt auf. Die Preis-IDs sehen in etwa wie folgt aus:

```json
{
  "id": "prod_H94k5odtwJXMtQ",
  "object": "product",
  "active": true,
  "attributes": [

  ],
  "created": 1587577341,
  "description": "Premium service with extra features",
  "images": [

  ],
  "livemode": false,
  "metadata": {
  },
  "name": "Billing Guide: Premium Service",
  "statement_descriptor": null,
  "type": "service",
  "unit_label": null,
  "updated": 1587577341
}
```

Verwenden Sie die Produkt-IDs, um einen Preis für jedes Produkt zu erstellen. Die Zahl [unit_amount](https://docs.stripe.com/api/prices/object.md#price_object-unit_amount) wird in Cent angegeben, also z.&nbsp;B.`1500` = 15 USD.

Premiumpreis erstellen:

```curl
curl https://api.stripe.com/v1/prices \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d product={{PREMIUM_PRODUCT_ID}} \
  -d unit_amount=1500 \
  -d currency=usd \
  -d "recurring[interval]=month"
```

Basispreis erstellen:

```curl
curl https://api.stripe.com/v1/prices \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d product={{BASIC_PRODUCT_ID}} \
  -d unit_amount=500 \
  -d currency=usd \
  -d "recurring[interval]=month"
```

Zeichnen Sie Preis-ID für jeden Preis auf, sodass diese in nachfolgenden Schritten verwendet werden können. Die Preis-IDs sehen in etwa wie folgt aus:

```json
{
  "id": "price_HGd7M3DV3IMXkC",
  "object": "price",
  "product": "prod_HGd6W1VUqqXGvr",
  "type": "recurring",
  "currency": "usd",
  "recurring": {
    "interval": "month",
    "interval_count": 1,
    "trial_period_days": null,
    "usage_type": "licensed"
  },
  "active": true,
  "billing_scheme": "per_unit",
  "created": 1589319695,
  "livemode": false,
  "lookup_key": null,
  "metadata": {},
  "nickname": null,
  "unit_amount": 1500,
  "unit_amount_decimal": "1500",
  "tiers": null,
  "tiers_mode": null,
  "transform_quantity": null
}
```

## Kundin/Kunden erstellen [Client und Server]

Stripe benötigt für jedes Abonnement einen Kunden bzw. eine Kundin. Erfassen Sie in der Nutzeroberfläche Ihrer Anwendung alle erforderlichen Informationen von Ihren Nutzerinnen und Nutzern und leiten Sie diese an das Backend weiter.

Wenn Sie Adressdaten erfassen müssen, können Sie mit dem Address Element Versand- und Rechnungsadressen Ihrer Kundinnen/Kunden erfassen. Weitere Informationen zu dem Thema finden Sie auf der Seite [Address Element](https://docs.stripe.com/elements/address-element.md).

```javascript
import React from 'react';
import {View, TextInput, StyleSheet, Button, Platform} from 'react-native';

function RegisterView() {
  const [email, setEmail] = React.useState('');

  const createCustomer = async () => {
    const apiEndpoint =
      Platform.OS === 'ios' ? 'http://localhost:4242' : 'http://10.0.2.2:4567';
    const response = await fetch(`${apiEndpoint}/create-customer`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        email: email,
      }),
    });
    if (response.status === 200) {
      const customer = await response.json();
      console.log(customer);
    }
  };

  return (
    <View>
      <TextInput
        style={styles.input}
        placeholder="Email"
        value={email}
        onChangeText={setEmail}
      />
      <Button
        title="Register"
        onPress={async () => {
          await createCustomer();
        }}
      />
    </View>
  );
}

const styles = StyleSheet.create({
  input: {
    height: 40,
    margin: 12,
    borderWidth: 1,
    padding: 10,
  },
});

export default RegisterView;
```

Erstellen Sie das Stripe Customer-Objekt auf dem Server.

> #### Verwenden Sie die Accounts&nbsp;v2 API zum Darstellen von Kundinnen und Kunden
> 
> The Accounts v2 API is generally available for Connect users, and in public preview for other Stripe users. If you’re part of the Accounts v2 preview, you need to specify a [specify a preview version](https://docs.stripe.com/api-v2-overview.md#sdk-and-api-versioning) in your code.
> 
> To request access to the Accounts v2 preview, 
> 
> Für die meisten Anwendungsfälle empfehlen wir, [Ihre Kundinnen und Kunden als vom Kunden bzw. von der Kundin konfigurierte Account-Objekte abzubilden](https://docs.stripe.com/connect/use-accounts-as-customers.md), anstatt das [Kundenobjekt](https://docs.stripe.com/api/customers.md) zu verwenden.

#### Accounts&nbsp;v2

```curl
curl -X POST https://api.stripe.com/v2/core/accounts \
  -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-03-25.preview" \
  --json '{
    "contact_email": "jenny.rosen@example.com",
    "display_name": "Jenny Rosen",
    "identity": {
        "individual": {
            "given_name": "Jenny Rosen",
            "address": {
                "city": "San Francisco",
                "country": "US",
                "line1": "123 Main Street",
                "postal_code": "94605",
                "state": "CA"
            }
        }
    },
    "configuration": {
        "customer": {
            "capabilities": {
                "automatic_indirect_tax": {
                    "requested": true
                }
            },
            "shipping": {
                "address": {
                    "city": "San Francisco",
                    "country": "US",
                    "line1": "123 Main Street",
                    "postal_code": "94605",
                    "state": "CA"
                }
            }
        }
    },
    "include": [
        "configuration.customer",
        "identity"
    ]
  }'
```

#### Customers&nbsp;v1

```curl
curl https://api.stripe.com/v1/customers \
  -u "<<YOUR_SECRET_KEY>>:" \
  --data-urlencode "email=jenny.rosen@example.com" \
  -d "name=Jenny Rosen" \
  -d "shipping[address][city]=San Francisco" \
  -d "shipping[address][country]=US" \
  -d "shipping[address][line1]=123 Main Street" \
  -d "shipping[address][postal_code]=9460" \
  -d "shipping[address][state]=CA" \
  -d "shipping[name]=Jenny Rosen" \
  -d "address[city]=San Francisco" \
  -d "address[country]=US" \
  -d "address[line1]=123 Main Street" \
  -d "address[postal_code]=9460" \
  -d "address[state]=CA"
```

## Abonnement erstellen [Client und Server]

> Wie Sie das Payment Element rendern, ohne vorab ein Abonnement zu erstellen, finden Sie weitere Informationen unter [Zahlungsdaten vor dem Erstellen eines Intent erfassen](https://docs.stripe.com/payments/accept-a-payment-deferred.md?type=subscription).

Lassen Sie neuen Kundinnen und Kunden einen Plan auswählen und dann ein Abonnement erstellen. In diesem Leitfaden stehen einen Basic- und ein Premium-Plan zur Auswahl.

Übergeben Sie in Ihrer App die ausgewählte Preis-ID und die ID des Kundendatensatzes an das Backend.

#### Accounts&nbsp;v2

```javascript
const createSubscription = async (priceId, customerAccountId) => {
  const apiEndpoint =
    Platform.OS === 'ios' ? 'http://localhost:4242' : 'http://10.0.2.2:4567';
  const response = await fetch(`${apiEndpoint}/create-subscription`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      priceId: priceId,
      customerAccountId: customerAccountId,
    }),
  });
  if (response.status === 200) {
    const subscription = await response.json();
    return subscription;
  }
};
```

#### Customers&nbsp;v1

```javascript
const createSubscription = async (priceId, customerId) => {
  const apiEndpoint =
    Platform.OS === 'ios' ? 'http://localhost:4242' : 'http://10.0.2.2:4567';
  const response = await fetch(`${apiEndpoint}/create-subscription`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      priceId: priceId,
      customerId: customerId,
    }),
  });
  if (response.status === 200) {
    const subscription = await response.json();
    return subscription;
  }
};
```

Erstellen Sie im Backend mithilfe von `payment_behavior=default_incomplete` das Abonnement mit dem Status `incomplete`. Geben Sie dann das `client_secret` aus dem ersten [Payment Intent](https://docs.stripe.com/payments/payment-intents.md) des Abonnements an das Frontend zurück, um die Zahlung abzuschließen, indem Sie das [`confirmation_secret`](https://docs.stripe.com/api/invoices/object.md#invoice_object-confirmation_secret) auf der letzten Rechnung des Abonnements erweitern.

Um das [verbesserte Aboverhalten](https://docs.stripe.com/billing/subscriptions/billing-mode.md) zu aktivieren, setzen Sie `billing_mode[type]` auf `flexible`. Sie müssen die Stripe API Version [2025-06-30.basil](https://docs.stripe.com/changelog/basil.md#2025-06-30.basil) oder höher verwenden.

Legen Sie [save_default_payment_method](https://docs.stripe.com/api/subscriptions/object.md#subscription_object-payment_settings-save_default_payment_method) auf `on_subscription` fest, um die Zahlungsmethode bei erfolgreicher Zahlung als Standard für ein Abonnement zu speichern. Das Speichern einer Standardzahlungsmethode erhöht die Erfolgsquote künftiger Abonnementzahlungen.

Im folgenden Beispiel wird ein `Abonnement` erstellt und das `confirmation_secret` aus der letzten Rechnung in der Antwort erweitert. So können Sie das Geheimnis an das Frontend übergeben, um die Zahlung zu bestätigen.

#### Accounts&nbsp;v2

```curl
curl https://api.stripe.com/v1/subscriptions \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d "customer_account={{CUSTOMERACCOUNT_ID}}" \
  -d "items[0][price]={{PRICE_ID}}" \
  -d payment_behavior=default_incomplete \
  -d "payment_settings[save_default_payment_method]=on_subscription" \
  -d "billing_mode[type]=flexible" \
  -d "expand[0]=latest_invoice.confirmation_secret"
```

#### Customers&nbsp;v1

```curl
curl https://api.stripe.com/v1/subscriptions \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d "customer={{CUSTOMER_ID}}" \
  -d "items[0][price]={{PRICE_ID}}" \
  -d payment_behavior=default_incomplete \
  -d "payment_settings[save_default_payment_method]=on_subscription" \
  -d "billing_mode[type]=flexible" \
  -d "expand[0]=latest_invoice.confirmation_secret"
```

> Wenn Sie einen *Preis mit mehreren Währungen* (A single Price object can support multiple currencies. Each purchase uses one of the supported currencies for the Price, depending on how you use the Price in your integration) verwenden, verwenden Sie den Parameter [currency](https://docs.stripe.com/api/subscriptions/create.md#create_subscription-currency), um das Abonnement darüber zu informieren, welche Währung des Preises verwendet werden soll. (Wenn Sie den Parameter `currency` weglassen, wird für das Abonnement die Standardwährung des Preises verwendet.)

Das Abonnement ist derzeit `inaktiv` und wartet auf die Zahlung. Die folgende Beispielantwort zeigt die mindestens zu speichernden Felder, jedoch können Sie alle Felder speichern, auf die Ihre Anwendung häufig zugreift.

#### Accounts&nbsp;v2

```json
{"id": "sub_JgRjFjhKbtD2qz",
  "object": "subscription",
  "application_fee_percent": null,
  "automatic_tax": {
    "disabled_reason": null,
    "enabled": false,
    "liability": "null"
  },
  "billing_cycle_anchor": 1623873347,
  "billing_cycle_anchor_config": null,
  "cancel_at": null,
  "cancel_at_period_end": false,
  "canceled_at": null,
  "cancellation_details": {
    "comment": null,
    "feedback": null,
    "reason": null
  },
  "collection_method": "charge_automatically",
  "created": 1623873347,
  "currency": "usd","customer_account": identifier("customerAccount"),
  "days_until_due": null,
  "default_payment_method": null,
  "default_source": null,
  "default_tax_rates": [

  ],
  "discounts": [],
  "ended_at": null,
  "invoice_customer_balance_settings": {
    "account_tax_ids": null,
    "issuer": {
      "type": "self"
    }
  },
  "items": {
    "object": "list",
    "data": [
      {
        "id": "si_JgRjmS4Ur1khEx",
        "object": "subscription_item",
        "created": 1623873347,"current_period_end": 1626465347,
        "current_period_start": 1623873347,
        "discounts": [],
        "metadata": {
        },
        "plan": {
          "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
          "object": "plan",
          "active": true,
          "amount": 2000,
          "amount_decimal": "2000",
          "billing_scheme": "per_unit",
          "created": 1623864151,
          "currency": "usd",
          "interval": "month",
          "interval_count": 1,
          "livemode": false,
          "metadata": {
          },
          "nickname": null,
          "product": "prod_JgPF5xnq7qBun3",
          "tiers": null,
          "tiers_mode": null,
          "transform_usage": null,
          "trial_period_days": null,
          "usage_type": "licensed"
        },
        "price": {
          "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
          "object": "price",
          "active": true,
          "billing_scheme": "per_unit",
          "created": 1623864151,
          "currency": "usd",
          "livemode": false,
          "lookup_key": null,
          "metadata": {
          },
          "nickname": null,
          "product": "prod_JgPF5xnq7qBun3",
          "recurring": {
            "interval": "month",
            "interval_count": 1,
            "trial_period_days": null,
            "usage_type": "licensed"
          },
          "tiers_mode": null,
          "transform_quantity": null,
          "type": "recurring",
          "unit_amount": 2000,
          "unit_amount_decimal": "2000"
        },
        "quantity": 1,
        "subscription": "sub_JgRjFjhKbtD2qz",
        "tax_rates": [

        ]
      }
    ],
    "has_more": false,
    "total_count": 1,
    "url": "/v1/subscription_items?subscription=sub_JgRjFjhKbtD2qz"
  },
  "latest_invoice": {
    "id": "in_1J34pzGPZ1iASj5zB87qdBNZ",
    "object": "invoice",
    "account_country": "US",
    "account_name": "Angelina's Store",
    "account_tax_ids": null,
    "amount_due": 2000,
    "amount_overpaid": 0,
    "amount_paid": 0,
    "amount_remaining": 2000,
    "amount_shipping": 0,
    "attempt_count": 0,
    "attempted": false,
    "auto_advance": false,
    "automatic_tax": {
      "disabled_reason": null,
      "enabled": false,
      "liability": null,
      "status": null
    },
    "automatically_finalizes_at": null,
    "billing_reason": "subscription_update",
    "collection_method": "charge_automatically",
    "created": 1623873347,
    "currency": "usd",
    "custom_fields": null,
    "customer_account": identifier("customerAccount"),
    "customer_address": null,
    "customer_email": "angelina@stripe.com",
    "customer_name": null,
    "customer_phone": null,
    "customer_shipping": {
      "address": {
        "city": "",
        "country": "US",
        "line1": "Berry",
        "line2": "",
        "postal_code": "",
        "state": ""
      },
      "name": "",
      "phone": null
    },
    "customer_tax_exempt": "none",
    "customer_tax_ids": [

    ],
    "default_payment_method": null,
    "default_source": null,
    "default_tax_rates": [

    ],
    "description": null,
    "discounts": [],
    "due_date": null,
    "effective_at": "1623873347",
    "ending_balance": 0,
    "footer": null,
    "from_invoice": null,
    "hosted_invoice_url": "https://invoice.stripe.com/i/acct_1By64KGPZ1iASj5z/invst_JgRjzIOILGeq2MKC9T0KtyXnD5udsLp",
    "invoice_pdf": "https://pay.stripe.com/invoice/acct_1By64KGPZ1iASj5z/invst_JgRjzIOILGeq2MKC9T0KtyXnD5udsLp/pdf",
    "last_finalization_error": null,
    "latest_revision": null,
    "lines": {
      "object": "list",
      "data": [
        {
          "id": "il_1N2CjMBwKQ696a5NeOawRQP2",
          "object": "line_item",
          "amount": 2000,
          "currency": "usd",
          "description": "1 × Gold Special (at $20.00 / month)",
          "discount_amounts": [

          ],
          "discountable": true,
          "discounts": [

          ],
          "invoice": "in_1J34pzGPZ1iASj5zB87qdBNZ",
          "livemode": false,
          "metadata": {
          },
          "parent": {
            "invoice_item_details": null,
            "subscription_item_details":
            {
              "invoice_item": null,
            "proration": false,
            "proration_details":
            {
              "credited_items": null
            },
            "subscription":
            "sub_JgRjFjhKbtD2qz",
            "subscription_item":
              "si_JgRjmS4Ur1khEx"
            },
            "type": "subscription_item_details"
          },
          "period": {
            "end": 1626465347,
            "start": 1623873347
          },
          "plan": {
            "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
            "object": "plan",
            "active": true,
            "amount": 2000,
            "amount_decimal": "2000",
            "billing_scheme": "per_unit",
            "created": 1623864151,
            "currency": "usd",
            "interval": "month",
            "interval_count": 1,
            "livemode": false,
            "metadata": {
            },
            "nickname": null,
            "product": "prod_JgPF5xnq7qBun3",
            "tiers": null,
            "tiers_mode": null,
            "transform_usage": null,
            "trial_period_days": null,
            "usage_type": "licensed"
          },
          "price": {
            "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
            "object": "price",
            "active": true,
            "billing_scheme": "per_unit",
            "created": 1623864151,
            "currency": "usd",
            "livemode": false,
            "lookup_key": null,
            "metadata": {
            },
            "nickname": null,
            "product": "prod_JgPF5xnq7qBun3",
            "recurring": {
              "interval": "month",
              "interval_count": 1,
              "trial_period_days": null,
              "usage_type": "licensed"
            },
            "tiers_mode": null,
            "transform_quantity": null,
            "type": "recurring",
            "unit_amount": 2000,
            "unit_amount_decimal": "2000"
          },
          "quantity": 1,
          "taxes": []
        }
      ],
      "has_more": false,
      "total_count": 1,
      "url": "/v1/invoices/in_1J34pzGPZ1iASj5zB87qdBNZ/lines"
    },
    "livemode": false,
    "metadata": {
    },
    "next_payment_attempt": null,
    "number": "C008FC2-0354",
    "on_behalf_of": null,
    "parent": {
      "quote_details": null,
      "subscription_details": {
        "metadata": {},
        "pause_collection": null,
        "subscription": "sub_JgRjFjhKbtD2qz"
      }
    },
    "payment_intent": {
      "id": "pi_1J34pzGPZ1iASj5zI2nOAaE6",
      "object": "payment_intent",
      "allowed_source_types": [
        "card"
      ],
      "amount": 2000,
      "amount_capturable": 0,
      "amount_received": 0,
      "application": null,
      "application_fee_amount": null,
      "canceled_at": null,
      "cancellation_reason": null,
      "capture_method": "automatic",
      "charges": {
        "object": "list",
        "data": [

        ],
        "has_more": false,
        "total_count": 0,
        "url": "/v1/charges?payment_intent=pi_1J34pzGPZ1iASj5zI2nOAaE6"
      },
      "client_secret": "pi_1J34pzGPZ1iASj5zI2nOAaE6_secret_l7FN6ldFfXiFmJEumenJ2y2wu",
      "confirmation_method": "automatic",
      "created": 1623873347,
      "currency": "usd",
      "customer": "cus_CMqDWO2xODTZqt",
      "description": "Subscription creation",
      "invoice": "in_1J34pzGPZ1iASj5zB87qdBNZ",
      "last_payment_error": null,
      "livemode": false,
      "metadata": {
      },
      "next_action": null,
      "next_source_action": null,
      "on_behalf_of": null,
      "payment_method": null,
      "payment_method_options": {
        "card": {
          "installments": null,
          "network": null,
          "request_three_d_secure": "automatic"
        }
      },
      "payment_method_types": [
        "card"
      ],
      "receipt_email": null,
      "review": null,
      "setup_future_usage": "off_session",
      "shipping": null,
      "source": "card_1By6iQGPZ1iASj5z7ijKBnXJ",
      "statement_descriptor": null,
      "statement_descriptor_suffix": null,
      "status": "requires_confirmation",
      "transfer_data": null,
      "transfer_group": null
    },
    "payment_settings": {
      "payment_method_options": null,
      "payment_method_types": null,
      "save_default_payment_method": "on_subscription"
    },
    "period_end": 1623873347,
    "period_start": 1623873347,
    "post_payment_credit_notes_amount": 0,
    "pre_payment_credit_notes_amount": 0,
    "receipt_number": null,
    "starting_balance": 0,
    "statement_descriptor": null,
    "status": "open",
    "status_transitions": {
      "finalized_at": 1623873347,
      "marked_uncollectible_at": null,
      "paid_at": null,
      "voided_at": null
    },
    "subscription": "sub_JgRjFjhKbtD2qz",
    "subtotal": 2000,
    "tax": null,
    "tax_percent": null,
    "total": 2000,
    "total_discount_amounts": [],
    "total_tax_amounts": [],
    "transfer_data": null,
    "webhooks_delivered_at": 1623873347
  },
  "livemode": false,
  "metadata": {
  },
  "next_pending_invoice_item_invoice": null,
  "pause_collection": null,
  "pending_invoice_item_interval": null,
  "pending_setup_intent": null,
  "pending_update": null,
  "plan": {
    "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
    "object": "plan",
    "active": true,
    "amount": 2000,
    "amount_decimal": "2000",
    "billing_scheme": "per_unit",
    "created": 1623864151,
    "currency": "usd",
    "interval": "month",
    "interval_count": 1,
    "livemode": false,
    "metadata": {
    },
    "nickname": null,
    "product": "prod_JgPF5xnq7qBun3",
    "tiers": null,
    "tiers_mode": null,
    "transform_usage": null,
    "trial_period_days": null,
    "usage_type": "licensed"
  },
  "quantity": 1,
  "schedule": null,
  "start": 1623873347,
  "start_date": 1623873347,
  "status": "incomplete",
  "tax_percent": null,
  "transfer_data": null,
  "trial_end": null,
  "trial_start": null
}
```

#### Customers&nbsp;v1

```json
{"id": "sub_JgRjFjhKbtD2qz",
  "object": "subscription",
  "application_fee_percent": null,
  "automatic_tax": {
    "disabled_reason": null,
    "enabled": false,
    "liability": "null"
  },
  "billing_cycle_anchor": 1623873347,
  "billing_cycle_anchor_config": null,
  "cancel_at": null,
  "cancel_at_period_end": false,
  "canceled_at": null,
  "cancellation_details": {
    "comment": null,
    "feedback": null,
    "reason": null
  },
  "collection_method": "charge_automatically",
  "created": 1623873347,
  "currency": "usd","customer": identifier("customer"),
  "days_until_due": null,
  "default_payment_method": null,
  "default_source": null,
  "default_tax_rates": [

  ],
  "discounts": [],
  "ended_at": null,
  "invoice_customer_balance_settings": {
    "account_tax_ids": null,
    "issuer": {
      "type": "self"
    }
  },
  "items": {
    "object": "list",
    "data": [
      {
        "id": "si_JgRjmS4Ur1khEx",
        "object": "subscription_item",
        "created": 1623873347,"current_period_end": 1626465347,
        "current_period_start": 1623873347,
        "discounts": [],
        "metadata": {
        },
        "plan": {
          "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
          "object": "plan",
          "active": true,
          "amount": 2000,
          "amount_decimal": "2000",
          "billing_scheme": "per_unit",
          "created": 1623864151,
          "currency": "usd",
          "interval": "month",
          "interval_count": 1,
          "livemode": false,
          "metadata": {
          },
          "nickname": null,
          "product": "prod_JgPF5xnq7qBun3",
          "tiers": null,
          "tiers_mode": null,
          "transform_usage": null,
          "trial_period_days": null,
          "usage_type": "licensed"
        },
        "price": {
          "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
          "object": "price",
          "active": true,
          "billing_scheme": "per_unit",
          "created": 1623864151,
          "currency": "usd",
          "livemode": false,
          "lookup_key": null,
          "metadata": {
          },
          "nickname": null,
          "product": "prod_JgPF5xnq7qBun3",
          "recurring": {
            "interval": "month",
            "interval_count": 1,
            "trial_period_days": null,
            "usage_type": "licensed"
          },
          "tiers_mode": null,
          "transform_quantity": null,
          "type": "recurring",
          "unit_amount": 2000,
          "unit_amount_decimal": "2000"
        },
        "quantity": 1,
        "subscription": "sub_JgRjFjhKbtD2qz",
        "tax_rates": [

        ]
      }
    ],
    "has_more": false,
    "total_count": 1,
    "url": "/v1/subscription_items?subscription=sub_JgRjFjhKbtD2qz"
  },
  "latest_invoice": {
    "id": "in_1J34pzGPZ1iASj5zB87qdBNZ",
    "object": "invoice",
    "account_country": "US",
    "account_name": "Angelina's Store",
    "account_tax_ids": null,
    "amount_due": 2000,
    "amount_overpaid": 0,
    "amount_paid": 0,
    "amount_remaining": 2000,
    "amount_shipping": 0,
    "attempt_count": 0,
    "attempted": false,
    "auto_advance": false,
    "automatic_tax": {
      "disabled_reason": null,
      "enabled": false,
      "liability": null,
      "status": null
    },
    "automatically_finalizes_at": null,
    "billing_reason": "subscription_update",
    "collection_method": "charge_automatically",
    "created": 1623873347,
    "currency": "usd",
    "custom_fields": null,
    "customer": identifier("customer"),
    "customer_address": null,
    "customer_email": "angelina@stripe.com",
    "customer_name": null,
    "customer_phone": null,
    "customer_shipping": {
      "address": {
        "city": "",
        "country": "US",
        "line1": "Berry",
        "line2": "",
        "postal_code": "",
        "state": ""
      },
      "name": "",
      "phone": null
    },
    "customer_tax_exempt": "none",
    "customer_tax_ids": [

    ],
    "default_payment_method": null,
    "default_source": null,
    "default_tax_rates": [

    ],
    "description": null,
    "discounts": [],
    "due_date": null,
    "effective_at": "1623873347",
    "ending_balance": 0,
    "footer": null,
    "from_invoice": null,
    "hosted_invoice_url": "https://invoice.stripe.com/i/acct_1By64KGPZ1iASj5z/invst_JgRjzIOILGeq2MKC9T0KtyXnD5udsLp",
    "invoice_pdf": "https://pay.stripe.com/invoice/acct_1By64KGPZ1iASj5z/invst_JgRjzIOILGeq2MKC9T0KtyXnD5udsLp/pdf",
    "last_finalization_error": null,
    "latest_revision": null,
    "lines": {
      "object": "list",
      "data": [
        {
          "id": "il_1N2CjMBwKQ696a5NeOawRQP2",
          "object": "line_item",
          "amount": 2000,
          "currency": "usd",
          "description": "1 × Gold Special (at $20.00 / month)",
          "discount_amounts": [

          ],
          "discountable": true,
          "discounts": [

          ],
          "invoice": "in_1J34pzGPZ1iASj5zB87qdBNZ",
          "livemode": false,
          "metadata": {
          },
          "parent": {
            "invoice_item_details": null,
            "subscription_item_details":
            {
              "invoice_item": null,
            "proration": false,
            "proration_details":
            {
              "credited_items": null
            },
            "subscription":
            "sub_JgRjFjhKbtD2qz",
            "subscription_item":
              "si_JgRjmS4Ur1khEx"
            },
            "type": "subscription_item_details"
          },
          "period": {
            "end": 1626465347,
            "start": 1623873347
          },
          "plan": {
            "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
            "object": "plan",
            "active": true,
            "amount": 2000,
            "amount_decimal": "2000",
            "billing_scheme": "per_unit",
            "created": 1623864151,
            "currency": "usd",
            "interval": "month",
            "interval_count": 1,
            "livemode": false,
            "metadata": {
            },
            "nickname": null,
            "product": "prod_JgPF5xnq7qBun3",
            "tiers": null,
            "tiers_mode": null,
            "transform_usage": null,
            "trial_period_days": null,
            "usage_type": "licensed"
          },
          "price": {
            "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
            "object": "price",
            "active": true,
            "billing_scheme": "per_unit",
            "created": 1623864151,
            "currency": "usd",
            "livemode": false,
            "lookup_key": null,
            "metadata": {
            },
            "nickname": null,
            "product": "prod_JgPF5xnq7qBun3",
            "recurring": {
              "interval": "month",
              "interval_count": 1,
              "trial_period_days": null,
              "usage_type": "licensed"
            },
            "tiers_mode": null,
            "transform_quantity": null,
            "type": "recurring",
            "unit_amount": 2000,
            "unit_amount_decimal": "2000"
          },
          "quantity": 1,
          "taxes": []
        }
      ],
      "has_more": false,
      "total_count": 1,
      "url": "/v1/invoices/in_1J34pzGPZ1iASj5zB87qdBNZ/lines"
    },
    "livemode": false,
    "metadata": {
    },
    "next_payment_attempt": null,
    "number": "C008FC2-0354",
    "on_behalf_of": null,
    "parent": {
      "quote_details": null,
      "subscription_details": {
        "metadata": {},
        "pause_collection": null,
        "subscription": "sub_JgRjFjhKbtD2qz"
      }
    },
    "payment_intent": {
      "id": "pi_1J34pzGPZ1iASj5zI2nOAaE6",
      "object": "payment_intent",
      "allowed_source_types": [
        "card"
      ],
      "amount": 2000,
      "amount_capturable": 0,
      "amount_received": 0,
      "application": null,
      "application_fee_amount": null,
      "canceled_at": null,
      "cancellation_reason": null,
      "capture_method": "automatic",
      "charges": {
        "object": "list",
        "data": [

        ],
        "has_more": false,
        "total_count": 0,
        "url": "/v1/charges?payment_intent=pi_1J34pzGPZ1iASj5zI2nOAaE6"
      },
      "client_secret": "pi_1J34pzGPZ1iASj5zI2nOAaE6_secret_l7FN6ldFfXiFmJEumenJ2y2wu",
      "confirmation_method": "automatic",
      "created": 1623873347,
      "currency": "usd",
      "customer": "cus_CMqDWO2xODTZqt",
      "description": "Subscription creation",
      "invoice": "in_1J34pzGPZ1iASj5zB87qdBNZ",
      "last_payment_error": null,
      "livemode": false,
      "metadata": {
      },
      "next_action": null,
      "next_source_action": null,
      "on_behalf_of": null,
      "payment_method": null,
      "payment_method_options": {
        "card": {
          "installments": null,
          "network": null,
          "request_three_d_secure": "automatic"
        }
      },
      "payment_method_types": [
        "card"
      ],
      "receipt_email": null,
      "review": null,
      "setup_future_usage": "off_session",
      "shipping": null,
      "source": "card_1By6iQGPZ1iASj5z7ijKBnXJ",
      "statement_descriptor": null,
      "statement_descriptor_suffix": null,
      "status": "requires_confirmation",
      "transfer_data": null,
      "transfer_group": null
    },
    "payment_settings": {
      "payment_method_options": null,
      "payment_method_types": null,
      "save_default_payment_method": "on_subscription"
    },
    "period_end": 1623873347,
    "period_start": 1623873347,
    "post_payment_credit_notes_amount": 0,
    "pre_payment_credit_notes_amount": 0,
    "receipt_number": null,
    "starting_balance": 0,
    "statement_descriptor": null,
    "status": "open",
    "status_transitions": {
      "finalized_at": 1623873347,
      "marked_uncollectible_at": null,
      "paid_at": null,
      "voided_at": null
    },
    "subscription": "sub_JgRjFjhKbtD2qz",
    "subtotal": 2000,
    "tax": null,
    "tax_percent": null,
    "total": 2000,
    "total_discount_amounts": [],
    "total_tax_amounts": [],
    "transfer_data": null,
    "webhooks_delivered_at": 1623873347
  },
  "livemode": false,
  "metadata": {
  },
  "next_pending_invoice_item_invoice": null,
  "pause_collection": null,
  "pending_invoice_item_interval": null,
  "pending_setup_intent": null,
  "pending_update": null,
  "plan": {
    "id": "price_1J32RfGPZ1iASj5zHHp57z7C",
    "object": "plan",
    "active": true,
    "amount": 2000,
    "amount_decimal": "2000",
    "billing_scheme": "per_unit",
    "created": 1623864151,
    "currency": "usd",
    "interval": "month",
    "interval_count": 1,
    "livemode": false,
    "metadata": {
    },
    "nickname": null,
    "product": "prod_JgPF5xnq7qBun3",
    "tiers": null,
    "tiers_mode": null,
    "transform_usage": null,
    "trial_period_days": null,
    "usage_type": "licensed"
  },
  "quantity": 1,
  "schedule": null,
  "start": 1623873347,
  "start_date": 1623873347,
  "status": "incomplete",
  "tax_percent": null,
  "transfer_data": null,
  "trial_end": null,
  "trial_start": null
}
```

### Aktualisieren Sie Ihren Server-Endpoint

Fügen Sie die Erstellung eines temporären Schlüssels zum Abonnement-Endpoint hinzu und geben Sie ihn in der Antwort zurück:

#### Accounts&nbsp;v2

#### Ruby

```ruby
ephemeral_key = Stripe::EphemeralKey.create(
  {customer_account: customer_account_id},
  {stripe_version: '2026-03-25.dahlia'}
)

{
  subscriptionId: subscription.id,
  clientSecret: subscription.latest_invoice.confirmation_secret.client_secret,
  ephemeralKey: ephemeral_key.secret,
  customerAccountId: customer_account_id,
}.to_json
```

#### Customers&nbsp;v1

#### Ruby

```ruby
ephemeral_key = client.v1.ephemeral_keys.create(
  {customer: customer_id},
  {stripe_version: '2025-06-30.basil'}
)

{
  subscriptionId: subscription.id,
  clientSecret: subscription.latest_invoice.confirmation_secret.client_secret,
  ephemeralKey: ephemeral_key.secret,
  customerId: customer_id,
}.to_json
```

### Aktualisieren Sie Ihr Antwortmodell

#### Accounts&nbsp;v2

```typescript
interface SubscriptionsResponse {
  subscriptionId: string;
  clientSecret: string;
  ephemeralKey: string;
  customerAccountId: string;
}
```

#### Customers&nbsp;v1

```typescript
interface SubscriptionsResponse {
  subscriptionId: string;
  clientSecret: string;
  ephemeralKey: string;
  customerId: string;
}
```

### Übergeben Sie die Kundenkonfiguration an PaymentSheet

#### Accounts&nbsp;v2

Fügen Sie beim Initialisieren von PaymentSheet folgende Parameter hinzu:

```javascript
await initPaymentSheet({
  paymentIntentClientSecret: clientSecret,
  customerAccountId: customerAccountId,
  customerEphemeralKeySecret: ephemeralKey,
  // ... other parameters
});
```

#### Customers&nbsp;v1

Fügen Sie beim Initialisieren von PaymentSheet folgende Parameter hinzu:

```javascript
await initPaymentSheet({
  paymentIntentClientSecret: clientSecret,
  customerId: customerId,
  customerEphemeralKeySecret: ephemeralKey,
  // ... other parameters
});
```

## Zahlungsinformationen erfassen [Client]

Verwenden Sie das [Payment Sheet](https://docs.stripe.com/payments/mobile/payment-sheet.md) zum Erfassen von Zahlungsdetails und Aktivieren des Abos. Sie können Elements an das Erscheinungsbild Ihrer Anmeldung anpassen.

Mit dem Payment Sheet können Sie alle notwendigen Zahlungsdetails für eine Vielzahl von Zahlungsmethoden sicher erheben. Erfahren Sie mehr über die [unterstützten Zahlungsmethoden](https://docs.stripe.com/payments/payment-methods/payment-method-support.md#product-support) für Payment Sheet und Subscriptions.

### Payment Element zu Ihrer App hinzufügen

> Dieser Schritt zeigt eine Möglichkeit zu starten. Sie können jedoch jede [In-App-Zahlungsintegration](https://docs.stripe.com/payments/mobile.md) verwenden.

Initialisieren und präsentieren Sie das Mobile Payment Element mit der PaymentSheet-Klasse.

```javascript
import React from 'react';
import {useStripe, PaymentSheetError} from '@stripe/stripe-react-native';
import {View, Button} from 'react-native';

function SubscribeView({clientSecret}) {
  const {initPaymentSheet, presentPaymentSheet} = useStripe();

  React.useEffect(() => {
    const initializePaymentSheet = async () => {
      const {error} = await initPaymentSheet({
        paymentIntentClientSecret: clientSecret,
        returnURL: 'stripe-example://payment-sheet',
        // Set `allowsDelayedPaymentMethods` to true if your business handles
        // delayed notification payment methods like US bank accounts.
        allowsDelayedPaymentMethods: true,
      });
      if (error) {
        // Handle error
      }
    };

    initializePaymentSheet();
  }, [clientSecret, initPaymentSheet]);

  return (
    <View>
      <Button
        title="Subscribe"
        onPress={async () => {
          const {error} = await presentPaymentSheet();
          if (error) {
            if (error.code === PaymentSheetError.Failed) {
              // Handle failed
            } else if (error.code === PaymentSheetError.Canceled) {
              // Handle canceled
            }
          } else {
            // Payment succeeded
          }
        }}
      />
    </View>
  );
}

export default SubscribeView;
```

Das Mobile Payment Element stellt ein Formular dar, mit dem Ihre Kundinnen und Kunden eine Zahlungsmethode auswählen können. Das Formular erfasst automatisch alle notwendigen Zahlungsdetails für die ausgewählte Zahlungsmethode.

Wenn Sie `allowsDelayedPaymentMethods` auf true festlegen, werden Zahlungsmethoden mit [verzögerter Benachrichtigung](https://docs.stripe.com/payments/payment-methods.md#payment-notification) wie US-Bankkonten zugelassen. Für diese Zahlungsmethoden ist der endgültige Zahlungsstatus nicht bekannt, wenn das `PaymentSheet` abgeschlossen wird. Stattdessen ist sie erfolgreich oder schlägt fehl. Wenn Sie diese Art von Zahlungsmethoden unterstützen, informieren Sie den Kunden/die Kundin darüber, dass seine/ihre Bestellung bestätigt ist, und führen seine/ihre Bestellung erst aus (z. B. das Produkt versenden), wenn die Zahlung erfolgreich ist.

Sie können das Payment Element an das Design Ihrer App anpassen, indem Sie die Eigenschaft [`Erscheinungsbild` ](https://docs.stripe.com/elements/appearance-api/mobile.md?platform=ios) auf Ihr `PaymentSheet.Configuration`-Objekt anwenden.

### Zahlung bestätigen

Das Mobile Payment Element erstellt eine PaymentMethod und bestätigt den ersten PaymentIntent des unvollständigen Abonnements, wodurch eine Zahlung ausgeführt wird. Wenn die Zahlung die *starke Kundenauthentifizierung* (Strong Customer Authentication (SCA) is a regulatory requirement in effect as of September 14, 2019, that impacts many European online payments. It requires customers to use two-factor authentication like 3D Secure to verify their purchase) (SCA) erfordert, übernimmt das Payment Element den Authentifizierungsprozess, bevor der PaymentIntent bestätigt wird.

## Rückgabe-URL einrichten (nur für iOS) [Clientseitig]

Wenn Kundinnen/Kunden Ihre App verlassen (zum Beispiel um sich in Safari oder ihrer Banking-App zu authentifizieren), bieten Sie ihnen eine Möglichkeit, automatisch zu Ihrer App zurückzukehren. Für viele Arten von Zahlungsmethoden *ist* eine Rückgabe-URL erforderlich. Wenn Sie keine angeben, können wir Ihren Nutzer/innen keine Zahlungsmethoden anbieten, für die eine Rückgabe-URL erforderlich ist, selbst wenn Sie diese aktiviert haben.

So geben Sie eine Rückgabe-URL an:

1. [Registrieren](https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app#Register-your-URL-scheme) Sie eine benutzerdefinierte URL. Universelle Links werden nicht unterstützt.
1. [Konfigurieren](https://reactnative.dev/docs/linking) Sie Ihre benutzerdefinierte URL.
1. Richten Sie Ihre Root-Komponente so ein, dass sie die URL an das Stripe SDK weitergibt, wie unten gezeigt.

> Wenn Sie Expo verwenden, [stellen Sie Ihr Schema](https://docs.expo.io/guides/linking/#in-a-standalone-app) in der Datei `app.json` ein.

```jsx
import { useEffect, useCallback } from 'react';
import { Linking } from 'react-native';
import { useStripe } from '@stripe/stripe-react-native';

export default function MyApp() {
  const { handleURLCallback } = useStripe();

  const handleDeepLink = useCallback(
    async (url: string | null) => {
      if (url) {
        const stripeHandled = await handleURLCallback(url);
        if (stripeHandled) {
          // This was a Stripe URL - you can return or add extra handling here as you see fit
        } else {
          // This was NOT a Stripe URL – handle as you normally would
        }
      }
    },
    [handleURLCallback]
  );

  useEffect(() => {
    const getUrlAsync = async () => {
      const initialUrl = await Linking.getInitialURL();
      handleDeepLink(initialUrl);
    };

    getUrlAsync();

    const deepLinkListener = Linking.addEventListener(
      'url',
      (event: { url: string }) => {
        handleDeepLink(event.url);
      }
    );

    return () => deepLinkListener.remove();
  }, [handleDeepLink]);

  return (
    <View>
      <AwesomeAppComponent />
    </View>
  );
}
```

Legen Sie beim Aufrufen der Methode `initPaymentSheet` außerdem die `returnURL` fest:

```js
await initPaymentSheet({
  ...
  returnURL: 'your-app://stripe-redirect',
  ...
});
```

Weitere Informationen zu nativen URL-Schemen finden Sie in der Dokumentation für [Android](https://developer.android.com/training/app-links/deep-linking) und [iOS](https://developer.apple.com/documentation/xcode/allowing_apps_and_websites_to_link_to_your_content/defining_a_custom_url_scheme_for_your_app).

## Optional: Apple Pay aktivieren

### Für eine Apple-Händler-ID registrieren

Beantragen Sie eine Apple-Händler-ID, indem Sie sich auf der Apple Developer-Website [für eine neue Kennung registrieren](https://developer.apple.com/account/resources/identifiers/add/merchant).

Tragen Sie eine Beschreibung und eine Kennung in das Formular ein. Die Beschreibung ist nur für Ihre internen Zwecke bestimmt und kann später geändert werden. Stripe empfiehlt, dass Sie den Namen Ihrer App als Kennung verwenden, zum Beispiel `merchant.com.{{YOUR_APP_NAME}}`.

### Neues Apple Pay-Zertifikat erstellen

Erstellen Sie ein Zertifikat für Ihre App, um Zahlungsdaten zu verschlüsseln.

Gehen Sie zu den [iOS-Zertifikateinstellungen](https://dashboard.stripe.com/settings/ios_certificates) im Dashboard, klicken Sie auf **Neue Anwendung hinzufügen** und befolgen Sie die Anleitung.

Laden Sie eine Certificate Signing Request (CSR)-Datei herunter, um ein sicheres Zertifikat von Apple zu erhalten, mit dem Sie Apple Pay verwenden können.

Eine CSR-Datei muss verwendet werden, um genau ein Zertifikat auszustellen. Wenn Sie Ihre Apple-Händler-ID wechseln, müssen Sie zu den [iOS-Zertifikateinstellungen](https://dashboard.stripe.com/settings/ios_certificates) im Dashboard gehen, um eine neue CSR und ein Zertifikat zu erhalten.

### Mit Xcode integrieren

Fügen Sie Ihrer App die **Apple Pay**-Funktion hinzu. Öffnen Sie in Xcode Ihre Projekteinstellungen, klicken Sie auf die Registerkarte **Signing & Capabilities** (Anmeldung und Funktionen) und fügen Sie die **Apple Pay**-Funktion hinzu. Möglicherweise werden Sie an dieser Stelle aufgefordert, sich bei Ihrem Entwicklerkonto anzumelden. Wählen Sie die zuvor erstellte Händler-ID aus. Ihre App sollte nun Apple Pay unterstützen.
![](https://b.stripecdn.com/docs-statics-srv/assets/xcode.a701d4c1922d19985e9c614a6f105bf1.png)

Apple Pay-Funktion in Xcode aktivieren

### Apple Pay hinzufügen

#### Wiederkehrende Zahlungen

Wenn Sie `initPaymentSheet` aufrufen, übergeben Sie einen [ApplePayParams](https://stripe.dev/stripe-react-native/api-reference/modules/PaymentSheet.html#ApplePayParams), wobei der `merchantCountryCode` auf den Ländercode Ihres Unternehmens gesetzt ist.

Gemäß [den Apple-Richtlinien](https://developer.apple.com/design/human-interface-guidelines/apple-pay#Supporting-subscriptions) für wiederkehrende Zahlungen müssen Sie auch `cardItems` festlegen, die einen [RecurringCartSummaryItem](https://stripe.dev/stripe-react-native/api-reference/modules/ApplePay.html#RecurringCartSummaryItem) mit dem Betrag enthalten, den Sie zu Zahlungen beabsichtigen (z.&nbsp;B. „59,95&nbsp;USD pro Monat“).

Sie können auch [Händler-Token](https://developer.apple.com/apple-pay/merchant-tokens/) übernehmen, indem Sie die den `type` der `request` auf `PaymentRequestType.Recurring` festlegen.

Weitere Informationen zur Verwendung wiederkehrender Zahlungen mit Apple Pay finden Sie in der [PassKit-Dokumentation von Apple](https://developer.apple.com/documentation/passkit/pkpaymentrequest).

#### iOS (React Native)

```javascript
const initializePaymentSheet = async () => {
  const recurringSummaryItem = {
    label: 'My Subscription',
    amount: '59.99',
    paymentType: 'Recurring',
    intervalCount: 1,
    intervalUnit: 'month',
    // Payment starts today
    startDate: new Date().getTime() / 1000,

    // Payment ends in one year
    endDate: new Date().getTime() / 1000 + 60 * 60 * 24 * 365,
  };

  const {error} = await initPaymentSheet({
    // ...
    applePay: {
      merchantCountryCode: 'US',
      cartItems: [recurringSummaryItem],
      request: {
        type: PaymentRequestType.Recurring,
        description: 'Recurring',
        managementUrl: 'https://my-backend.example.com/customer-portal',
        billing: recurringSummaryItem,
        billingAgreement:
          "You'll be billed $59.99 every month for the next 12 months. To cancel at any time, go to Account and click 'Cancel Membership.'",
      },
    },
  });
};
```

### Sendungsverfolgung

Um für iOS&nbsp;16 und neuere Versionen Informationen zur [Sendungsverfolgung](https://developer.apple.com/design/human-interface-guidelines/technologies/wallet/designing-order-tracking) hinzuzufügen, konfigurieren Sie eine Callback-Funktion für `setOrderTracking`. Stripe ruft Ihre Implementierung auf, nachdem die Zahlung durchgeführt wurde, aber bevor iOS das Apple&nbsp;Pay-Formular schließt.

Rufen Sie in Ihrer Implementierung der Callback-Funktion `setOrderTracking` die Bestelldetails für die abgeschlossene Bestellung von Ihrem Server ab. Übergeben Sie die Details an die angegebene `completion`-Funktion.

Weitere Informationen zur Sendungsverfolgung finden Sie in der [Apple-Dokumentation zu Wallet-Bestellungen](https://developer.apple.com/documentation/walletorders).

#### iOS (React Native)

```javascript
await initPaymentSheet({
  // ...
  applePay: {
    // ...
    setOrderTracking: async complete => {
      const apiEndpoint =
        Platform.OS === 'ios'
          ? 'http://localhost:4242'
          : 'http://10.0.2.2:4567';
      const response = await fetch(
        `${apiEndpoint}/retrieve-order?orderId=${orderId}`,
        {
          method: 'GET',
          headers: {
            'Content-Type': 'application/json',
          },
        },
      );
      if (response.status === 200) {
        const orderDetails = await response.json();
        // orderDetails should include orderIdentifier, orderTypeIdentifier,
        // authenticationToken and webServiceUrl
        complete(orderDetails);
      }
    },
  },
});
```

## Webhooks überwachen [Server]

Um Ihre Integration abzuschließen, müssen Sie von Stripe gesendete *Webhooks* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) verarbeiten. Dies sind Ereignisse, die ausgelöst werden, wenn sich ein Status innerhalb von Stripe ändert, z.&nbsp;B. wenn Abonnements neue Rechnungen erstellen. Richten Sie in Ihrer Anwendung einen HTTP-Handler ein, um eine POST-Anfrage mit dem Webhook-Ereignis zu akzeptieren und verifizieren Sie die Signatur des Ereignisses.

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/webhook' do
  # You can use webhooks to receive information about asynchronous payment events.
  # For more about our webhook events check out https://stripe.com/docs/webhooks.
  webhook_secret = ENV['STRIPE_WEBHOOK_SECRET']
  payload = request.body.read
  if !webhook_secret.empty?
    # Retrieve the event by verifying the signature using the raw body and secret if webhook signing is configured.
    sig_header = request.env['HTTP_STRIPE_SIGNATURE']
    event = nil

    begin
      event = Stripe::Webhook.construct_event(
        payload, sig_header, webhook_secret
      )
    rescue JSON::ParserError => e
      # Invalid payload
      status 400
      return
    rescue Stripe::SignatureVerificationError => e
      # Invalid signature
      puts '⚠️  Webhook signature verification failed.'
      status 400
      return
    end
  else
    data = JSON.parse(payload, symbolize_names: true)
    event = Stripe::Event.construct_from(data)
  end
  # Get the type of webhook event sent - used to check the status of PaymentIntents.
  event_type = event['type']
  data = event['data']
  data_object = data['object']

  if event_type == 'invoice.paid'
    # Used to provision services after the trial has ended.
    # The status of the invoice will show up as paid. Store the status in your
    # database to reference when a user accesses your service to avoid hitting rate
    # limits.
    # puts data_object
  end

  if event_type == 'invoice.payment_failed'
    # If the payment fails or the customer does not have a valid payment method,
    # an invoice.payment_failed event is sent, the subscription becomes past_due.
    # Use this webhook to notify your user that their payment has
    # failed and to retrieve new card details.
    # puts data_object
  end

  if event_type == 'customer.subscription.deleted'
    # handle subscription canceled automatically based
    # upon your subscription settings. Or if the user cancels it.
    # puts data_object
  end

  content_type 'application/json'
  { status: 'success' }.to_json
end
```

Verwenden Sie während der Entwicklung die Stripe-CLI, um [Webhooks zu beobachten und an Ihre Anwendung weiterzuleiten](https://docs.stripe.com/webhooks.md#test-webhook). Führen Sie Folgendes in einem neuen Datenterminal aus, während Ihre Entwicklungs-App ausgeführt wird:

#### curl

```bash
  stripe listen --forward-to localhost:4242/webhook
```

Für die Produktionsphase können Sie eine Webhook-Endpoint-URL über das Dashboard oder mit der [Webhook Endpoints API](https://docs.stripe.com/api/webhook_endpoints.md) einrichten.

Sie müssen auf einige Ereignisse achten, um die restlichen Schritte in diesem Leitfaden ausführen zu können. Unter [Abonnements-Ereignissen](https://docs.stripe.com/billing/subscriptions/webhooks.md#events) finden Sie weitere Einzelheiten zu abonnementspezifischen Webhooks.

## Zugang zu Ihrer Dienstleistung bereitstellen [Client und Server]

Nachdem das Abo nun aktiv ist, gewähren Sie Ihren Nutzer/innen Zugriff auf Ihren Dienst. Überwachen Sie dazu die Ereignisse `customer.subscription.created`, `customer.subscription.updated` und `customer.subscription.deleted`. Diese Ereignisse übergeben ein Abo-Objekt, das ein `status`-Feld enthält, das anzeigt, ob das Abo aktiv oder überfällig ist oder gekündigt wurde. Eine vollständige Statusliste finden Sie unter [Abonnementlebenszyklus](https://docs.stripe.com/billing/subscriptions/overview.md#subscription-lifecycle).

In Ihrem Webhook-Handler:

1. Überprüfen Sie den Abo-Status. Wenn er `active` lautet, hat Ihr/e Nutzer/in für Ihr Produkt bezahlt.
1. Überprüfen Sie das Produkt, das die Kundin/der Kunde abonniert hat, und gewähren Sie Zugang zu Ihrer Dienstleistung. Bei der Überprüfung des Produkts sind Sie im Vergleich zur Überprüfung des Preises flexibler, falls Sie den Preis oder das Abrechnungsintervall ändern müssen.
1. Speichern Sie `product.id`, `subscription.id` und `subscription.status` in Ihrer Datenbank zusammen mit der bereits gespeicherten `customer.id`. Überprüfen Sie diesen Datensatz, wenn Sie entscheiden, welche Funktionen für die Nutzer/innen Ihrer Anwendung aktiviert werden sollen.

Der Status eines Abonnements kann sich während seiner Laufzeit jederzeit ändern, auch wenn Ihre Anwendung Stripe nicht direkt aufruft. Beispielsweise kann eine Verlängerung aufgrund einer abgelaufenen Kreditkarte fehlschlagen, wodurch das Abonnement in einen überfälligen Status versetzt wird. Oder wenn Sie das[Kundenportal](https://docs.stripe.com/customer-management.md) implementieren, können Nutzer/innen ihr Abonnement kündigen, ohne Ihre Anwendung direkt aufzurufen. Durch die korrekte Implementierung Ihres Handlers wird der Anwendungsstatus mit Stripe synchronisiert.

## Abonnement kündigen [Client und Server]

Es ist gängige Praxis, dass Kundinnen/Kunden ihr Abonnement selbst kündigen können. In diesem Beispiel wird zur Seite mit den Kontoeinstellungen eine Kündigungsoption hinzugefügt.

In diesem Beispiel wird die Abonnement-ID im Frontend erfasst. Im Produktionsbetrieb kann Ihre Anwendung diese Information für Ihre angemeldeten Nutzer/innen aus Ihrer Datenbank abrufen.
![Beispiel für eine Benutzeroberfläche zur Kündigung eines Abonnements.](https://b.stripecdn.com/docs-statics-srv/assets/fixed-price-subscriptions-guide-account-settings.6559626ba4b434826a67abfea165e097.png)

Kontoeinstellungen mit der Option, das Abonnement zu kündigen

```javascript
const cancelSubscription = async subscriptionId => {
  const apiEndpoint =
    Platform.OS === 'ios' ? 'http://localhost:4242' : 'http://10.0.2.2:4567';
  const response = await fetch(`${apiEndpoint}/cancel-subscription`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      subscriptionId: subscriptionId,
    }),
  });
  if (response.status === 200) {
    const subscription = await response.json();
    return subscription;
  }
};
```

Definieren Sie im Backend den Endpoint für den Aufruf durch Ihre App.

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/cancel-subscription' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  deleted_subscription = client.v1.subscriptions.cancel(data['subscriptionId'])

  deleted_subscription.to_json
end
```

Ihr Backend erhält ein Ereignis vom Typ `customer.subscription.deleted`.

Aktualisieren Sie nach der Kündigung des Abonnements Ihre Datenbank, um die zuvor gespeicherte Stripe-Abonnement-ID zu entfernen, und schränken Sie den Zugang zu Ihrer Dienstleistung ein.

Wenn ein Abonnement gekündigt wurde, kann es nicht reaktiviert werden. Sie müssen stattdessen die aktualisierten Rechnungsinformationen von Ihrer Kundinnen/Kunden erfassen, deren Standard-Zahlungsmethode aktualisieren und ein neues Abonnement für den bestehenden Kundendatensatz erstellen.

## Integration testen

### Zahlungsmethoden testen

Verwenden Sie die folgende Tabelle, um verschiedene Zahlungsmethoden und -szenarien zu testen.

| Zahlungsmethode  | Szenario                                                                                                                                                                                                                                                                                                           | So führen Sie den Test durch                                                                                                                                                                                          |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| BECS-Lastschrift | Ihr/e Kund/in zahlt erfolgreich mit dem BECS-Lastschriftverfahren.                                                                                                                                                                                                                                                 | Füllen Sie das Formular mit der Kontonummer `900123456` und BSB `000000` aus. Der bestätigte PaymentIntent geht zunächst in den Status `processing` über und dann drei&nbsp;Minuten später in den Status `succeeded`. |
| BECS-Lastschrift | Die Zahlung Ihres/Ihrer Kund/in schlägt fehl mit Code `account_closed` fehl.                                                                                                                                                                                                                                       | Füllen Sie das Formular mit der Kontonummer `111111113` und BSB `000000` aus.                                                                                                                                         |
| Kreditkarte      | Die Kartenzahlung ist erfolgreich, und es ist keine Authentifizierung erforderlich.                                                                                                                                                                                                                                | Füllen Sie das Kreditkartenformular aus und geben Sie die Kreditkartennummer `4242 4242 4242 4242` mit beliebiger Gültigkeitsdauer, CVC und Postleitzahl an.                                                          |
| Kreditkarte      | Für die Kartenzahlung ist eine *Authentifizierung* (Strong Customer Authentication (SCA) is a regulatory requirement in effect as of September 14, 2019, that impacts many European online payments. It requires customers to use two-factor authentication like 3D Secure to verify their purchase) erforderlich. | Füllen Sie das Kreditkartenformular aus und geben Sie die Kreditkartennummer `4000 0025 0000 3155` mit beliebiger Gültigkeitsdauer, CVC und Postleitzahl an.                                                          |
| Kreditkarte      | Die Karte wird mit einem Ablehnungscode wie `insufficient_funds` abgelehnt.                                                                                                                                                                                                                                        | Füllen Sie das Kreditkartenformular aus und geben Sie die Kreditkartennummer `4000 0000 0000 9995` mit beliebiger Gültigkeitsdauer, CVC und Postleitzahl an.                                                          |
| SEPA-Lastschrift | Ihr/e Kund/in zahlt erfolgreich mit dem SEPA-Lastschriftverfahren.                                                                                                                                                                                                                                                 | Füllen Sie das Formular mit der Kontonummer `AT321904300235473204` aus. Die bestätigte PaymentIntent geht zunächst in den Status „wird verarbeitet“ und dann drei Minuten später in den Status „erfolgreich“ über.    |
| SEPA-Lastschrift | Der Status der PaymentIntent Ihrer Kundin/Ihre Kundin wechselt von `processing` zu `requires_payment_method`.                                                                                                                                                                                                      | Füllen Sie das Formular mit der Kontonummer `AT861904300235473202` aus.                                                                                                                                               |

### Ereignisse überwachen

Richten Sie Webhooks ein, um Abonnementänderungsereignisse wie Upgrades und Kündigungen zu überwachen. Erfahren Sie mehr über [Abonnement-Webhooks](https://docs.stripe.com/billing/subscriptions/webhooks.md). Sie können Ereignisse im [Dashboard](https://dashboard.stripe.com/test/events) oder mit der [Stripe-CLI](https://docs.stripe.com/webhooks.md#test-webhook) anzeigen.

Weitere Informationen finden Sie unter [Billing-Integration testen](https://docs.stripe.com/billing/testing.md).

## Optional: Planänderungen auf Kundenseite zulassen [Client und Server]

Damit Ihre Kundinnen/Kunden ihr Abonnement selbst ändern können, erfassen Sie die Preis-ID der Option, zu der gewechselt werden soll. Übermitteln Sie dann die neue Preis-ID von der App an einen Backend-Endpoint. In diesem Beispiel wird auch die Abonnement-ID übergeben, Sie können diese jedoch für Ihre angemeldeten Nutzer/innen aus Ihrer Datenbank abrufen.

```javascript
const updateSubscription = async (subscriptionId, priceId) => {
  const apiEndpoint =
    Platform.OS === 'ios' ? 'http://localhost:4242' : 'http://10.0.2.2:4567';
  const response = await fetch(`${apiEndpoint}/update-subscription`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      subscriptionId: subscriptionId,
      newPriceId: priceId,
    }),
  });
  if (response.status === 200) {
    const subscription = await response.json();
    return subscription;
  }
};
```

Definieren Sie im Backend den Endpoint für den Aufruf durch Ihr Frontend und übergeben Sie dabei die Abonnement-ID und die neue Preis-ID. Für das Abonnement gilt jetzt der Premium-Plan zum Preis von 15&nbsp;USD pro Monat anstelle des Basic-Plans zum Preis von 5&nbsp;USD pro Monat.

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/update-subscription' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  subscription = client.v1.subscriptions.retrieve(data['subscriptionId'])

  updated_subscription =
    client.v1.subscriptions.update(
      data['subscriptionId'],
      cancel_at_period_end: false,
      items: [
        { id: subscription.items.data[0].id, price: data['newPriceId'] }
      ]
    )

  updated_subscription.to_json
end
```

Ihre Anwendung erhält ein Ereignis vom Typ `customer.subscription.updated`.

## Optional: Vorschau einer Preisänderung anzeigen [Client und Server]

Bei Änderungen eines Abonnements durch Kundinnen/Kunden wird häufig der geschuldete Betrag angepasst. Diese Anpassung wird als [anteilsmäßige Verrechnung](https://docs.stripe.com/billing/subscriptions/prorations.md) bezeichnet. Mithilfe des [Endpoints zum Erstellen einer Rechnungsvorschau](https://docs.stripe.com/api/invoices/create_preview.md) können Sie Ihren Kundinnen und Kunden den angepassten Betrag anzeigen.

Übergeben Sie in der App die Rechnungsvorschau an einen Backend-Endpoint.

```javascript
const createPreviewInvoice = async (subscriptionId, priceId, newPriceId) => {
  const apiEndpoint =
    Platform.OS === 'ios' ? 'http://localhost:4242' : 'http://10.0.2.2:4567';
  const response = await fetch(`${apiEndpoint}/create-preview-invoice`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      subscriptionId: subscriptionId,
      priceId: priceId,
      newPriceId: newPriceId,
    }),
  });
  if (response.status === 200) {
    const invoice = await response.json();
    return invoice;
  }
};
```

Definieren Sie im Backend den Endpoint für den Aufruf durch Ihr Frontend.

#### Accounts&nbsp;v2

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/create-preview-invoice' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  subscription = Stripe::Subscription.retrieve(data['subscriptionId'])

  invoice =
    Stripe::Invoice.create_preview(
      customer_account: data['customerAccountId'],
      subscription: data['subscriptionId'],
      subscription_details: {
        items: [
          { id: subscription.items.data[0].id, deleted: true },
          { price: data['newPriceId'], deleted: false }
        ]
      }
    )

  invoice.to_json
end
```

#### Customers&nbsp;v1

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/create-preview-invoice' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  subscription = client.v1.subscriptions.retrieve(data['subscriptionId'])

  invoice =
    client.v1.invoices.create_preview(
      customer: data['customerId'],
      subscription: data['subscriptionId'],
      subscription_details: {
        items: [
          { id: subscription.items.data[0].id, deleted: true },
          { price: data['newPriceId'], deleted: false }
        ]
      }
    )

  invoice.to_json
end
```

## Optional: Zahlungsmethode der Kundin/des Kunden anzeigen [Client und Server]

Wenn der Kartenaussteller und die letzten vier Ziffern der Karte angezeigt werden, wissen Kundinnen/Kunden eher, welche Karte belastet wird, und können gegebenenfalls die Zahlungsmethode aktualisieren.

Senden Sie im Fronend die ID der Zahlungsmethode an einen Backend-Endpoint, der die Details zur Zahlungsmethode abruft.

```javascript
const retrieveCustomerPaymentMethod = async paymentMethodId => {
  const apiEndpoint =
    Platform.OS === 'ios' ? 'http://localhost:4242' : 'http://10.0.2.2:4567';
  const response = await fetch(
    `${apiEndpoint}/retrieve-customer-payment-method`,
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        paymentMethodId: paymentMethodId,
      }),
    },
  );
  if (response.status === 200) {
    const paymentMethod = await response.json();
    return paymentMethod;
  }
};
```

Definieren Sie im Backend den Endpoint für den Aufruf durch Ihre App.

#### Ruby

```ruby

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('<<YOUR_SECRET_KEY>>')

post '/retrieve-customer-payment-method' do
  content_type 'application/json'
  data = JSON.parse request.body.read

  payment_method = client.v1.payment_methods.retrieve(data['paymentMethodId'])

  payment_method.to_json
end
```

Beispielantwort:

```json
{
  "id": "pm_1GcbHY2eZvKYlo2CoqlVxo42",
  "object": "payment_method",
  "billing_details": {
    "address": {
      "city": null,
      "country": null,
      "line1": null,
      "line2": null,
      "postal_code": null,
      "state": null
    },
    "email": null,
    "name": null,
    "phone": null
  },
  "card": {
    "brand": "visa",
    "checks": {
      "address_line1_check": null,
      "address_postal_code_check": null,
      "cvc_check": "pass"
    },
    "country": "US",
    "exp_month": 8,
    "exp_year": 2021,
    "fingerprint": "Xt5EWLLDS7FJjR1c",
    "funding": "credit",
    "generated_from": null,
    "last4": "4242",
    "three_d_secure_usage": {
      "supported": true
    },
    "wallet": null
  },
  "created": 1588010536,
  "customer": "cus_HAxB7dVQxhoKLh",
  "livemode": false,
  "metadata": {},
  "type": "card"
}
```

> Wir empfehlen, die `paymentMethod.id` und die `last4` in Ihrer Datenbank zu speichern (zum Beispiel `paymentMethod.id` als `stripeCustomerPaymentMethodId` in Ihrer Auflistung oder Tabelle für `users`). Optional können Sie je nach Bedarf `exp_month`, `exp_year`, `fingerprint` und `billing_details` speichern. Dadurch können Sie die Anzahl der Aufrufe an Stripe begrenzen, um sowohl die Leistung zu steigern als auch eventuelle Ratenbegrenzungen zu vermeiden.

## Stripe Ihren Kundinnen/Kunden anzeigen

Stripe erfasst Informationen über Kundeninteraktionen mit Elements , um Ihnen Dienste bereitzustellen, Betrug vorzubeugen und seine Dienste zu verbessern. Dies umfasst auch die Verwendung von Cookies und IP-Adressen, um zu ermitteln, welche Elements ein/e Kund/in während einer einzelnen Checkout-Sitzung gesehen hat. Sie sind dafür verantwortlich, alle Rechte und Zustimmungen offenzulegen und einzuholen, die Stripe benötigen, um Ihre Daten auf diese Weise zu nutzen. Weitere Informationen finden Sie in unserem [Datenschutzcenter](https://stripe.com/legal/privacy-center#as-a-business-user-what-notice-do-i-provide-to-my-end-customers-about-stripe).
