Jak wstawić formularz płatności Stripe

dowiedz się

Formularz płatności na stronie to kluczowy element monetyzacji, a jego implementacja nie musi być trudna. Ten praktyczny poradnik przeprowadzi Cię przez dwa sprawdzone podejścia: gotowe przekierowanie do kasy oraz własny, w pełni kontrolowany formularz kart. Dowiesz się, jak skonfigurować konto, przygotować środowisko, napisać niezbędny backend, obsłużyć zwroty, walidację i błędy, a także jak zadbać o zgodność, bezpieczeństwo oraz późniejszą rozbudowę o subskrypcje i automatyczne rozliczenia.

Wymagania i przygotowanie środowiska

Założenie konta i klucze API

Zacznij od założenia konta w Stripe. Po rejestracji w panelu znajdziesz dwa zestawy kluczy: testowe i produkcyjne. Klucz publiczny (publishable) trafia do frontendu, a tajny (secret) wyłącznie na serwer. Nigdy nie umieszczaj klucza tajnego w kodzie przeglądarki ani repozytorium publicznym. Do szyfrowania sekretów używaj zmiennych środowiskowych, np. STRIPE_SECRET_KEY, oraz menedżera sekretów, gdy wdrażasz projekt na serwer.

Wybór wariantu integracji

Masz dwa główne scenariusze wdrożenia formularza:

  • Wariant szybkiego startu: gotowa kasa z przekierowaniem (Stripe Checkout) – najmniej kodu po Twojej stronie, automatyczna obsługa podatków, kuponów i języków.
  • Wariant elastyczny: osadzony formularz kart (Stripe Elements) – pełna kontrola nad UI, obsługa wielu metod płatności w ramach jednego formularza, większa swoboda walidacji i komunikatów.

Wybór zależy od potrzeb. Jeśli chcesz jak najszybciej przyjmować płatności – zaufaj gotowemu przepływowi. Jeśli planujesz rozbudowany interfejs, niestandardowe pola, integracje z Twoim koszykiem i procesem zamówienia – sięgnij po osadzony formularz.

Instalacja SDK backend

Zainstaluj oficjalny pakiet serwerowy. Przykłady:

  • Node.js: npm install stripe
  • PHP: composer require stripe/stripe-php
  • Python: pip install stripe
  • Ruby: gem install stripe

Po instalacji załaduj bibliotekę w kodzie i zainicjalizuj klienta tajnym kluczem. Przykład Node.js: wczytaj stripe = require(’stripe’)(process.env.STRIPE_SECRET_KEY). W PHP utwórz instancję \Stripe\StripeClient z new StripeClient(getenv(’STRIPE_SECRET_KEY’)).

Konfiguracja frontendu

Front przy wariancie kasy z przekierowaniem jest prosty: wywołujesz endpoint serwera, otrzymujesz ID sesji i kierujesz użytkownika do kasy. W wariancie osadzanego formularza dodajesz skrypt Stripe.js (umożliwia montaż pól kart i obsługę zdarzeń), a także budujesz formularz z przyciskiem „Zapłać”. Pamiętaj, że warstwa frontendowa nie może przetwarzać tajnych danych karty – zawsze używaj tokenów/identyfikatorów tworzonych przez Stripe.js i przesyłaj je do backendu.

Wariant 1: Stripe Checkout (najszybszy start)

Tworzenie sesji po stronie serwera

Utwórz endpoint API, który tworzy sesję kasy. Podajesz listę pozycji (ceny, ilości), walutę, adresy sukcesu i anulowania. Przykład (Node.js):

POST /create-checkout-session
Body: items = [{ price: 'price_123′, quantity: 1 }]
Kod: const session = await stripe.checkout.sessions.create({
mode: 'payment’,
line_items: items,
success_url: 'https://twoja-domena.pl/sukces?session_id={CHECKOUT_SESSION_ID}’,
cancel_url: 'https://twoja-domena.pl/anulowano’
});
return { id: session.id }

Pole mode może być payment (jednorazowo), subscription (subskrypcje) lub setup (zapamiętanie metody płatności). W pricingu używaj obiektów Price utworzonych wcześniej w panelu (np. price_ABC), albo definiuj niestandardowe kwoty (custom unit_amount) i nazwę produktu.

Przekierowanie klienta

Na froncie, po otrzymaniu ID sesji z backendu, użyj Stripe.js, aby przekierować klienta na stronę kasy. Wywołaj stripe.redirectToCheckout({ sessionId: '…’}). Po opłaceniu, klient wróci na success_url wraz z identyfikatorem w zapytaniu. Interfejs kasy sam obsługuje wybór języka, responsywność i metody płatności dostępne w regionie.

Obsługa wyników płatności

Nie opieraj logiki wyłącznie na przekierowaniu na stronę sukcesu (użytkownik może zamknąć kartę, a płatność przejść kilka sekund później). Dodaj Webhooks – nasłuchuj na zdarzenia payment_intent.succeeded, checkout.session.completed lub payment_intent.payment_failed. Na ich podstawie aktualizuj status zamówienia, wysyłaj e‑maile, wystawiaj faktury i odblokowuj dostęp do treści.

Najczęstsze rozszerzenia kasy

  • Kupony i kody promocyjne – włącz w panelu, a następnie umożliwiaj wpisanie kodu na ekranie kasy.
  • Automatyczne podatki – Stripe potrafi naliczać stawki VAT/GST w wielu krajach; włącz w ustawieniach i przygotuj pola adresowe.
  • Język i branding – ustaw kolorystykę, logo oraz preferowany język; kasa wykrywa także preferencje przeglądarki.
  • Tryb subskrypcji – zmień mode na subscription, podaj price dla planu cyklicznego i skonfiguruj strony sukcesu z parametrami.

Wariant 2: Stripe Elements (własny formularz)

Ładowanie biblioteki i montaż pól

Dodaj skrypt Stripe.js w sekcji frontowej i zainicjuj obiekt z kluczem publicznym. Z poziomu biblioteki tworzysz instancję fields i montujesz gotowe pola (np. numer karty, data ważności, CVC) w swoim formularzu. Dzięki temu przeglądarka komunikuje się bezpośrednio ze Stripe, a po stronie Twojego serwera pojawiają się wyłącznie bezpieczne identyfikatory płatności, a nie surowe dane kart. To podstawa mechanizmu określanego jako Tokenizacja.

Przykładowy przepływ: użytkownik wypełnia pola karty, klika „Zapłać”, frontend tworzy PaymentMethod lub potwierdza PaymentIntent, otrzymuje identyfikator i przekazuje go do backendu. Serwer finalizuje płatność lub tworzy zamówienie, zapisuje rekord w bazie i odpowiada na frontend statusem.

Walidacja i reakcja na zdarzenia

Stripe.js emituje zdarzenia walidacyjne (np. niekompletny numer karty, błędny CVC). Nasłuchuj ich i wyświetlaj czytelne komunikaty. Dodaj stan ładowania przy przycisku (blokada wielokrotnych kliknięć), a także obsługę błędów sieciowych. Zadbaj, by formularz był dostępny (ARIA, focus), a elementy były responsywne na urządzeniach mobilnych. Pamiętaj o obsłudze wymaganych zgód (np. regulamin, polityka prywatności, checkbox na RODO).

Potwierdzanie płatności i autoryzacje

Standardem w Europie jest 3D Secure i wymogi SCA. Gdy bramka wymaga dodatkowego uwierzytelnienia, Stripe.js automatycznie wywoła okno autoryzacji banku. Twoja implementacja powinna przewidzieć stany: oczekiwanie na autoryzację, sukces, odrzucenie lub przerwanie. Po stronie backendu tworzysz PaymentIntent (kwota, waluta, opis) i odsyłasz client_secret do frontu. Front wywołuje stripe.confirmCardPayment(client_secret, { payment_method: … }), co uruchamia ewentualne 3DS. Po sukcesie wyświetlasz potwierdzenie i zapisujesz dane zamówienia.

Przykład struktury API

POST /create-payment-intent
Body: amount, currency, customerEmail
Serwer: tworzy PaymentIntent z capture_method automatic, metadata (np. orderId), i zwraca client_secret

Front: wywołuje stripe.confirmCardPayment(client_secret, { payment_method: { card: cardElement, billing_details: { email: … }}})
Po sukcesie: serwer weryfikuje stan PaymentIntent (retrieval po ID) i finalizuje zamówienie

Rozszerzenia formularza Elements

  • Wiele metod płatności – karty, BLIK, przelewy bankowe, portfele; widoczność zależy od kraju i waluty.
  • Zapis metody płatności – tryb setup do kolekcji PaymentMethod i wykorzystania w przyszłości (np. przy odroczonym obciążeniu).
  • Plan ratalny i waluty lokalne – prezentuj informacyjnie koszty i przelicznik; zadbaj o zgodność z prawem konsumenckim.
  • Personalizacja UI – własne style, komunikaty błędów, tłumaczenia, ikony; pamiętaj o kontrastach i dostępności.

Bezpieczeństwo i zgodność

Standard PCI

Stripe pomaga zredukować zakres Twojej zgodności z PCI DSS dzięki bibliotece Stripe.js oraz komponentom, które nie ujawniają Twojemu serwerowi pełnych danych kart. Mimo to stosuj podstawowe praktyki: HTTPS wszędzie, ochrona kluczy, weryfikacja webhooków, kontrola uprawnień w panelu, rotacja sekretów i segmentacja dostępu (np. klucze tylko dla konkretnego środowiska).

Wymogi europejskie

Dla podmiotów obsługujących klientów z EOG istotne są zasady silnego uwierzytelnienia klienta, czyli SCA. Mechanizmy takie jak 3DS, biometryka i potwierdzenia w aplikacji banku są częścią przepływu. Zadbaj, aby komunikaty w UI klarownie wyjaśniały, co się dzieje w trakcie autoryzacji, oraz by oferować powrót do koszyka po ewentualnej porażce autoryzacji.

Portfele i lokalne metody

Jeśli kierujesz ofertę do użytkowników mobilnych, aktywuj portfele. W przypadku urządzeń Apple skonfiguruj domenę i plik asocjacyjny, aby włączyć Apple Pay. Na Androidzie i w Chrome udostępnisz Google Pay. W UI wyświetlaj odpowiedni przycisk automatycznie, gdy urządzenie spełnia warunki. Dla lokalnych metod (np. przelewy bankowe) przejrzyście komunikuj terminy zaksięgowania i dostępne instrukcje.

Ochrona przed nadużyciami

Włącz narzędzia antyfraudowe i monitoruj sygnały ryzyka (m.in. adres IP, kraj karty, prędkość transakcji). Dodaj limit prób płatności, blokady po wielu nieudanych podejściach oraz rejestr incydentów. Utrzymuj spójność identyfikatorów zamówień i logów, by łatwo korelować zdarzenia z panelu i Twojej aplikacji. Zadbaj o zgodę użytkownika na zapisanie metody płatności i czytelne warunki zwrotów.

Webhooki, subskrypcje, testy i produkcja

Konfiguracja powiadomień

Powiadomienia HTTP (czyli Webhooks) zamykają pętlę między światem bramki płatności a Twoim systemem. Skonfiguruj w panelu adres, np. https://twoja-domena.pl/api/stripe/webhook. Na serwerze weryfikuj podpis zdarzenia nagłówkiem Stripe-Signature i znanym sekretem. Obsłuż kluczowe eventy: payment_intent.succeeded (oznacz zamówienie jako opłacone), payment_intent.payment_failed (poinformuj o błędzie), charge.refunded (zaktualizuj status, wyślij notę korygującą), checkout.session.completed (finalizacja zamówienia), customer.subscription.updated (aktualizacja cyklu).

Modele cykliczne

Gdy sprzedajesz plany cykliczne, skorzystaj z obiektów Price i produktów powiązanych z rozliczeniem co okres. Tworząc subskrypcję, ustaw trial, ewentualne opłaty wstępne i politykę nieudanych pobrań (dunning). Zaplanuj eskalację przypomnień, pauzy, automatyczne wznowienia, a także wystawianie dokumentów księgowych. Dobrą praktyką jest synchronizacja statusu subskrypcji z Twoją bazą poprzez webhook customer.subscription.created/updated/deleted. W interfejsie umożliwiaj samodzielne zarządzanie planem, danymi karty i rezygnacją; oszczędza to wsparcie i buduje zaufanie. Jeśli już używasz kasy, rozważ moduł Hosted Billing Portal, który oferuje gotowy interfejs do zarządzania subskrypcją. W treści wspomnij wyraźnie o Subskrypcje w regulaminie, wskazując cykl rozliczeń i warunki odnowienia.

Testy end‑to‑end

Tryb testowy daje komplet narzędzi: karty testowe (np. 4242 4242 4242 4242), scenariusze 3DS wymagające autoryzacji i błędów, a także symulację zwrotów i sporów. Przygotuj zestaw przypadków E2E: udana płatność, autoryzacja wymagana i udana, autoryzacja odrzucona, przerwanie w trakcie, błąd sieci, opóźniony sukces, zwrot pełny i częściowy. Testuj zarówno przepływ kasy z przekierowaniem, jak i własny formularz. Używaj identycznych danych produktów i cen w testach, jak w produkcji (poza kwotami), aby uniknąć rozjazdu konfiguracji.

Uruchomienie produkcyjne

Przed przełączeniem kluczy: sprawdź domeny i certyfikaty TLS, skonfiguruj poprawnie webhooki (osobny sekret produkcyjny), ustaw waluty i podatki, upewnij się, że linki sukcesu/anulowania wskazują produkcyjne adresy. Zadbaj o niezawodność: timeouty, ponawianie żądań, idempotency-key przy wywołaniach tworzących zasoby, monitoring logów i metryk. Przygotuj procedurę zwrotów, wzorcowe odpowiedzi supportu i wewnętrzne runbooki na wypadek przerwy w działaniu usług zależnych.

Najczęstsze błędy i jak ich uniknąć

  • Brak weryfikacji podpisu webhooków – skutkuje podatnością na fałszywe zdarzenia. Zawsze waliduj Stripe-Signature.
  • Logika oparta wyłącznie na powrocie z kasy – używaj webhooków do ostatecznego potwierdzenia i synchronizacji stanu.
  • Utrata idempotencji – powielone zamówienia po ponownych żądaniach. Dodawaj idempotency-key dla operacji tworzących.
  • Klucze testowe w produkcji – trzymaj osobne zmienne środowiskowe i weryfikuj przed deployem.
  • Niedostępny formularz – testuj na czytnikach ekranu, klawiaturze i urządzeniach mobilnych; dbaj o focus i komunikaty.
  • Brak obsługi stanów 3DS/SCA – uwzględnij autoryzację, odrzucenie i ponowienie próby; informuj użytkownika jasno i krótko.

Checklist wdrożeniowy

  • Konto aktywne i zweryfikowane, klucze testowe/produkcyjne rozdzielone.
  • Wariant: Checkout lub Elements wybrany zgodnie z potrzebami funkcjonalnymi.
  • Backend gotowy: tworzenie PaymentIntent lub Session, obsługa rezultatów, idempotency.
  • Frontend gotowy: Stripe.js, walidacja, stany przycisku, obsługa błędów i autoryzacji.
  • Bezpieczeństwo: HTTPS, ochrona sekretów, PCI DSS minimalizowane przez Stripe.js.
  • Powiadomienia: webhook endpoint, weryfikacja podpisu, logowanie zdarzeń.
  • Portfele i metody lokalne: aktywowane, przetestowane (np. Apple Pay na urządzeniach Apple).
  • Subskrypcje: plany, trial, dunning, automaty e‑mail, rozliczenia i faktury.
  • Testy: scenariusze E2E, regresja UI, plany awaryjne, monitoring.
  • Dokumenty: regulamin, polityka zwrotów, RODO, komunikaty o cykliczności.
< Powrót

Zapisz się do newslettera


Zadzwoń Napisz