Webhook
Webhook wysyła zdarzenie GAMEMONITORING do Twojego systemu po akcji na platformie. To zwykłe żądanie POST z body JSON, dzięki któremu strona, panel lub usługa gry może reagować automatycznie.
Jeśli konfigurujesz nagrody za głosy, najpierw podłącz Webhook według tej instrukcji, a potem użyj osobnego scenariusza: Nagrody za głosy.
Podłączenie
Ta konfiguracja łączy projekt GAMEMONITORING z handlerem i daje token podpisu do weryfikacji przychodzących żądań.
- Otwórz Moje projekty, utwórz projekt albo wybierz istniejący, a następnie przejdź do ustawień Webhook.
- Utwórz publiczny endpoint HTTPS, który przyjmuje
POSTzContent-Type: application/jsoni nie przekierowuje żądań. - W ustawieniach Webhook wpisz pełny URL handlera, na przykład
https://panel.example.com/gamemonitoring-webhook, i zapisz go. - Skopiuj token podpisu z tego samego bloku i wpisz go w skrypcie handlera.
- W handlerze sprawdź
signature, obsłuż potrzebneevent_typei zwróć udaną odpowiedź2xxdopiero po przetworzeniu zdarzenia.
Do lokalnego testowania możesz uruchomić handler na swoim komputerze i wystawić go przez publiczny URL HTTPS. Użyj ngrok albo innej usługi tunelowania, a wygenerowany publiczny URL wpisz w ustawieniach Webhook.
Po konfiguracji wyślij testowy Webhook z interfejsu i sprawdź status dostawy. Dla przykładowego URL serwer musi przyjmować POST na /gamemonitoring-webhook.
Jeśli test się nie uda, zacznij od odpowiedzi handlera: 401 oznacza błąd podpisu, 403 albo strona weryfikacyjna HTML zwykle wskazuje WAF lub bot protection, a timeout oznacza, że URL jest niedostępny z internetu albo odpowiada za wolno.
Wymagania handlera
- URL musi być dostępny z internetu. Lokalne adresy, sieci prywatne i URL z loginem lub hasłem nie są odpowiednie.
- HTTPS jest zalecany dla produkcji. HTTP jest obsługiwany, ale słabiej chroni dane w transmisji.
- Handler musi przyjmować metodę
POSTi body JSON bez przekierowań. - Zwracaj
2xxdopiero po przetworzeniu zdarzenia przez Twój system. Zwykle wystarczy204 No Content. - Jeśli zdarzenia nie da się bezpiecznie przetworzyć, zwróć kod błędu.
3xx,4xx,5xx, timeout i błąd połączenia są traktowane jako nieudana dostawa. - Jeśli używasz firewalla, bot protection lub allowlist, dodaj adresy IP GAMEMONITORING do wyjątków.
- Nie zwracaj w treści odpowiedzi tokenów, stack trace, błędów SQL ani innych szczegółów wewnętrznych. Odpowiedź handlera jest widoczna w interfejsie, więc tekst błędu musi być bezpieczny i zrozumiały.
Dane zdarzenia
Każdy Webhook przychodzi z body JSON i podstawowymi polami:
event_type— jakie zdarzenie trzeba obsłużyć.event_id— unikalny ID zdarzenia. Użyj go razem zevent_typedo idempotencji i ochrony przed ponowną dostawą.is_test— oznacza testową dostawę z interfejsu.signature— podpis body zdarzenia.
Jak czytać przykład: event_type pokazuje, jakie zdarzenie trzeba obsłużyć; event_id jest potrzebne do idempotencji przed zmianą stanu; is_test: true oznacza techniczne sprawdzenie dostawy; signature nie jest daną biznesową i służy tylko do uwierzytelnienia żądania.
Logika przetwarzania zależy od event_type. Dla server.vote i project.vote użyj osobnego scenariusza: Nagrody za głosy.
Jeśli is_test ma wartość true, sprawdź podpis i zwróć 2xx, ale nie zmieniaj salda, nie wydawaj przedmiotów i nie uruchamiaj operacji produkcyjnych.
Przykład odpowiedzi handlera
Każde przychodzące zdarzenie zakończ jednym jasnym wynikiem:
204 No Content— podpis jest poprawny, a zdarzenie zostało przetworzone albo bezpiecznie pominięte. Tę samą odpowiedź zwracaj dla testowej dostawy i dla zdarzenia już przetworzonego.400 Bad Request— brakuje wymaganych pól. To oznacza błąd handlera albo nieoczekiwane body żądania; nie uruchamiaj logiki biznesowej.401 Unauthorized— podpis jest nieprawidłowy. Nie wykonuj żądań API, nie zmieniaj bazy i nie wydawaj nagród.500 Internal Server Error— baza, kolejka lub wewnętrzny system jest tymczasowo niedostępny. Dostawa pozostanie nieudana i można ją ponowić po usunięciu przyczyny.
Przykład: jeśli handler odebrał zdarzenie, sprawdził podpis, zapisał event_type + event_id i przetworzył zdarzenie, może zwrócić 204. Jeśli baza jest niedostępna i zdarzenia nie da się zapisać, lepiej zwrócić 500, żeby dostawa nie została za wcześnie oznaczona jako udana.
Weryfikacja podpisu
Podpis znajduje się w polu signature. Sprawdzaj go przed logiką biznesową, żądaniami API i zmianami w bazie.
Do weryfikacji weź wszystkie pola body poza signature, posortuj klucze alfabetycznie i zbuduj ciąg key=value połączony przez &. Wartości boolean zapisuj jako true albo false.
Dla przykładu powyżej ciąg podpisu buduje się tylko z event_id, event_type i is_test. Następnie oblicz HMAC-SHA256 tokenem podpisu z ustawień Webhook i porównaj wynik z signature z żądania.
Gotowe podpisy w przykładach są policzone dla tokena demonstracyjnego paste-webhook-token-here. W swoim handlerze użyj tokena z ustawień Webhook.
W handlerze:
- zbuduj ciąg do podpisu z posortowanych kluczy;
- oblicz
HMAC-SHA256tokenem podpisu; - porównaj wynik z
signaturefunkcją o stałym czasie porównania:hash_equalsw PHP,timingSafeEqualw Node.js albocompare_digestw Pythonie; - zwróć
401, jeśli podpis jest nieprawidłowy.
Krok 1. Podstawowy handler
Zacznij od handlera, który przyjmuje dowolny Webhook: czyta JSON, sprawdza signature, obsługuje testową dostawę, sprawdza podstawowe pola i zwraca 204. Na tym etapie handler tylko potwierdza, że dostawa jest przyjmowana poprawnie. Logikę konkretnego zdarzenia dodaj po tym, gdy ten podstawowy przepływ działa.
Krok 2. Dodaj deduplikację
Webhook używa modelu at-least-once: to samo zdarzenie może przyjść więcej niż raz. Zanim handler zmieni stan Twojego systemu, zadbaj o idempotentność tej operacji po event_type + event_id.
Najpierw utwórz tabelę, która zapisuje parę event_type i event_id z unikalnym kluczem. Jeśli rekord już istnieje, zdarzenie było już przetworzone.
Następnie rozszerz podstawowy handler: po sprawdzeniu podpisu i podstawowych pól zapisz event_type + event_id, a zmiany stanu wykonuj w tej samej transakcji.
Nie używaj nicku, ID użytkownika ani ID serwera jako klucza deduplikacji: jeden użytkownik może wywołać różne zdarzenia albo później powtórzyć dozwoloną akcję. Kluczem musi być event_type + event_id.
Przykład: handler zmienił stan Twojego systemu, ale połączenie zerwało się przed otrzymaniem przez GAMEMONITORING 204. Później dostawa zostaje ponowiona i to samo zdarzenie przychodzi jeszcze raz. Handler musi znaleźć zapisane event_type + event_id, pominąć ponowną zmianę stanu i zwrócić 204.
Jeśli handler tymczasowo nie może przetworzyć zdarzenia, zwróć odpowiedź z błędem. Po usunięciu przyczyny dostawę można ponowić z interfejsu, jeśli ponowienie jest dostępne dla tego zdarzenia.
Testy i ponowna wysyłka
Dostawa testowa (is_test: true) sprawdza URL, podpis i odpowiedź HTTP handlera. Handler musi przejść tę samą ścieżkę przetwarzania: odczytać JSON, sprawdzić signature, rozpoznać is_test i zwrócić udaną odpowiedź 2xx.
Zdarzenie testowe nie powinno zmieniać salda, ekwipunku, ról, subskrypcji ani innych danych produkcyjnych. Do testu wystarczą techniczny log i odpowiedź 204.
Jeśli dostawa zakończy się błędem, interfejs pokazuje status, kod HTTP i odpowiedź handlera. Po naprawieniu przyczyny nieudaną dostawę można wysłać ponownie, jeśli ponowienie jest dostępne dla tego zdarzenia.