Skip to main content
Ta strona prowadzi przez kompletną integrację bramki płatniczej: utworzenie płatności, przekierowanie klienta i bezpieczną obsługę powiadomienia o zapłacie. Kod jest niezależny od frameworka - przykłady w curl i Node.js.

Czego potrzebujesz

Utworzenie produktu i rejestracja webhooka to czynności jednorazowe. Jeśli jeszcze ich nie wykonałeś, zacznij od Konfiguracji i wróć tutaj.
Wszystkie wywołania wykonuj po stronie serwera. Klucz API nie może trafić do kodu frontendowego, a żądanie z przeglądarki zostanie odrzucone przez CORS.

1. Utwórz płatność

Odpowiedź:
W Node.js:
price musi być liczbą całkowitą w groszach. Wartość 12.99 zostanie po cichu obcięta do 12 groszy, a API i tak zwróci 200. Stąd Math.round(kwota * 100) w przykładzie.
Zapisz u siebie parametr externalId z otrzymanego redirectUrl (tutaj ec6RtwTZKb). To wygenerowany przez Paymove skrót płatności - inny niż Twój externalId - i to nim sprawdzisz później status.
Pracujesz w Node.js lub TypeScripcie? Zamiast ręcznego fetch użyj oficjalnego SDK - npm install @paymove-io/sdk. Pakiet jest na licencji MIT, nie ma żadnych zależności, wymaga Node 18+ i zawiera typy TypeScript. Sam składa zagnieżdżone body żądania i zwraca typowane błędy. Szczegóły: SDK JavaScript.SDK nie zawiera funkcji weryfikacji podpisu webhooka - krok 3 piszesz samodzielnie niezależnie od wybranej drogi.

2. Przekieruj klienta

Klient trafia na checkout Paymove, wybiera metodę płatności i finalizuje transakcję. Po zakończeniu widzi ekran potwierdzenia z przyciskiem „Wróć do sklepu” - i dopiero kliknięcie przenosi go pod adres podany w details.returnUrl.
Powrót na returnUrl nie oznacza, że płatność się powiodła - i nie musi w ogóle nastąpić. Klient, który zamknie kartę, nigdy tam nie trafi, a sam adres można otworzyć bezpośrednio, bez płacenia. Na tej stronie wyświetl jedynie komunikat „przetwarzamy płatność” - zamówienie realizuj dopiero po webhooku.

3. Odbierz i zweryfikuj webhook

To jedyne wiarygodne potwierdzenie zapłaty. Poniższy handler robi cztery rzeczy: pobiera surowe body, weryfikuje podpis, odpowiada natychmiast i realizuje zamówienie idempotentnie.
Twój serwer musi odpowiedzieć kodem równym expectedCode (domyślnie 200) - treść odpowiedzi nie jest sprawdzana.
Realizuj zamówienie idempotentnie, po externalId. Paymove może doręczyć to samo powiadomienie ponownie, a podwójna realizacja oznacza wysłanie towaru dwa razy.
Domyślnie webhook przychodzi wyłącznie dla statusu COMPLETED. Jeśli potrzebujesz powiadomień także o anulowaniach i błędach, napisz na integration@paymove.io. Pełen opis: Statusy płatności.

4. Awaryjne sprawdzenie statusu

Jeśli klient wrócił na returnUrl, a webhook jeszcze nie dotarł, możesz odpytać o status. Użyj skrótu płatności zapisanego w kroku 1:
Zwróć uwagę na adres: to zapytanie obsługuje inny host (pay-api.sandbox.paymove.io, na produkcji pay-api.paymove.io) niż tworzenie płatności. Przez gateway-api ta ścieżka w ogóle nie jest routowana i zwróci 404 z tekstem No route found for: GET …. Endpoint nie wymaga klucza API.
Traktuj to jako uzupełnienie, a nie zamiennik webhooka - to on jest źródłem prawdy o płatności.

Zanim wypuścisz na produkcję

  • Zmień adres bazowy na https://api.paymove.io i klucz na sk_live_….
  • Sprawdź, czy externalId jest unikalny dla każdego zamówienia - ponowne użycie zwróci starą płatność ze starą kwotą.
  • Upewnij się, że kwota trafiająca do price powstaje po stronie serwera, a nie przychodzi z przeglądarki.
  • Ustaw retries przy rejestracji webhooka - domyślnie wynosi 0, czyli brak ponowień.

Co dalej

REST API

Wszystkie parametry, pełne odpowiedzi i zmiana kwoty płatności.

Weryfikacja podpisu

Kod w Node.js, Pythonie i Javie oraz wektor testowy.

Kody błędów

Co znaczy każdy błąd i jak go obsłużyć.

SDK JavaScript

Gotowy klient dla Node.js.