Otrzymuj zdarzenia w czasie rzeczywistym od Superroute — zamówienia, zmiany statusu, aktualizacje śledzenia. Z podpisanymi payload-ami, automatycznymi ponowieniami i wbudowanym debuggerem.
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.
Wyzwala się przy każdej zmianie statusu — odebrane, w tranzycie, dostarczone, wyjątek, anulowane. Konfiguruj za pomocą order_status_change_webhook_url.
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
{
"id": 90001,
"order_id": 1001,
"order_ref": "REF-001",
"location_id": 12,
"location_name": "Toronto Depot",
"tracking_event_type": "D",
"tracking_event_status_id": 500,
"tracking_event_key": "deliver_success",
"otep_status": "delivered",
"proof_files": [
"storage/2026-07-20/1001_S_Ab3kQ9xYzLm4Np.jpeg",
"storage/2026-07-20/1001_P_Cd7rT2wVuKe8Hs.jpeg"
],
"proof_files_detail": [
{
"file_id": 234567,
"type": 1,
"url": "storage/2026-07-20/1001_S_Ab3kQ9xYzLm4Np.jpeg",
"full_url": "https://api.superroute.ca/storage/2026-07-20/1001_S_Ab3kQ9xYzLm4Np.jpeg",
"signed_url": "https://api.superroute.ca/files/pod/234567?expires=1784748600&signature=8f2c1d...",
"signed_url_expires_at": 1784748600,
"tracking_event_id": 90001,
"tracking_event_status_id": 500,
"tracking_event_key": "deliver_success",
"service_type": 1,
"service_status": 1
},
{
"file_id": 234568,
"type": 2,
"url": "storage/2026-07-20/1001_P_Cd7rT2wVuKe8Hs.jpeg",
"full_url": "https://api.superroute.ca/storage/2026-07-20/1001_P_Cd7rT2wVuKe8Hs.jpeg",
"signed_url": "https://api.superroute.ca/files/pod/234568?expires=1784748600&signature=41ba90...",
"signed_url_expires_at": 1784748600,
"tracking_event_id": 90001,
"tracking_event_status_id": 500,
"tracking_event_key": "deliver_success",
"service_type": 1,
"service_status": 1
}
],
"description": {
"en": "Your parcel has been delivered successfully. Thank you!",
"fr": "Votre colis a été livré avec succès. Merci !",
"chs": "您的包裹已成功送达,感谢您的使用!",
"cht": "您的包裹已成功送達,感謝您的使用!",
"es": "Tu paquete ha sido entregado con éxito. ¡Gracias!",
"de": "Ihr Paket wurde erfolgreich zugestellt. Vielen Dank!",
"nl": "Uw pakket is succesvol afgeleverd, bedankt voor uw gebruik!",
"pt": "Seu pacote foi entregue com sucesso. Obrigado!",
"it": "Il tuo pacco è stato consegnato con successo. Grazie!",
"sr": "Vaš paket je uspešno dostavljen, hvala vam što koristite naše usluge!",
"hu": "Csomagja sikeresen kiszállításra került, köszönjük hogy használta szolgáltatásunkat!",
"pl": "Twoja paczka została dostarczona pomyślnie. Dziękujemy!",
"sk": "Váš balík bol úspešne doručený. Ďakujeme!",
"cs": "Váš balík byl úspěšně doručen. Děkujeme!"
},
"tracking_number": [
"SR000000001"
],
"external_tracking_number": [
"1Z999AA10123456784"
]
}
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.
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.
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
{
"result": false,
"code": "ORDER_ALREADY_IN_DELIVERY",
"message": "Order can no longer be cancelled at its current status",
"http_status": 409,
"submitted": {
"order_id": 1001,
"tracking_number": "SR000000001",
"external_tracking_number": null
}
}
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.
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.
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.
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.
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.
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.
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).
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.
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.
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.
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.
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.
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: 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.
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
Odczytaj surowe body, zanim parsing lub middleware je zmodyfikują.
Oblicz hash_hmac('sha256', rawBody, sharedSecret) i zakoduj w hex.
Porównaj z nagłówkiem Signature w czasie stałym (hash_equals w PHP, crypto.timingSafeEqual w Node).
Odpowiedz 2xx tylko gdy podpisy się zgadzają. W przeciwnym razie 401.
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
Szybko potwierdź (HTTP 200) i przetwarzaj asynchronicznie, aby zmieścić się w timeout 3 sekund.
Zawsze weryfikuj podpis przed zaufaniem payload.
Traktuj zdarzenia jako at-least-once — deduplikuj po numerze zamówienia/śledzenia.
Używaj endpointów HTTPS z ważnym certyfikatem.
Loguj przychodzące żądania, aby móc je odtworzyć w przypadku błędu w handlerze.