Zum Inhalt springen

Hinzufügen der Stripe-Integration

Stripe ist eine Online-Zahlungsverarbeitungsplattform für Internetunternehmen. Durch die Integration von Stripe kann Ihre Anwendung Transaktionen, Abonnements und Finanzdaten sicher verarbeiten.

Nach der Auswahl von Stripe aus der Integrationsliste erscheint ein Konfigurationsmodal. Sie müssen die folgenden Anmeldeinformationen aus Ihrem Stripe-Dashboard angeben, um die Verbindung herzustellen:

  • Eingabe: Geben Sie Ihren privaten Stripe Secret Key (beginnt normalerweise mit sk_) in das Feld Secret Key ein. Dieser Schlüssel ermöglicht dem Backend die Authentifizierung sicherer Anfragen.

2. Veröffentlichbarer Schlüssel (Publishable Key)

Abschnitt betitelt „2. Veröffentlichbarer Schlüssel (Publishable Key)“
  • Eingabe: Geben Sie Ihren öffentlichen Stripe Publishable Key (beginnt normalerweise mit pk_) in das Feld Publishable Key ein. Dieser Schlüssel wird für die Frontend-Implementierung verwendet.
  • Eingabe: Wählen Sie den entsprechenden Umgebungskontext aus dem Dropdown-Menü (z. B. Test für Entwicklungs-/Sandbox-Modus oder Production für Live-Verarbeitung).

Sobald die Schlüssel und die Umgebung konfiguriert sind:

  1. Überprüfen Sie die Statusleiste (zeigt derzeit Not Connected an).
  2. Klicken Sie unten rechts auf die schwarze Schaltfläche Add, um die Anmeldeinformationen zu speichern und die Zahlungsintegration zu aktivieren.

Stripe-Konfiguration

Stripe-Integration


Erstellt eine neue Stripe-Konfiguration für das Projekt und die Umgebung.

Mutation:

mutation ConfigureStripe (
$input: ConfigureStripeInput!
) {
configureStripe (
input: $input
) {
id
publishableKey
webhookUrl
}
}

Input:

input ConfigureStripeInput {
secretKey: String! # Stripe secret key (sk_test_... or sk_live_...)
publishableKey: String! # Stripe publishable key (pk_test_... or pk_live_...)
environment: StripeEnvironment! # TEST or LIVE
webhookSecret: String # Webhook signing secret (optional)
}

Response:

type ConfigureStripePayload {
id: ID! # Configuration ID
publishableKey: String! # Publishable key
webhookUrl: String! # Generated webhook URL
}

Example:

{
"input": {
"secretKey": "sk_test_...",
"publishableKey": "pk_test_...",
"environment": "TEST",
"webhookSecret": "whsec_..."
}
}

Hinweise:

  • Der geheime Schlüssel wird vor der Speicherung mit AES-256-GCM verschlüsselt
  • Nur eine Konfiguration pro Projekt/Umgebungs-Kombination
  • Gibt einen Fehler zurück, wenn die Konfiguration bereits existiert

Aktualisiert eine bestehende Stripe-Konfiguration.

Mutation:

mutation UpdateStripeConfig (
$input: UpdateStripeConfigInput!
) {
updateStripeConfig (
input: $input
) {
id
publishableKey
webhookUrl
}
}

Input:

input UpdateStripeConfigInput {
secretKey: String # Optional
publishableKey: String # Optional
environment: StripeEnvironment # Optional
webhookSecret: String # Optional
}

Response:

type UpdateStripeConfigPayload {
id: ID!
publishableKey: String!
webhookUrl: String!
}

Hinweise:

  • Alle Felder sind optional
  • Nur bereitgestellte Felder werden aktualisiert
  • Geheimer Schlüssel wird verschlüsselt, falls angegeben

Ruft einen einzelnen Kunden per ID ab.

Query:

query stripe_customer{
stripe_customer(
id: "cus_Ts..."
)
{
id
name
email
phone
description
metadata
object
createdAt
}
}

Listet Kunden mit Paginierung und optionaler Filterung auf.

Query:

query stripe_customers (
$first: Int,
$after: String,
$customerId: String
) {
stripe_customers (
first: $first,
after: $after,
customerId: $customerId
) {
edges {
node {
id
name
email
phone
description
createdAt
}
cursor
}
pageInfo {
hasNextPage
hasPreviousPage
startCursor
endCursor
}
}
}

Parameters:

  • first: Anzahl der zurückzugebenden Elemente (Standard: 10)
  • after: Cursor für Paginierung
  • customerId: Suchen nach Kunden-ID (optional)

Erstellt einen neuen Kunden.

Mutation:

mutation stripe_createCustomer {
stripe_createCustomer (
input: {
name: "Customer",
email: "example@archie.com",
phone: "+573001230001",
description: "Description Example"
metadata: {
data1: "Example data1",
data2: "Example data2"
}
}
)
{
id
name
email
phone
description
metadata
object
createdAt
}
}

Aktualisiert einen bestehenden Kunden.

Mutation:

mutation stripe_updateCustomer {
stripe_updateCustomer(
id: "cus_Ts...",
input: {
name: "Customer",
email: "example@archie.com",
phone: "+573001230001",
description:"Description Example",
metadata: {
data1: "Example data1 updated",
data2: "Example data2 updated"
}
}
)
{
id
name
email
phone
description
metadata
object
createdAt
}
}

Hinweise:

  • Alle Felder sind optional
  • Nur bereitgestellte Felder werden aktualisiert

Löscht einen Kunden.

Mutation:

mutation stripe_deleteCustomer {
stripe_deleteCustomer (
id: "cus_Ts...")
}

Response:

  • Gibt bei Erfolg true zurück
  • Gibt einen Fehler zurück, wenn der Kunde nicht gefunden wird

Ruft eine einzelne Zahlungsabsicht per ID ab.

Query:

query stripe_paymentIntent {
stripe_paymentIntent (
id: "pi_3Su..."
)
{
id
customerId
paymentMethodId
currency
amount
status
metadata
object
clientSecret
createdAt
}
}

Listet Zahlungsabsichten mit Paginierung und optionaler Filterung auf.

Query:

query stripe_paymentIntents (
$first: Int,
$after: String,
$customerId: String
) {
stripe_paymentIntents (
first: $first,
after: $after,
customerId: $customerId
) {
edges {
node {
id
customerId
paymentMethodId
currency
amount
status
metadata
object
clientSecret
createdAt
}
cursor
}
pageInfo {
hasPreviousPage
hasNextPage
startCursor
endCursor
}
}
}

Parameters:

  • first: Anzahl der zurückzugebenden Elemente (Standard: 10)
  • after: Cursor für Paginierung
  • customerId: Suchen nach Kunden-ID (optional)

Erstellt eine neue Zahlungsabsicht.

Mutation:

mutation stripe_createPaymentIntent {
stripe_createPaymentIntent (
input: {
amount: 12.35,
currency: "usd",
customerId: "cus_Ts...",
paymentMethodId: "pm_1Su...",
automaticPaymentMethods: true
}
)
{
id
customerId
paymentMethodId
currency
amount
status
metadata
object
clientSecret
createdAt
}
}

Hinweise:

  • clientSecret wird zur Frontend-Bestätigung zurückgegeben
  • Verwenden Sie automaticPaymentMethods: true für die Integration mit Stripe.js

Aktualisiert eine Zahlungsabsicht vor der Bestätigung.

Mutation:

mutation stripe_updatePaymentIntent{
stripe_updatePaymentIntent(
id: "pi_3S...",
input: {
amount: 36.92,
currency: "usd",
paymentMethodId: "pm_1Su..."
metadata:{
data1: "Example data1"
}
}
) {
id
customerId
paymentMethodId
currency
amount
status
metadata
object
clientSecret
createdAt
}
}

Hinweise:

  • Kann nur vor der Bestätigung aktualisiert werden
  • Alle Felder sind optional

Bestätigt eine Zahlungsabsicht.

Mutation:

mutation stripe_confirmPaymentIntent{
stripe_confirmPaymentIntent(
id: "pi_3Su..."
input: {
paymentMethodId: "pm_1Su...",
returnUrl: "http://localhost:3000/successful-payment"
}
) {
id
customerId
paymentMethodId
currency
amount
status
metadata
object
clientSecret
createdAt
}
}

Hinweise:

  • Erforderlich zum Abschluss der Zahlung
  • Möglicherweise ist eine 3D-Secure-Authentifizierung erforderlich
  • Gibt den aktualisierten Status zurück (succeeded, requires_action usw.)

Bricht eine Zahlungsabsicht ab.

Mutation:

mutation stripe_cancelPaymentIntent {
stripe_cancelPaymentIntent(
id: "pi_3Su..."
) {
id
customerId
paymentMethodId
currency
amount
status
metadata
object
clientSecret
createdAt
}
}

Hinweise:

  • Kann nur Zahlungsabsichten abbrechen, die nicht erfolgreich waren oder bereits abgebrochen wurden
  • Status ändert sich zu “canceled”

Ruft ein einzelnes Abonnement per ID ab.

Query:

query stripe_subscription {
stripe_subscription(id: "sub_1Su...") {
id
customerId
status
currentPeriodStart
currentPeriodEnd
createdAt
cancelAtPeriodEnd
metadata
object
items {
data {
id
priceId
quantity
}
}
}
}

Listet Abonnements mit Paginierung und optionaler Filterung auf.

Query:

query stripe_subscriptions (
$first: Int,
$after: String,
$customerId: String
) {
stripe_subscriptions (
first: $first,
after: $after,
customerId: $customerId
) {
edges {
node {
id
customerId
status
currentPeriodStart
currentPeriodEnd
createdAt
cancelAtPeriodEnd
metadata
object
items {
data {
id
priceId
quantity
}
}
}
cursor
}
pageInfo {
hasPreviousPage
hasNextPage
startCursor
endCursor
}
}
}

Parameters:

  • first: Anzahl der zurückzugebenden Elemente (Standard: 10)
  • after: Cursor für Paginierung
  • customerId: Suchen nach Kunden-ID (optional)
  • status: Suchen nach Status (optional)

Erstellt ein neues Abonnement.

Mutation:

mutation stripe_createSubscription {
stripe_createSubscription (
input: {
customerId: "cus_TsQ...",
items: {
priceId: "price_1Su...",
quantity: 1
},
metadata: {
data1: "Example data1"
},
trialPeriodDays: 0
}
) {
id
customerId
status
currentPeriodStart
currentPeriodEnd
createdAt
cancelAtPeriodEnd
metadata
object
items {
data {
id
priceId
quantity
}
}
}
}

Hinweise:

  • paymentBehavior kann “default_incomplete” sein für Abonnements, die eine Zahlungsmethode erfordern
  • Testzeitraum wird in Tagen angegeben
  • Neueste Rechnung und Zahlungsabsicht werden automatisch erweitert

Aktualisiert ein bestehendes Abonnement.

Mutation:

mutation stripe_updateSubscription {
stripe_updateSubscription(
id: "sub_1Sv..."
input: {
cancelAtPeriodEnd: false
metadata: {
data2: "Example data2"
}
}
) {
id
customerId
status
currentPeriodStart
currentPeriodEnd
createdAt
cancelAtPeriodEnd
metadata
object
items {
data {
id
priceId
quantity
}
}
}
}

Kündigt ein Abonnement.

Mutation:

mutation stripe_cancelSubscription {
stripe_cancelSubscription (
cancelAtPeriodEnd: true,
id: "sub_1Sv..."
) {
id
customerId
status
currentPeriodStart
currentPeriodEnd
createdAt
cancelAtPeriodEnd
metadata
object
items {
data {
id
priceId
quantity
}
}
}
}

Parameters:

  • id: Abonnement-ID (erforderlich)
  • cancelAtPeriodEnd: Wenn true, Kündigung zum Periodenende; wenn false, sofortige Kündigung (Standard: false)

Hinweise:

  • Sofortige Kündigung: Abonnement endet jetzt
  • Kündigung zum Periodenende: Abonnement läuft bis zum Ende der aktuellen Periode

Listet Produkte mit Paginierung auf.

Query:

query stripe_products (
$first: Int,
$after: String
) {
stripe_products (
first: $first,
after: $after
) {
edges {
node {
id
name
description
active
metadata
object
createdAt
}
cursor
}
pageInfo {
hasPreviousPage
hasNextPage
startCursor
endCursor
}
}
}

Erstellt ein neues Produkt.

Mutation:

mutation stripe_createProduct {
stripe_createProduct (
input: {
name: "Product 01",
description: "Description product 01",
metadata: {
data1: "Example data1"
}
}
) {
id
name
description
active
metadata
object
createdAt
}
}

Listet Preise mit Paginierung und optionaler Filterung auf.

Query:

query stripe_prices (
$first: Int,
$after: String,
$productId: String
) {
stripe_prices (
first: $first,
after: $after,
productId: $productId
) {
edges {
node {
id
productId
active
currency
unitAmount
object
metadata
createdAt
recurring {
interval
intervalCount
}
}
cursor
}
pageInfo {
hasPreviousPage
hasNextPage
startCursor
endCursor
}
}
}

Parameters:

  • first: Anzahl der zurückzugebenden Elemente (Standard: 10)
  • after: Cursor für Paginierung
  • productId: Suchen nach Produkt-ID (optional)

Erstellt einen neuen Preis.

Mutation:

mutation stripe_createPrice {
stripe_createPrice (
input: {
productId: "prod_Tst...",
unitAmount: 25.85,
currency: "usd",
recurring: {
interval: "month",
intervalCount: 1
},
metadata: {
data1: "Example data1"
}
}
) {
id
productId
currency
unitAmount
active
object
createdAt
metadata
recurring {
interval
intervalCount
}
}
}

Hinweise:

  • Lassen Sie recurring für Einmalpreise weg
  • interval muss eines der folgenden sein: “day”, “week”, “month”, “year”

Ruft eine einzelne Rechnung per ID ab.

Query:

query stripe_invoice {
stripe_invoice (
id: "in_1Su..."
) {
id
customerId
subscriptionId
currency
amountPaid
amountDue
status
object
metadata
createdAt
lineItems {
data {
id
description
currency
amount
quantity
}
}
}
}

Hinweise:

  • Abonnement-ID wird über API-Erweiterung gefüllt, wenn verfügbar

Listet Rechnungen mit Paginierung und optionaler Filterung auf.

Query:

query stripe_invoices (
$first: Int,
$after: String,
$customerId: String,
$status: String
) {
stripe_invoices (
first: $first,
after: $after,
customerId: $customerId,
status: $status
) {
edges {
node {
id
customerId
subscriptionId
currency
amountPaid
amountDue
status
object
metadata
createdAt
lineItems {
data {
id
description
currency
amount
quantity
}
}
}
cursor
}
pageInfo {
hasPreviousPage
hasNextPage
startCursor
endCursor
}
}
}

Parameters:

  • first: Anzahl der zurückzugebenden Elemente (Standard: 10)
  • after: Cursor für Paginierung
  • customerId: Suchen nach Kunden-ID (optional)
  • status: Suchen nach Status (optional)

Bezahlt eine Rechnung programmgesteuert.

Mutation:

mutation stripe_payInvoice {
stripe_payInvoice (
id: "in_1Sv..."
) {
id
customerId
subscriptionId
currency
amountPaid
amountDue
status
object
metadata
createdAt
lineItems {
data {
id
description
currency
amount
quantity
}
}
}
}

Hinweise:

  • Versucht, die Rechnung mit der Standardzahlungsmethode des Kunden zu bezahlen
  • Gibt bei Fehlschlagen der Zahlung einen Fehler zurück
  • Aktualisiert den Rechnungsstatus bei Erfolg auf “paid”

Listet Rückerstattungen mit Paginierung und optionaler Filterung auf.

Query:

query stripe_refunds (
$first: Int,
$after: String,
$paymentIntentId: String
) {
stripe_refunds (
first: $first,
after: $after,
paymentIntentId: $paymentIntentId
) {
edges {
node {
id
paymentIntentId
reason
status
currency
amount
metadata
object
createdAt
}
cursor
}
pageInfo {
hasPreviousPage
hasNextPage
startCursor
endCursor
}
}
}

Parameters:

  • first: Anzahl der zurückzugebenden Elemente (Standard: 10)
  • after: Cursor für Paginierung
  • paymentIntentId: Suchen nach Zahlungsabsichts-ID (optional)

Erstellt eine Rückerstattung für eine Zahlungsabsicht.

Mutation:

mutation stripe_createRefund {
stripe_createRefund (
input: {
paymentIntentId: "pi_3Sv...",
amount: 200,
reason: "requested_by_customer"
}
) {
id
reason
paymentIntentId
status
currency
amount
object
metadata
createdAt
}
}

Hinweise:

  • Lassen Sie amount für vollständige Rückerstattung weg
  • reason kann sein: “duplicate”, “fraudulent”, “requested_by_customer”
  • Rückerstattungsstatus beginnt als “pending” und wird zu “succeeded” oder “failed” aktualisiert

Listet Zahlungsmethoden mit Paginierung und optionaler Filterung auf.

Query:

query stripe_paymentMethods (
$first: Int,
$after: String,
$customerId: String
) {
stripe_paymentMethods(
first: $first,
after: $after,
customerId: $customerId
) {
edges {
node {
id
customerId
type
object
metadata
createdAt
card {
brand
expMonth
expYear
last4
}
}
cursor
}
pageInfo {
hasPreviousPage
hasNextPage
startCursor
endCursor
}
}
}

Parameters:

  • first: Anzahl der zurückzugebenden Elemente (Standard: 10)
  • after: Cursor für Paginierung
  • customerId: Suchen nach Kunden-ID (optional)

Hinweise:

  • Es werden nur sichere Karteninformationen zurückgegeben (letzte 4, Marke, Ablauf)
  • Vollständige Kartennummern werden niemals offengelegt

Fügt einem Kunden eine Zahlungsmethode hinzu.

Mutation:

mutation stripe_attachPaymentMethod {
stripe_attachPaymentMethod (
id: "pm_1Sv...",
input: {
customerId: "cus_Ts4..."
}
) {
id
customerId
type
card {
brand
expMonth
expYear
last4
}
metadata
object
createdAt
}
}

Hinweise:

  • Zahlungsmethode muss zuerst erstellt werden (typischerweise über Stripe.js)
  • Angehängte Zahlungsmethoden können für Abonnements und Zahlungen verwendet werden

Entfernt eine Zahlungsmethode von einem Kunden.

Mutation:

mutation stripe_detachPaymentMethod {
stripe_detachPaymentMethod (
id: "pm_1Sv..."
) {
id
customerId
type
card {
brand
expYear
expMonth
last4
}
metadata
object
createdAt
}
}

Hinweise:

  • Entfernte Zahlungsmethoden können nicht mehr für Zahlungen verwendet werden
  • Gibt die Zahlungsmethode zurück, wobei customerId auf null gesetzt ist

Listet vom Dienst empfangene Webhook-Ereignisse auf.

Query:

query ListWebhookEvents (
$first: Int,
$after: String
) {
stripe_webhookEvents (
first: $first,
after: $after
) {
edges {
node {
id
type
data
processed
createdAt
}
cursor
}
pageInfo {
hasNextPage
hasPreviousPage
endCursor
}
}
}

Response:

type StripeWebhookEvent {
id: ID!
type: String! # Event type (e.g., "payment_intent.succeeded")
data: String! # JSON string of event data
processed: Boolean! # Whether event has been processed
createdAt: Time!
}

Parameters:

  • first: Anzahl der zurückzugebenden Elemente (Standard: 10)
  • after: Cursor für Paginierung

Hinweise:

  • Ereignisse werden automatisch über den Webhook-Endpunkt empfangen
  • Ereignisse werden nach Signaturüberprüfung gespeichert
  • Das Feld data enthält die vollständige Ereignisnutzlast als JSON-String

Alle Listenabfragen unterstützen Paginierung per Cursor unter Verwendung des Relay-Connection-Musters.

type PageInfo {
hasNextPage: Boolean!
hasPreviousPage: Boolean!
startCursor: String
endCursor: String
}
query ListCustomers (
$first: Int,
$after: String
) {
stripe_customers (
first: $first,
after: $after
) {
edges {
node {
id
email
}
cursor
}
pageInfo {
hasNextPage
endCursor
}
}
}

Paginierungsfluss:

  1. Anfängliche Anfrage: first: 10, after: null
  2. Verwenden Sie pageInfo.endCursor aus der Antwort als after in der nächsten Anfrage
  3. Prüfen Sie hasNextPage, um festzustellen, ob weitere Seiten vorhanden sind

Standardwerte:

  • first: Standardmäßig 10, wenn nicht angegeben
  • after: Beginnt von vorne, wenn nicht angegeben

Alle Operationen geben GraphQL-Fehler mit benutzerfreundlichen Meldungen zurück. Fehler werden von Stripe-API-Fehlern zugeordnet, um klares Feedback zu geben.

Konfigurationsfehler:

  • 400: Ungültiges Stripe-Schlüsselformat
  • 404: Projekt oder Konfiguration nicht gefunden
  • 400: Konfiguration existiert bereits

Kundenfehler:

  • 404: Kunde nicht gefunden
  • 400: Ungültige Kundendaten

Zahlungsabsichtsfehler:

  • 404: Zahlungsabsicht nicht gefunden
  • 400: Ungültiger Betrag oder Währung
  • 402: Zahlung fehlgeschlagen (Karte abgelehnt, unzureichende Deckung usw.)

Abonnementfehler:

  • 404: Abonnement nicht gefunden
  • 400: Ungültige Abonnementparameter
  • 400: Kann gekündigtes Abonnement nicht aktualisieren

Stripe-Fehlercodes: Gängige Stripe-Fehlercodes werden benutzerfreundlichen Meldungen zugeordnet:

  • card_declined: “Ihre Karte wurde abgelehnt”
  • insufficient_funds: “Unzureichende Deckung”
  • invalid_number: “Ungültige Kartennummer”
  • expired_card: “Karte ist abgelaufen”
  • incorrect_cvc: “Falscher CVC-Code”
{
"errors": [
{
"message": "Customer not found",
"extensions": {
"code": "NOT_FOUND",
"stripeErrorCode": "resource_missing"
}
}
],
"data": null
}

enum StripeEnvironment {
TEST # Test mode
LIVE # Live/production mode
}

Der Skalartyp Map stellt eine Schlüssel-Wert-Zuordnung dar, wobei:

  • Schlüssel Strings sind
  • Werte Strings, Zahlen, Boolesche oder verschachtelte Maps sein können
  • Wird für Metadatenfelder verwendet

Beispiel:

{
"metadata": {
"order_id": "12345",
"user_id": "67890",
"premium": true
}
}

Der Skalartyp Time stellt Zeitstempel im ISO-8601-Format dar.

Beispiel: "2025-11-16T00:28:48.081Z"