WEBHOOKS

Webhooki

Otrzymuj zdarzenia w czasie rzeczywistym od Superroute — zamówienia, zmiany statusu, aktualizacje śledzenia. Z podpisanymi payload-ami, automatycznymi ponowieniami i wbudowanym debuggerem.

Przewodnik Integracji Webhook
Centrum Deweloperów Strona główna

Przewodnik Integracji Webhook

Czym są webhooki?

Webhook to żądanie HTTP POST, które Superroute wysyła na skonfigurowany przez Ciebie URL przy każdym zdarzeniu — utworzenie zamówienia, zakończenie dostawy, zarejestrowanie zdarzenia śledzenia. Ty budujesz endpoint odbiorczy, my dostarczamy tam zdarzenie.

Jak działa dostarczanie

Zdarzenia są kolejkowane i wysyłane asynchronicznie. Każde żądanie zawiera podpis HMAC-SHA256 do weryfikacji pochodzenia. Nieudane dostarczenia (nie 2xx lub timeout) są ponawiane z wykładniczym backoff do 5 razy.

Model bezpieczeństwa

Konfigurujesz wspólny sekret na stronie ustawień. Każdy wychodzący webhook jest nim podpisywany. Twój odbiorca przelicza podpis i porównuje — jeśli się zgadzają, payload jest autentyczny i nietknięty.

Katalog Zdarzeń

Dostępnych jest osiem typów zdarzeń wychodzących. Każdy ma własne pole URL na stronie ustawień — subskrybuj dowolny podzbiór.

zamówienie.utworzone

Wyzwala się przy utworzeniu zamówienia dostawy lokalnej (Delivery / Pickup / P2P) dowolną drogą: formularz web, REST/GraphQL API, synchronizacja platformy e-commerce, automatyczne reguły, wiersze importu itd. Wyklucza zamówienia label-service i inne typy nie-dostawcze. Pomijany w przepływie batch, gdy ten sam odbiorca ma również skonfigurowany order_create_async_postback_url. Konfiguruj za pomocą order_create_webhook_url.

Przykłady Payload
zmiana.statusu zamówienia

Wyzwala się przy każdej zmianie statusu — odebrane, w tranzycie, dostarczone, wyjątek, anulowane. Konfiguruj za pomocą order_status_change_webhook_url.

Przykłady Payload
śledzenie.zdarzenie

Wyzwala się przy każdym zdarzeniu cyklu życia śledzenia paczki. Konfiguruj za pomocą tracking_event_webhook_url. Zdarzenia doręczenia i odbioru zawierają także potwierdzenie doręczenia: proof_files oraz proof_files_detail (file_id, type, url, full_url, podpisany adres pobrania). Zdjęcia wgrane po zdarzeniu przychodzą jako pod.files_updated. Każdy plik zawiera też kontekst swojego zdarzenia: tracking_event_id, tracking_event_status_id, tracking_event_key, service_type (1 = delivery / 2 = pickup) oraz service_status (1 = success / 2 = failed); dla starych plików bez zapisanego zdarzenia są null.

Przykłady Payload
zamówienie.utwórz_async

Wyzwala się raz po zakończeniu przetwarzania importu wsadowego. Payload zawiera tablicę wyników na wiersz. Konfiguruj za pomocą order_create_async_postback_url.

Przykłady Payload
Pliki POD zaktualizowane

Wyzwalane, gdy zdjęcie dostawy lub podpis zostanie dodany, zastąpiony lub usunięty (action: added / updated / removed) — jedna wysyłka na plik, koniec z odpytywaniem o załączniki. Włączane przez pod_files_webhook_url. Każdy plik zawiera też kontekst swojego zdarzenia: tracking_event_id, tracking_event_status_id, tracking_event_key, service_type (1 = delivery / 2 = pickup) oraz service_status (1 = success / 2 = failed); dla starych plików bez zapisanego zdarzenia są null.

Przykłady Payload
Zamówienie usunięte

Wyzwalane, gdy zamówienie zostanie trwale usunięte, aby Twój system mógł odzwierciedlić usunięcie. Włączane przez order_deleted_webhook_url.

Przykłady Payload
Anulowanie zamówienia nie powiodło się

Wyzwalane, gdy próba anulowania zostanie odrzucona (np. zamówienie jest już w doręczeniu), aby Twoje procesy operacyjne mogły monitorować nieudane anulowania bez odpytywania API. Włączane przez order_cancel_failed_webhook_url.

Przykłady Payload
Zmiana miejsca na tablicy tras

Wyzwalane, gdy miejsce na tablicy tras zmienia właściciela lub tablica zmienia stan — pole action mówi, co się stało (claimed, standby, pooled, promoted, withdrawn, vetoed, replaced, assigned, awarded, lost, displaced, settled, board_opened, board_closed, board_cancelled). Tylko na poziomie firmy. Subskrypcja przez route_board_webhook_url.

Przykłady Payload

Zdarzenia skrytek dostawcaskich

Osobny kanał webhooków dla zewnętrznych dostawcaów doręczeń zintegrowanych z inteligentnymi skrytkami. Zdarzenia trafiają do punktu końcowego skonfigurowanego dla Twojego konta dostawcy, a każdy punkt końcowy może subskrybować dowolny podzbiór typów zdarzeń.

partner_locker.delivery.doors_opened

Drzwiczki Otwarte — Uruchamia się w momencie otwarcia drzwiczek skrytek dla próby doręczenia — niezależnie od tego, czy kurier wpisał kod dostępu na ekranie automatu, czy użył API zdalnego otwierania — w tym ponowne otwarcia po zmianie skrytki. Blok opening wymienia każdą otwartą skrytkę z grid_id, sprzętowym numerem drzwiczek compartment_number oraz pickup_locker_number (kolejnym numerem wyświetlania liczonym od góry do dołu w kolumnie, a następnie od lewej do prawej). Każda skrytka zawiera też pickup_locker_code — etykietę "{shelf_code}-{pickup_locker_number}", pod którą kierowany jest odbiorca; null, gdy skrytka nie ma numeru odbioru. Ładunek zawiera również pickup_code — kod odbioru dla odbiorcy, przydzielany w chwili otwarcia drzwiczek; po potwierdzeniu umieszczenia przesyłki przez kuriera pozostaje tym samym kodem, a do odbioru można go użyć dopiero po tym potwierdzeniu.

Przykłady Payload
partner_locker.delivery.delivered

Dostarczono do paczkomatu — Wyzwalane, gdy umieszczenie przesyłki zostanie potwierdzone i paczki są w skrytce. Ładunek zawiera kod odbioru odbiorcy. Każda skrytka zawiera też pickup_locker_code — etykietę "{shelf_code}-{pickup_locker_number}", pod którą kierowany jest odbiorca; null, gdy skrytka nie ma numeru odbioru. W przypadku skrytek otwartych przez API zdalnego otwierania platforma sama rozlicza umieszczenie, gdy tylko szafka zgłosi zamknięcie wszystkich otwartych skrytek, więc zdarzenie jest wyzwalane bez wywołania confirm; confirmed_by wskazuje ścieżkę rozliczenia: courier_terminal, partner_api, door_close, timeout_door_closed lub console.

Przykłady Payload
partner_locker.pickup.completed

Odebrano — Wyzwalane, gdy odbiorca odebrał umieszczone paczki.

Przykłady Payload
partner_locker.delivery.failed

Dostawa nieudana — Wyzwalane, gdy doręczenie się nie powiedzie; dołączone są kody błędów dla poszczególnych paczek.

Przykłady Payload
partner_locker.delivery.expired

Wygasło — Wyzwalane, gdy niewykorzystany kod doręczenia lub nieodebrana przesyłka przekroczy termin ważności.

Przykłady Payload
partner_locker.delivery.cancelled

Anulowano — Wyzwalane, gdy doręczenie zostanie anulowane przed ukończeniem.

Przykłady Payload
partner_locker.delivery.correction_reopened

Ponowne otwarcie korekcyjne — Wyzwalane, gdy zajęte skrytki zostaną ponownie otwarte w oknie korekty w celu poprawienia błędnego umieszczenia — z ekranu skrytki lub przez API. Blok correction wymienia ponownie otwarte skrytki. Każda skrytka zawiera też pickup_locker_code — etykietę "{shelf_code}-{pickup_locker_number}", pod którą kierowany jest odbiorca; null, gdy skrytka nie ma numeru odbioru.

Przykłady Payload
partner_locker.delivery.code_rotated

partner_locker_delivery.event_type_code_rotated — Uruchamia się, gdy partner wymienia kod doręczenia albo kod odbioru przesyłki. Blok rotation wskazuje, który kod wymieniono, kiedy i czy ponownie wysłano powiadomienie do odbiorcy — nowy kod nigdy nie podróżuje w webhooku; ujawniany jest wyłącznie w bezpośredniej odpowiedzi API wymiany.

Przykłady Payload

Podpis i Weryfikacja: Webhooki skrytek dostawcaskich używają własnego schematu podpisu: X-Webhook-Signature to base64(HMAC-SHA256(sekret, znacznik czasu + "\n" + id doręczenia + "\n" + surowa treść)), gdzie znacznik czasu i id doręczenia pochodzą z nagłówków X-Webhook-Timestamp i X-Webhook-Delivery-Id. Zweryfikuj też X-Webhook-Content-Digest (SHA-256 treści) i odrzucaj przeterminowane znaczniki czasu. X-Webhook-Id pozostaje stały między ponowieniami — użyj go do idempotencji.

Jak Skonfigurować: Punkty końcowe zarządzane są w Doręczenia zewnętrzne → Skrytka dostawcy → Ustawienia, jeden punkt końcowy na dostawcy, z wybieralną listą zdarzeń. Nieudane dostarczenia są ponawiane z wykładniczym odstępem do 7 razy, zanim trafią do martwej kolejki; zdarzenia z martwej kolejki można ręcznie wysłać ponownie ze strony zdarzeń.

Zdarzenia sandbox (makiety szafek): Dostarczenia utworzone na makietach szafek emitują te same zdarzenia webhook co produkcja, podpisane tym samym sekretem, dzięki czemu można rozwijać integrację na realistycznym ruchu. Zdarzenia sandbox są oznaczone na trzy sposoby: ładunek zawiera "livemode": false, event_id zaczyna się od PLE-MOCK-, a żądanie niesie nagłówek X-Webhook-Test: 1. Jeśli na punkcie końcowym skonfigurowano adres sandbox, zdarzenia sandbox trafiają tam zamiast na adres produkcyjny; w przeciwnym razie wracają na adres produkcyjny, nadal oznaczone. Przełącznik „Dostarczaj zdarzenia sandbox" całkowicie zatrzymuje dostarczanie sandbox.

Zdarzenia doręczeń zewnętrznych

Webhooki doręczeń paczek wysyłane do zewnętrznych dostawców doręczeń (kurierów). Obejmują cykl życia przydziałów doręczeń, dzięki czemu kurier nie musi już odpytywać o nowe zlecenia. Ta kategoria jest oddzielna od poniższych zdarzeń Smart Locker: każdy dostawca konfiguruje niezależny endpoint, sekret podpisu i subskrypcję zdarzeń dla każdej kategorii — we własnym portalu lub przez operatora platformy.

delivery.assignment.created

Przydział utworzony — Wyzwalane, gdy zamówienie zostaje przydzielone dostawcy — regułą automatyczną lub ręcznie. Payload zawiera numer przydziału, identyfikatory zamówienia i numery śledzenia paczek.

Przykłady Payload
delivery.assignment.handed_over

Paczki przekazane — Wyzwalane, gdy magazyn fizycznie przekazał dostawcy wszystkie paczki przydziału.

Przykłady Payload
delivery.assignment.cancelled

Przydział anulowany — Wyzwalane, gdy platforma wycofuje przydział od dostawcy. Pole reason rozróżnia: cancelled (przydział anulowano u przewoźnika), fallback_to_self_delivery (platforma przejęła zamówienie z powrotem do doręczeń własnych) oraz reassigned (zamówienie przeniesiono do innego dostawcy).

Przykłady Payload
delivery.assignment.partial_delivered

Dostawa częściowa — Uruchamia się, gdy część przesyłki została dostarczona, a pozostałe paczki są nadal w drodze. Tablica packages zawiera wynik każdej paczki, a legs wymienia zamówienia zewnętrzne złożone u przewoźnika — po jednym na paczkę, gdy przewoźnik nie przyjmuje przesyłek wielopaczkowych.

Przykłady Payload

Podpis i Weryfikacja: Webhooki doręczeń zewnętrznych używają tego samego schematu podpisu co webhooki skrytek dostawcaskich: X-Webhook-Signature to base64(HMAC-SHA256(secret, timestamp + "\n" + delivery id + "\n" + raw body)), przy czym timestamp i delivery id pochodzą z nagłówków X-Webhook-Timestamp i X-Webhook-Delivery-Id. Zweryfikuj także X-Webhook-Content-Digest (SHA-256 treści) i odrzucaj przeterminowane znaczniki czasu. X-Webhook-Id pozostaje stały między ponowieniami — używaj go do idempotencji.

Jak Skonfigurować: Dostawcy konfigurują ten endpoint samodzielnie w portalu dostawcy (Ustawienia webhooków) lub robi to operator platformy w Doręczenia zewnętrzne → Dostawcy → Webhooks. Jeden endpoint na dostawcę z wybieralną listą zdarzeń. Sekret podpisu może być generowany automatycznie lub ustawiony jako wartość niestandardowa i jest widoczny na stronie ustawień. Nieudane dostarczenia są ponawiane z wykładniczym odstępem do 7 razy, zanim trafią do martwej kolejki; zdarzenia z martwej kolejki można ponowić ręcznie. Ze strony ustawień można w każdej chwili wysłać podpisane zdarzenie testowe (mock) — żądania testowe niosą nagłówek X-Webhook-Test: 1 i zawierają "test": true w danych payloadu.

Zdarzenia cyklu życia zamówienia

Szczegółowe, opcjonalne zdarzenia obok klasycznego webhooka order.status_change (który pozostaje bez zmian): kto został przypisany, czy kierowca zaakceptował, kiedy paczka została odebrana, jest w drodze, dostarczona lub nieudana, a także zmiany dyżurów kierowców i ograniczone częstotliwościowo pozycje kierowców. Nic nie jest wysyłane, dopóki nie skonfigurujesz poniższych adresów URL.

order.assigned

Do zamówienia przypisano kierowcę (ręcznie, przez planowanie tras lub przez automatyczne przypisywanie). data.source = auto_assign, gdy zrobił to orkiestrator.

Przykłady Payload
order.unassigned

Zamówienie straciło kierowcę (przekazanie, cofnięcie, odrzucenie, przekroczenie czasu). data.previous_driver_id wskazuje, kto je miał.

Przykłady Payload
order.accepted

Kierowca zaakceptował w aplikacji automatycznie przypisane zamówienie (dyżury kierowców z wymaganą akceptacją).

Przykłady Payload
order.rejected

Kierowca odrzucił przypisane zamówienie; data.reason zawiera opcjonalny powód w formie dowolnego tekstu.

Przykłady Payload
order.pickup_started

Kierowca rozpoczął odbiór (status Rozpoczęto odbiór / W odbiorze).

Przykłady Payload
order.picked_up

Paczka została odebrana (status Już odebrane).

Przykłady Payload
order.on_the_way

Paczka jest w drodze do odbiorcy (status Rozpoczęto dostawę / W dostawie).

Przykłady Payload
order.completed

Dostawa zakończyła się powodzeniem (status Zakończone sukcesem).

Przykłady Payload
order.failed

Próba dostawy nie powiodła się (Doręczyć później, Wymaga zmiany terminu, Odrzucone przez odbiorcę).

Przykłady Payload
order.cancelled

Zamówienie zostało anulowane.

Przykłady Payload
order.ready

Personel (lub kierowca, jeśli dozwolone) oznaczył zamówienie jako gotowe do odbioru (Opcje dyspozycji → gotowe do odbioru).

Przykłady Payload
driver.on_duty_changed

Kierowca rozpoczął lub zakończył dyżur w aplikacji (opcja dyżurów kierowców).

Przykłady Payload
driver.location_update

Pozycja kierowcy z aplikacji lub lokalizatora, ograniczana per kierowca przez driver_location_min_interval_sec (domyślnie 60 s). Wysyłana tylko na driver_location_webhook_url.

Przykłady Payload

Jak Skonfigurować: Ustawienia → Webhooki (lub GET/PUT /api/v1/webhook-settings, GraphQL webhookSettingsUpdate): order_lifecycle_webhook_url otrzymuje każde zdarzenie order.* oraz driver.on_duty_changed; order_lifecycle_events zawęża to do listy rozdzielonej przecinkami; driver_location_webhook_url i driver_location_min_interval_sec sterują driver.location_update. Kilka adresów URL można rozdzielić przecinkami. Doręczenia pojawiają się w dzienniku doręczeń webhooków z reference_type order / driver.

Podpis i Weryfikacja: Podpisywane dokładnie tak jak każdy inny wychodzący webhook Twojego konta: starszy nagłówek Signature oraz X-Webhook-Id / X-Webhook-Timestamp / X-Webhook-Signature-V2 z Twoim webhook_sign_secret. Ponowne próby używają tego samego event_id – deduplikuj na jego podstawie.

Zdarzenia zamówień w urządzeniach

Opcjonalne zdarzenia dla paczek obsługiwanych przez Twoje inteligentne szafki, kioski i skrzynki smart drop: paczka umieszczona w urządzeniu, odebrana, wyjęta przez personel lub po terminie odbioru, a także problemy otwarte lub rozwiązane w jej sprawie. Wyłącznie rozszerzenie — żaden istniejący webhook się nie zmienia i nic nie jest wysyłane, dopóki nie skonfigurujesz device_order_webhook_url.

device_order.stored

Paczka została umieszczona w urządzeniu i czeka na kolejną osobę (odbiorcę, kuriera lub operatora, zobacz data.device_order.next_actor). due_at to termin odbioru.

Przykłady Payload
device_order.collected

Paczkę wyjęła osoba, na którą czekała — odbiorca, kurier lub personel opróżniający skrzynkę smart drop.

Przykłady Payload
device_order.removed

Personel wyjął paczkę z urządzenia. removal_reason podaje powód: overdue_return, handover, relay, anomaly lub recovery.

Przykłady Payload
device_order.overdue

Paczka przekroczyła due_at bez odbioru. Nadal jest w urządzeniu, a jej kod wciąż działa; ustawiane jest overdue_at, a next_actor zmienia się na operator.

Przykłady Payload
device_order.exception_opened

Otwarto problem dotyczący obsługi (na przykład door_left_open, deposit_unverified, item_missing, overdue). data.exception zawiera id, type, severity i status.

Przykłady Payload
device_order.exception_resolved

Osoba zamknęła problem dotyczący obsługi. data.exception.status ma wartość resolved lub dismissed, a resolution_action określa, co zrobiono.

Przykłady Payload

Przykłady Payload: data.device_order: id, kind, status, next_actor, device_type, device_id, device_name, grid_code, reference_number, order_id, external_order_id, due_at, overdue_at, stored_at, ended_at, removal_reason (czasy w formacie ISO 8601, null, dopóki nie nastąpią). Zdarzenia problemów dodają data.exception: id, type, severity, status, resolution_action. Kod odbioru nigdy nie jest dołączany. event_id ma postać DOE-<id zdarzenia rejestru> i nie zmienia się przy ponownych próbach.

Jak Skonfigurować: Ustawienia → Webhooki (lub GET/PUT /api/v1/webhook-settings): device_order_webhook_url otrzymuje każde zdarzenie device_order.*; device_order_events zawęża to do listy rozdzielonej przecinkami. Można podać kilka adresów URL rozdzielonych przecinkami. Dostarczenia pojawiają się w dzienniku dostarczeń webhooków z reference_type device_order.

Podpis i Weryfikacja: Podpisywane dokładnie tak jak każdy inny wychodzący webhook Twojego konta: starszy nagłówek Signature oraz X-Webhook-Id / X-Webhook-Timestamp / X-Webhook-Signature-V2 z Twoim webhook_sign_secret. Ponowne próby używają tego samego event_id – deduplikuj na jego podstawie.

Paczki, które przewoźnik partnerski dostarcza do Twoich szafek na własnym koncie, nie są wysyłane tym kanałem; partner otrzymuje je przez własne webhooki szafek dostawcy.

Jak Skonfigurować

Webhooki można konfigurować na dwóch poziomach: firmy (obejmuje wszystko) lub klienta (nadpisuje dla konkretnego subkonta B2B).

1. Przejdź do ustawień

Zaloguj się i przejdź do Ustawienia → API i Webhooki. Nadpisania per klient są na stronie szczegółów klienta.

2. Ustaw sekret podpisu

Wybierz ciąg co najmniej 16-znakowy, najlepiej 32+ losowych bajtów. Odbiorca użyje go do weryfikacji podpisów.

3. Ustaw żądane URL-e zdarzeń

Wypełnij tylko URL-e zdarzeń, którymi jesteś zainteresowany. Resztę pozostaw pustą.

webhook_sign_secretKonfigurujesz wspólny sekret na stronie ustawień. Każdy wychodzący webhook jest nim podpisywany. Twój odbiorca przelicza podpis i porównuje — jeśli się zgadzają, payload jest autentyczny i nietknięty.
Order_create_webhook_urlWyzwala się przy utworzeniu zamówienia dostawy lokalnej (Delivery / Pickup / P2P) dowolną drogą: formularz web, REST/GraphQL API, synchronizacja platformy e-commerce, automatyczne reguły, wiersze importu itd. Wyklucza zamówienia label-service i inne typy nie-dostawcze. Pomijany w przepływie batch, gdy ten sam odbiorca ma również skonfigurowany order_create_async_postback_url. Konfiguruj za pomocą order_create_webhook_url.
Order_status_change_webhook_urlWyzwala się przy każdej zmianie statusu — odebrane, w tranzycie, dostarczone, wyjątek, anulowane. Konfiguruj za pomocą order_status_change_webhook_url.
śledzenia_event_webhook_urlWyzwala się przy każdym zdarzeniu cyklu życia śledzenia paczki. Konfiguruj za pomocą tracking_event_webhook_url. Zdarzenia doręczenia i odbioru zawierają także potwierdzenie doręczenia: proof_files oraz proof_files_detail (file_id, type, url, full_url, podpisany adres pobrania). Zdjęcia wgrane po zdarzeniu przychodzą jako pod.files_updated. Każdy plik zawiera też kontekst swojego zdarzenia: tracking_event_id, tracking_event_status_id, tracking_event_key, service_type (1 = delivery / 2 = pickup) oraz service_status (1 = success / 2 = failed); dla starych plików bez zapisanego zdarzenia są null.
Order_create_async_postback_urlWyzwala się raz po zakończeniu przetwarzania importu wsadowego. Payload zawiera tablicę wyników na wiersz. Konfiguruj za pomocą order_create_async_postback_url.
pod_files_webhook_urlWyzwalane, gdy zdjęcie dostawy lub podpis zostanie dodany, zastąpiony lub usunięty (action: added / updated / removed) — jedna wysyłka na plik, koniec z odpytywaniem o załączniki. Włączane przez pod_files_webhook_url. Każdy plik zawiera też kontekst swojego zdarzenia: tracking_event_id, tracking_event_status_id, tracking_event_key, service_type (1 = delivery / 2 = pickup) oraz service_status (1 = success / 2 = failed); dla starych plików bez zapisanego zdarzenia są null.
order_deleted_webhook_urlWyzwalane, gdy zamówienie zostanie trwale usunięte, aby Twój system mógł odzwierciedlić usunięcie. Włączane przez order_deleted_webhook_url.
order_cancel_failed_webhook_urlWyzwalane, gdy próba anulowania zostanie odrzucona (np. zamówienie jest już w doręczeniu), aby Twoje procesy operacyjne mogły monitorować nieudane anulowania bez odpytywania API. Włączane przez order_cancel_failed_webhook_url.
route_board_webhook_urlWyzwalane, gdy miejsce na tablicy tras zmienia właściciela lub tablica zmienia stan — pole action mówi, co się stało (claimed, standby, pooled, promoted, withdrawn, vetoed, replaced, assigned, awarded, lost, displaced, settled, board_opened, board_closed, board_cancelled). Tylko na poziomie firmy. Subskrypcja przez route_board_webhook_url.
device_order_webhook_urlOpcjonalne zdarzenia dla paczek obsługiwanych przez Twoje inteligentne szafki, kioski i skrzynki smart drop: paczka umieszczona w urządzeniu, odebrana, wyjęta przez personel lub po terminie odbioru, a także problemy otwarte lub rozwiązane w jej sprawie. Wyłącznie rozszerzenie — żaden istniejący webhook się nie zmienia i nic nie jest wysyłane, dopóki nie skonfigurujesz device_order_webhook_url.
Przewodnik po nowościach integracji

Wszystkie nowości w API i webhookach — idempotentne anulowanie, kanały uzgodnień, podpisy v2, nowe zdarzenia — z gotowymi przykładami. Wszystko w pełni wstecznie kompatybilne.

Podpis i Weryfikacja

Każdy wychodzący webhook zawiera podpis HMAC-SHA256 w formacie hex w nagłówku. Odbiorca musi ponownie obliczyć podpis na surowym body z użyciem wspólnego sekretu i odrzucić żądanie, jeśli się nie zgadza.

Algorytm
HMAC-SHA256 (hex)
Nazwa nagłówka
Signature
Kroki weryfikacji
  1. Odczytaj surowe body, zanim parsing lub middleware je zmodyfikują.
  2. Oblicz hash_hmac('sha256', rawBody, sharedSecret) i zakoduj w hex.
  3. Porównaj z nagłówkiem Signature w czasie stałym (hash_equals w PHP, crypto.timingSafeEqual w Node).
  4. Odpowiedz 2xx tylko gdy podpisy się zgadzają. W przeciwnym razie 401.
<?php $rawBody = file_get_contents('php://input'); $received = $_SERVER['HTTP_SIGNATURE'] ?? ''; $expected = hash_hmac('sha256', $rawBody, $sharedSecret); if (!hash_equals($expected, $received)) { http_response_code(401); exit('Bad signature'); } $payload = json_decode($rawBody, true); // ... handle event ... http_response_code(200); echo 'ok';
const crypto = require('crypto'); const express = require('express'); const app = express(); app.use('/webhooks/superroute', express.raw({ type: 'application/json' }), (req, res) => { const received = req.header('Signature') || ''; const expected = crypto.createHmac('sha256', sharedSecret) .update(req.body).digest('hex'); if (!crypto.timingSafeEqual(Buffer.from(received), Buffer.from(expected))) { return res.status(401).send('Bad signature'); } const payload = JSON.parse(req.body.toString()); // ... handle event ... res.status(200).send('ok'); });
import hmac, hashlib from flask import Flask, request, abort app = Flask(__name__) @app.route('/webhooks/superroute', methods=['POST']) def webhook(): received = request.headers.get('Signature', '') expected = hmac.new(shared_secret.encode(), request.data, hashlib.sha256).hexdigest() if not hmac.compare_digest(received, expected): abort(401) payload = request.get_json() # ... handle event ... return 'ok', 200
func handleWebhook(w http.ResponseWriter, r *http.Request) { body, _ := io.ReadAll(r.Body) received := r.Header.Get("Signature") mac := hmac.New(sha256.New, []byte(sharedSecret)) mac.Write(body) expected := hex.EncodeToString(mac.Sum(nil)) if !hmac.Equal([]byte(received), []byte(expected)) { w.WriteHeader(401); return } // ... handle event ... w.WriteHeader(200) w.Write([]byte("ok")) }
require 'openssl' require 'rack/utils' post '/webhooks/superroute' do raw = request.body.read received = request.env['HTTP_SIGNATURE'] || '' expected = OpenSSL::HMAC.hexdigest('sha256', shared_secret, raw) halt 401 unless Rack::Utils.secure_compare(received, expected) payload = JSON.parse(raw) # ... handle event ... status 200 'ok' end

Ponowienia i Niezawodność

Twój endpoint powinien szybko odpowiedzieć 2xx. W przeciwnym razie, przy timeout lub nieosiągalności, dostarczenie jest ponawiane.

Maks. prób
5 (pierwsza + 4 ponowienia)
Timeout na próbę
3 sekundy
Odwrót
Wykładniczy — ok. 10s, 100s, 1000s, 10000s
Buduj idempotentnie. Ponieważ dostarczenie może zostać ponowione, odbiorca może zobaczyć to samo zdarzenie wielokrotnie. Użyj ID zamówienia/śledzenia jako klucza deduplikacji — przechowuj przetworzone ID przez co najmniej 24 godziny.
Zalecana odpowiedź. Szybko potwierdź (HTTP 200) i przetwarzaj asynchronicznie. Unikaj wolnych operacji synchronicznie w handlerze — uderzy w timeout 3 sekund.

Weryfikator Podpisu

Wklej otrzymany payload, wartość nagłówka Signature i swój sekret — narzędzie przelicza podpis w przeglądarce (nic nie opuszcza tej strony) i mówi, czy się zgadza.

Wyślij Testowy Webhook

Wystrzel prawdziwy, poprawnie podpisany webhook z naszego serwera na podany przez Ciebie URL. Użyj do testowania osiągalności odbiorcy, parsowania payload i logiki weryfikacji podpisu.

Ostatnie Dostarczenia Webhook

Zobacz ostatnie próby dostarczenia webhook na Twoim koncie — zarówno rzeczywiste zdarzenia produkcyjne, jak i testy z tej strony. Wklej Bearer token, aby wczytać.

Czas Zdarzenie URL Stan HTTP Próba Czas (ms) Testować? Akcje
Brak dostarczeń webhook.

Najlepsze Praktyki