Nagłówek
Każde żądanie zawiera jeden nagłówek podpisu:Sekret podpisujący
Każdy webhook ma własny sekret w formaciewhsec_<base64>. Otrzymujesz go w odpowiedzi na rejestrację webhooka, w polu signingSecret.
Jeśli zgubisz sekret, odczytasz go ponownie w odpowiedzi GET /api/pay/plugin/webhook/{webhookId} - nie musisz go z tego powodu wymieniać.
Algorytm
- Odczytaj nagłówek
X-Paymove-Signature. - Podziel wartość po przecinku na część
t=<timestamp>iv1=<podpis>. - Zbuduj podpisywaną treść:
{timestamp}.{surowe_body_żądania}. - Policz HMAC-SHA256, używając pełnego sekretu (z prefiksem) jako klucza.
- Zakoduj wynik w base64 i poprzedź go
v1=. - Porównaj z podpisem z nagłówka, używając porównania odpornego na atak czasowy.
Kod
Node.js
Python
Java
Wektor testowy
Sprawdź swoją implementację na poniższych danych - bez okna tolerancji, bo znacznik czasu jest z przeszłości:
Jeśli Twoja funkcja zwraca inny podpis, sprawdź kolejno: czy używasz pełnego sekretu z prefiksem
whsec_, czy kodujesz w base64 (a nie w hex) i czy podpisujesz surowe body bez ponownej serializacji.
Ochrona przed powtórzeniem żądania
Znacznik czasu jest objęty podpisem, więc nie da się go podmienić - ale samo Paymove nie odrzuca starych żądań. To Twój serwer decyduje, jak długo podpis pozostaje ważny. Zalecane okno to 5 minut; powyższe przykłady już je stosują. Dodatkowo realizuj zamówienia idempotentnie, poexternalId. Ponowione doręczenie tego samego powiadomienia nie może skutkować podwójną wysyłką towaru.
Wymiana sekretu
Co dalej
Statusy płatności
Co zawiera payload webhooka i jak sprawdzić stan płatności.
Konfiguracja webhooka
Rejestracja webhooka i przypisanie go do produktu.