Przejdź do głównej zawartości

Dodawanie integracji Stripe

Stripe to platforma przetwarzania płatności online zaprojektowana dla firm internetowych. Integracja Stripe pozwala Twojej aplikacji bezpiecznie przetwarzać transakcje, subskrypcje i dane finansowe.

Po wybraniu Stripe z listy integracji pojawi się modal konfiguracji. Aby nawiązać połączenie, musisz podać następujące dane uwierzytelniające z pulpitu nawigacyjnego Stripe:

  • Wprowadź: Wprowadź swój prywatny Tajny klucz Stripe (zazwyczaj zaczyna się od sk_) w polu Secret Key. Ten klucz umożliwia backendowi uwierzytelnianie bezpiecznych żądań.
  • Wprowadź: Wprowadź swój publiczny Klucz publikowalny Stripe (zazwyczaj zaczyna się od pk_) w polu Publishable Key. Ten klucz jest używany do implementacji frontendu.
  • Wprowadź: Wybierz odpowiedni kontekst środowiska z menu rozwijanego (np. Test dla trybu deweloperskiego/piaskownicy lub Production dla przetwarzania na żywo).

Po skonfigurowaniu kluczy i środowiska:

  1. Sprawdź pasek stanu (obecnie pokazuje Not Connected).
  2. Kliknij czarny przycisk Add w prawym dolnym rogu, aby zapisać dane uwierzytelniające i włączyć integrację płatności.

Konfiguracja Stripe

Integracja Stripe


Tworzy nową konfigurację Stripe dla projektu i środowiska.

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_..."
}
}

Uwagi:

  • Tajny klucz jest szyfrowany za pomocą AES-256-GCM przed zapisaniem
  • Tylko jedna konfiguracja na kombinację projekt/środowisko
  • Zwraca błąd, jeśli konfiguracja już istnieje

Aktualizuje istniejącą konfigurację Stripe.

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!
}

Uwagi:

  • Wszystkie pola są opcjonalne
  • Aktualizowane są tylko podane pola
  • Tajny klucz jest szyfrowany, jeśli zostanie podany

Pobiera pojedynczego klienta po ID.

Query:

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

Wyświetla listę klientów z stronicowaniem i opcjonalnym filtrowaniem.

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: Liczba zwracanych elementów (domyślnie: 10)
  • after: Kursor do stronicowania
  • customerId: Filtrowanie po ID klienta (opcjonalne)

Tworzy nowego klienta.

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
}
}

Aktualizuje istniejącego klienta.

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
}
}

Uwagi:

  • Wszystkie pola są opcjonalne
  • Aktualizowane są tylko podane pola

Usuwa klienta.

Mutation:

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

Response:

  • Zwraca true w przypadku sukcesu
  • Zwraca błąd, jeśli klient nie zostanie znalezion

Pobiera pojedynczą intencję płatności po ID.

Query:

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

Wyświetla listę intencji płatności z stronicowaniem i opcjonalnym filtrowaniem.

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: Liczba zwracanych elementów (domyślnie: 10)
  • after: Kursor do stronicowania
  • customerId: Filtrowanie po ID klienta (opcjonalne)

Tworzy nową intencję płatności.

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
}
}

Uwagi:

  • clientSecret jest zwracany do potwierdzenia we frontendzie
  • Użyj automaticPaymentMethods: true do integracji ze Stripe.js

Aktualizuje intencję płatności przed potwierdzeniem.

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
}
}

Uwagi:

  • Można aktualizować tylko przed potwierdzeniem
  • Wszystkie pola są opcjonalne

Potwierdza intencję płatności.

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
}
}

Uwagi:

  • Wymagane do sfinalizowania płatności
  • Może wymagać uwierzytelnienia 3D Secure
  • Zwraca zaktualizowany status (succeeded, requires_action, itp.)

Anuluje intencję płatności.

Mutation:

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

Uwagi:

  • Można anulować tylko intencje płatności, które nie zakończyły się sukcesem lub nie zostały jeszcze anulowane
  • Status zmienia się na “canceled”

Pobiera pojedynczą subskrypcję po ID.

Query:

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

Wyświetla listę subskrypcji z stronicowaniem i opcjonalnym filtrowaniem.

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: Liczba zwracanych elementów (domyślnie: 10)
  • after: Kursor do stronicowania
  • customerId: Filtrowanie po ID klienta (opcjonalne)
  • status: Filtrowanie po statusie (opcjonalne)

Tworzy nową subskrypcję.

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
}
}
}
}

Uwagi:

  • paymentBehavior może wynosić “default_incomplete” dla subskrypcji wymagających metody płatności
  • Okres próbny podawany jest w dniach
  • Najnowsza faktura i intencja płatności są automatycznie rozwijane

Aktualizuje istniejącą subskrypcję.

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
}
}
}
}

Anuluje subskrypcję.

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: ID subskrypcji (wymagane)
  • cancelAtPeriodEnd: Jeśli true, anuluje na koniec okresu; jeśli false, anuluje natychmiast (domyślnie: false)

Uwagi:

  • Natychmiastowe anulowanie: Subskrypcja kończy się teraz
  • Anulowanie na koniec okresu: Subskrypcja trwa do końca bieżącego okresu

Wyświetla listę produktów z stronicowaniem.

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
}
}
}

Tworzy nowy 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
}
}

Wyświetla listę cen z stronicowaniem i opcjonalnym filtrowaniem.

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: Liczba zwracanych elementów (domyślnie: 10)
  • after: Kursor do stronicowania
  • productId: Filtrowanie po ID produktu (opcjonalne)

Tworzy nową cenę.

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
}
}
}

Uwagi:

  • Pomiń recurring dla cen jednorazowych
  • interval musi być jednym z: “day”, “week”, “month”, “year”

Pobiera pojedynczą fakturę po ID.

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
}
}
}
}

Uwagi:

  • ID subskrypcji jest wypełniane przez rozszerzenie API, jeśli jest dostępne

Wyświetla listę faktur z stronicowaniem i opcjonalnym filtrowaniem.

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: Liczba zwracanych elementów (domyślnie: 10)
  • after: Kursor do stronicowania
  • customerId: Filtrowanie po ID klienta (opcjonalne)
  • status: Filtrowanie po statusie (opcjonalne)

Opłaca fakturę programowo.

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
}
}
}
}

Uwagi:

  • Próbuje opłacić fakturę przy użyciu domyślnej metody płatności klienta
  • Zwraca błąd, jeśli płatność się nie powiedzie
  • Aktualizuje status faktury na “paid” w przypadku sukcesu

Wyświetla listę zwrotów z stronicowaniem i opcjonalnym filtrowaniem.

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: Liczba zwracanych elementów (domyślnie: 10)
  • after: Kursor do stronicowania
  • paymentIntentId: Filtrowanie po ID intencji płatności (opcjonalne)

Tworzy zwrot dla intencji płatności.

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
}
}

Uwagi:

  • Pomiń amount dla pełnego zwrotu
  • reason może być: “duplicate”, “fraudulent”, “requested_by_customer”
  • Status zwrotu zaczyna się jako “pending” i zmienia się na “succeeded” lub “failed”

Wyświetla listę metod płatności z stronicowaniem i opcjonalnym filtrowaniem.

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: Liczba zwracanych elementów (domyślnie: 10)
  • after: Kursor do stronicowania
  • customerId: Filtrowanie po ID klienta (opcjonalne)

Uwagi:

  • Zwracane są tylko bezpieczne informacje o karcie (ostatnie 4 cyfry, marka, ważność)
  • Pełne numery kart nigdy nie są ujawniane

Dołącza metodę płatności do klienta.

Mutation:

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

Uwagi:

  • Metoda płatności musi być najpierw utworzona (zazwyczaj przez Stripe.js)
  • Dołączone metody płatności mogą być używane do subskrypcji i płatności

Odłącza metodę płatności od klienta.

Mutation:

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

Uwagi:

  • Odłączone metody płatności nie mogą być już używane do płatności
  • Zwraca metodę płatności z customerId ustawionym na null

Wyświetla listę zdarzeń webhook otrzymanych przez usługę.

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: Liczba zwracanych elementów (domyślnie: 10)
  • after: Kursor do stronicowania

Uwagi:

  • Zdarzenia są odbierane automatycznie przez punkt końcowy webhook
  • Zdarzenia są przechowywane po weryfikacji podpisu
  • Pole data zawiera pełny ładunek zdarzenia jako ciąg JSON

Wszystkie zapytania list obsługują stronicowanie oparte na kursorze przy użyciu wzorca połączenia Relay.

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
}
}
}

Przepływ stronicowania:

  1. Początkowe żądanie: first: 10, after: null
  2. Użyj pageInfo.endCursor z odpowiedzi jako after w następnym żądaniu
  3. Sprawdź hasNextPage, aby określić, czy jest więcej stron

Wartości domyślne:

  • first: Domyślnie 10, jeśli nie podano
  • after: Zaczyna od początku, jeśli nie podano

Wszystkie operacje zwracają błędy GraphQL z przyjaznymi dla użytkownika komunikatami. Błędy są mapowane z błędów API Stripe, aby zapewnić jasne informacje zwrotne.

Błędy konfiguracji:

  • 400: Nieprawidłowy format klucza Stripe
  • 404: Nie znaleziono projektu lub konfiguracji
  • 400: Konfiguracja już istnieje

Błędy klienta:

  • 404: Nie znaleziono klienta
  • 400: Nieprawidłowe dane klienta

Błędy intencji płatności:

  • 404: Nie znaleziono intencji płatności
  • 400: Nieprawidłowa kwota lub waluta
  • 402: Płatność nie powiodła się (karta odrzucona, brak środków, itp.)

Błędy subskrypcji:

  • 404: Nie znaleziono subskrypcji
  • 400: Nieprawidłowe parametry subskrypcji
  • 400: Nie można zaktualizować anulowanej subskrypcji

Kody błędów Stripe: Typowe kody błędów Stripe są mapowane na przyjazne komunikaty:

  • card_declined: “Twoja karta została odrzucona”
  • insufficient_funds: “Niewystarczające środki”
  • invalid_number: “Nieprawidłowy numer karty”
  • expired_card: “Karta wygasła”
  • incorrect_cvc: “Nieprawidłowy kod CVC”
{
"errors": [
{
"message": "Customer not found",
"extensions": {
"code": "NOT_FOUND",
"stripeErrorCode": "resource_missing"
}
}
],
"data": null
}

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

Skalarny typ Map reprezentuje mapowanie klucz-wartość, gdzie:

  • Klucze to ciągi znaków
  • Wartości mogą być ciągami znaków, liczbami, wartościami logicznymi lub zagnieżdżonymi mapami
  • Używane dla pól metadanych

Przykład:

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

Skalarny typ Time reprezentuje znaczniki czasu w formacie ISO 8601.

Przykład: "2025-11-16T00:28:48.081Z"