- Wymagania i przygotowanie środowiska
- Założenie konta i klucze API
- Wybór wariantu integracji
- Instalacja SDK backend
- Konfiguracja frontendu
- Wariant 1: Stripe Checkout (najszybszy start)
- Tworzenie sesji po stronie serwera
- Przekierowanie klienta
- Obsługa wyników płatności
- Najczęstsze rozszerzenia kasy
- Wariant 2: Stripe Elements (własny formularz)
- Ładowanie biblioteki i montaż pól
- Walidacja i reakcja na zdarzenia
- Potwierdzanie płatności i autoryzacje
- Przykład struktury API
- Rozszerzenia formularza Elements
- Bezpieczeństwo i zgodność
- Standard PCI
- Wymogi europejskie
- Portfele i lokalne metody
- Ochrona przed nadużyciami
- Webhooki, subskrypcje, testy i produkcja
- Konfiguracja powiadomień
- Modele cykliczne
- Testy end‑to‑end
- Uruchomienie produkcyjne
- Najczęstsze błędy i jak ich uniknąć
- Checklist wdrożeniowy
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.