Nastavení a zabezpečení webhooků

Konfigurace webhooků v PSB: topiky, zabezpečení HMAC SHA256 a IP whitelisting.

Webhooky jsou primární způsob přijímání notifikací v reálném čase z PSB. Při každé relevantní události, přijaté faktuře, změně stavu, potvrzení doručení, PSB odešle HTTP POST request na Váš endpoint s podrobnostmi o události.

Jak webhooky v PSB fungují?

V PSB zaregistrujete webhook ("hook") s URL a topikem. PSB následně odesílá všechny události daného topiku na Vaši URL. Každá událost obsahuje příslušná data jako JSON payload.

Vytvoření webhooku

Žádné uživatelské rozhraní k dispozici: v současné době není možné konfigurovat hook přes uživatelské rozhraní platformy. Hooky se nastavují přes API nebo přes podporu eConnect. Rozhraní samoobsluhy pro hooky je v plánu (plánované na Q4 2026) a bude součástí Control (Platform 2.0): uživatelé pak budou moci hooky sami vytvářet, upravovat a mazat. Do té doby není plánován žádný podrobný návod pro ruční konfiguraci hooků přes API.

Zaregistrujte hook přes API:

POST /api/v1/hook

Nejdůležitější konfigurační parametry:

PolePopisurlHTTPS endpoint, na který PSB odesílá událostitopicTyp události, na kterou chcete reagovat (např. InvoiceReceived)secretTajný klíč pro ověření HMAC podpisu

Poznámka: vyhněte se rychlému mazání a opětovnému vytváření hooků pro stejné partyId a topik. Kvůli race conditions při zpracování úloh to může dočasně vést k tomu, že neexistuje žádný aktivní hook, a události tak nebudou doručeny. Po smazání hooku chvíli počkejte, než vytvoříte nový, nebo místo smazání a opětovného vytvoření použijte aktualizaci.

Přidání topiku k existujícímu hooku

Chcete přidat další topik (např. InvoiceReceived) k existujícímu hooku? Aktualizujte stávající konfiguraci webhooku prostřednictvím standardního API /hook, aby požadovaný topik byl obsažen v poli topics:

{
  "topics": ["InvoiceReceived"]
}

Aktualizujte stávající hook místo jeho smazání a opětovného vytvoření. Mazání a opětovné vytváření způsobuje race condition, při které mohou být události dočasně nedoručeny (viz upozornění výše).

Není samoobslužnou pro netechnické zákazníky. Přidání topiku k existujícímu hooku je technický úkol: osoba, která jej provádí, musí vědět, kam má webhook směřovat (URL endpointu), a rozumět tomu, co je webhook. Netechnický zákazník to zpravidla nemůže udělat samostatně. Zapojte někoho s technickými znalostmi (IT zákazníka nebo podpora eConnect).

Nejpoužívanější topiky
TopikKdyInvoiceReceivedByla přijata nákupní fakturaInvoiceSentProdejní faktura byla úspěšně odeslánaInvoiceSentErrorProdejní faktura nemohla být doručenaInvoiceSentRetryByl spuštěn pokus o opětovné odesláníInvoiceResponseReceivedByla přijata Invoice Response (stavové zprávy)OrderReceivedByla přijata nákupní objednávka
Message Level Status (MLS)

MLS (Message Level Status) je nástupcem staršího MLR a poskytuje odesílajicí straně zpětnou vazbu o přijetí a zpracování dokumentu. MLS není standardně aktivován a musí být nastaven pro každou party prostřednictvím capability reviews v konfiguraci SMP. Jakmile je MLS aktivován, PSB ho zpracovává automaticky: jako přijímající Service Provider odesílá PSB zprávu MLS zpět odesílateli po přijetí a doručení.

Když sami odesíláte dokumenty přes PSB, dostáváte zpětnou vazbu MLS od přijímající strany jako webhook událost na topicu MessageLevelStatusReceived. Jako přijímající Service Provider následuje samostatný webhook s topicem MessageLevelStatusSent, jakmile PSB vaším jménem odesle MLS odesílajícímu SP. Pomocí tohoto topicu sledujte, zda jsou vaše vlastní vydané MLS odpovědi správně doručovány.

MessageLevelStatusSent není potvrzením odeslané faktury. Topic se týká MLS, které PSB odesílá jako odpověď na přijatý dokument (Vy, jako přijímající SP, odesíláte stavovou notifikaci zpět původnímu odesílateli), nikoli o e-fakturu, kterou jste sami odeslali. Pokud vidíte mnoho notifikací MessageLevelStatusSent při málo odeslaných fakturach: zkontrolujte, zda hook poslouchá na wildcardu *sent namísto konkrétně na InvoiceSent (viz Wildcard topiky).

Zabezpečení webhooků pomocí HMAC

PSB zabezpečuje všechna doručení webhooků pomocí HMAC SHA256 podpisů. Při každém requestu PSB odesílá hlavičku:

X-EConnect-Signature: sha256={podpis}
Implementace ověření

Pro ověření podpisu:

  1. Získejte surový JSON payload z requestu.
  2. Vypočítejte HMAC SHA256 hash pomocí Vašeho tajného klíče (stejný, který jste zadali při vytváření hooku).
  3. Porovnejte vypočítaný hash s hodnotou v hlavičce X-EConnect-Signature.
  4. Pokud se shodují, request je autentický.
Prevence replay útoků

Zkontrolujte také pole sentOn v payloadu. Pokud je tento časový údaj starší než 5 minut, request odmítněte. Tím se zabrání replay útokům, při kterých se zachycený request později opětovně přehraje.

Další bezpečnostní možnosti

Kromě HMAC ověření nabízí PSB další bezpečnostní vrstvy:

  • IP whitelisting: omezte přicházející requesty na produkční IP adresy PSB (104.40.188.59 a 104.47.148.207)
  • OAuth webhook autentizace: PSB se může autentizovat na Vašem endpointu pomocí OAuth2 credentials
  • Mutual SSL: použijte klientské certifikáty pro vzájemnou TLS autentizaci
Pořadí priorit

Pokud máte nakonfigurováno více hooků, PSB určí, který hook se použije, na základě:

  1. Hooky na úrovni PartyId mají přednost před hooky na úrovni prostředí
  2. Specifické topiky mají přednost před wildcardy
  3. Pokud více hooků s filtry odpovídá stejnému topiku: vyhrává nejdelší filtr (podle počtu znaků) -- například filtr s další klauzulí && vyhrává nad kratším filtrem bez této klauzule. To zabraňuje duplicitnímu doručení, aniž by filtry musely být vzájemně vylučující.
  4. Při stejné prioritě: hook-id jako rozhodující faktor
Wildcard topiky

Kromě konkrétních topiků můžete také používat wildcard vzory k zachycení více typů událostí jedním hookem.

VzorOdpovídáSend*Všechny topiky s prefixem Send*sent / *SentVšechny topiky končící na Sent: InvoiceSent, InvoiceResponseSent, OrderSent, MessageLevelStatusSent, HookSent*ReceivedVšechny události příjmu (InvoiceReceived, OrderReceived, InvoiceResponseReceived atd.)Invoice*Všechny události související s fakturami

Send* není to samé co *sent. Send* odpovídá topikům začínajícím na Send; tento vzor se u standardních topiků PSB nevyskytuje. Chcete-li zachytit všechny "sent" události (InvoiceSent, MessageLevelStatusSent, HookSent atd.), použijte *sent. InvoiceSentRetry a InvoiceSentError nekončí na Sent, a proto nejsou pokryty příponou *sent.

Řešení problémů

Níže jsou uvedeny běžné problémy s webhooky a jak je vyřešit.

PříznakPříčinaŘešeníWebhooky nedocházejíEndpoint nedostůpný (timeout 100 sek.)Vyżadováno HTTPS + platný SSL certifikát; deaktivovat ochranu CSRF na webhook endpointuWebhook odmítnut jako nezabezpečenýValidace X-EConnect-Signature selháZkontrolovat výpočet HMAC SHA256: payload × secret → šestnáctkový řetězec s prefixem sha256=Blokován replay útoKPole sentOn starší než 5 minutEndpoint zpracovává příliš pomalu nebo jsou špatně nastavené hodiny"No such host is known" (chyba DNS)Název hostitele webhook endpointu již nelze přeložit, např. po přejmenování prostředí ERP nebo vypršení DNS záznamuZkontrolovat a obnovit DNS záznam domény endpointu; poté získat změškané události přes batch endpointHookSentError (definitivní selhání)PSB se pokoušel 5 dní bez odpovědi 2xxZkontrolovat logy endpointu; sledovat topic HookSentError (viz níže); získat změškané události přes batch endpointEndpoint offline / opakované HTTP 404 (akceptace nebo produkce)Endpoint zákazníka dočasně vypnut (vývoj, údržba) nebo skutečně nedostupnýNejprve ověřit, zda je výpadek záměrný a dočasný (viz níže); nejde o incident platformy eConnectStaré faktury znovu doručenyAPI při prvním příjmu nevrací 2xxEndpoint musí vždy vracet 2xx, i pro asynchronní zpracováníDuplicitní zpracování při opakováníŽádná kontrola idempotencePoužít záhlaví X-EConnect-Delivery (unikátní UUID) pro deduplikaciFaktura přijata, ale nikam nedorazí; žádné chyby webhooku nejsou vidětPSB přijal příchozí fakturu (topic InvoiceReceived), ale na tomto topicu není registrován žádný hook (nikdy nenastaven, nebo mezitím odstraněn)Nejprve zkontrolovat konfiguraci hooku: je InvoiceReceived uveden v topicech? Bez hooku na tomto topicu se nezobrazí žádný HookSentError, takže absence chybových hlášení nedokazuje, že hook je aktivníMnoho e-mailů MessageLevelStatusSent při málo odeslaných fakturachMail-hook (mailto:) nebo HTTP webhook poslouchá na wildcardu *sent namísto na InvoiceSentZměnit konfiguraci topicu na InvoiceSent (stejná změna na mail-hooku i na HTTP webhooku); viz Wildcard topiky
Faktura přijata, ale nikam nedoručena (žádný hook InvoiceReceived)

PSB může přijmout příchozí fakturu, aniž by ji předal příjemci. Topic InvoiceReceived znamená, že PSB fakturu přijal; bez hooku na tomto topicu není nic odesláno na endpoint.

  • Žádné chyby webhooku nejsou důkazem, že hook funguje. HookSentError existuje pouze tehdy, když je nakonfigurován hook, který se nedoručí.
  • Hook mohl být mezitím odstraněn. Dřívější úspěšné doručení stejné straně/endpointu dokazuje, že hook existoval, ne že tam ještě je. Proto nejprve zkontrolujte aktuální konfiguraci hooku, než to budete považovat za první nastavení.
  • Potvrzení příjmu na straně odesílatele není to samé jako doručení příjemcovu softwaru.

Chybějící hook opravte aktualizací stávajícího hooku místo jeho smazání a znovuvytvoření.

Monitorování a obnova po HookSentError

PSB posílá webhook události (např. InvoiceReceived při přijetí e-faktury) na konfigurovaný endpoint. Pokud tento endpoint není dostupný — kvůli timeoutu, chybě SSL nebo chybě DNS jako No such host is known — PSB opakuje s exponenciálním zpětným krokem po dobu 5 dní (timeout 100 sek. na pokus). Každý pokus generuje událost HookSentRetry; po 5 dnech bez odpovědi 2xx je vydán HookSentError jako konečný stav a PSB přestává opakovat.

Důsledek: přijatá e-faktura nebude doručena zákazníkovi, dokud je endpoint nedostupný, aniž by to zákazník přímo zjistil. Doporučené kroky:

  • Nastavéní monitorování: přihlásit hook (např. mail-hook) k topicu HookSentError, aby bylo definitivní selhání doručení aktivně signalizováno místo tichého přeskokování. Zvážit také HookSentRetry pro včasné odhalení.
  • Odstranienie příčiny: při chybě DNS zkontrolovat a obnovit DNS záznam domény endpointu; při timeoutech zajistit rychlejší odpověď endpointu (2xx do 100 sek., náročné zpracování asynchronně).
  • Obnova změškaných událostí: události, které se během výpadku nezdařily, lze získat přes batch endpoint. Pětidenní okno opakování znamená, že včasná oprava v tomto období může ještě dohnat zásilání přes standardní doručování.

První linie: výpadek na straně zákazníka vs. technický problém (akceptace a produkce)

HookSentError, opakované HTTP 404 nebo "endpoint je offline"/"akceptační prostředí je vypnuto" může také vyplývat z toho, že zákazník dočasně vypne akceptační nebo produkční endpoint (vývoj, údržba). To není incident platformy eConnect.

  1. Potvrdit příznak: HookSentError, endpoint offline nebo HTTP 404 na webhook endpointu nakonfigurovaném zákazníkem. Často viditelné jako přesný text Response status code does not indicate success: 404 (Not Found) (obvykle .NET HttpRequestException při odchozím požadavku hooku). Jde o 404 z vlastního endpointu zákazníka (vypnutý nebo špatná cesta), ne o chybu Peppol PartyId not found při odeslání (SMP 404), ani o REST resource 404 z obsluhy chyb API.
  2. Zeptat se, zda je výpadek záměrný a dočasný (vývojáři/zákazník).
  3. Potvrzeno jako dočasné → poznámka, žádná další akce na straně eConnectu, dokud endpoint opět není dostupný. Jakmile endpoint znovu vrací 2xx, lze změškané události získat přes batch endpoint.
  4. Není záměrné nebo neznámé → postupovat podle standardního runbooku HookSentError výše (DNS/SSL/timeout, logy, monitorování, batch obnova).
Osvědčené postupy
  • Používejte vždy HTTPS pro Váš webhook endpoint
  • Implementujte idempotentní zpracování: PSB může ve vzácných případech doručit událost vícekrát
  • Vraťte rychle 2xx stavový kód: PSB považuje každou ne-2xx odpověď za chybu a pokusí se o opětovné doručení
  • Zaznamenávejte všechny přijaté události pro účely ladění a auditingu
  • Používejte systém fronty (queue) na Vaší straně, pokud zpracování trvá déle, potvrďte přijetí nejprve a zpracujte poté
Často kladené otázky
Jak ověřím příchozí webhook pomocí HMAC SHA256?

Vezměte surové JSON tělo requestu, vypočítejte HMAC SHA256 hash pomocí secretu, který jste zadali při vytváření hooku, a porovnejte ho s hodnotou v hlavičce X-EConnect-Signature (za prefixem sha256=). Pokud se shodují, víte, že request pochází z PSB a nebyl během přenosu upraven.

Proč je třeba kontrolovat pole sentOn v payloadu?

Ověřte, že sentOn není starší než 5 minut. Pokud je časové razítko příliš staré, request odmítněte. Tím zabráníte útokům typu replay, při kterých se dříve zachycený request znovu odešle později, i když je podpis technicky správný.

Jak předejít problémům s idempotentním zpracováním a opakováním?

Implementujte idempotentní zpracování na Vaší straně, protože PSB může ve vzácných případech doručit událost vícekrát. Také rychle vraťte HTTP 2xx stavový kód: každá jiná odpověď se považuje za chybu a spustí opakování. Pro náročné zpracování nejprve potvrďte příjem a poté zpracujte přes frontu.

Co znamená HookSentError nebo endpoint, který vypadá na akceptaci nebo produkci offline?

HookSentError následuje po té, co se PSB pokoušel 5 dní bez odpovědi 2xx. Opakované HTTP 404 nebo zpráva, že endpoint je offline, často vyplývá z toho, že zákazník dočasně vypne akceptační nebo produkční endpoint (vývoj, údržba) -- nejde o incident platformy eConnect. Nejprve potvrdit, zda je výpadek záměrný a dočasný; pokud ano, není potřeba žádná další akce, dokud endpoint opět není dostupný. Změškané události lze stále získat přes batch endpoint během pětidenního okna opakování.

Proč dostávám mnoho e-mailů MessageLevelStatusSent, i když odesílám málo faktur?

Je to očekávané chování, pokud mail-hook (mailto:) nebo HTTP webhook poslouchá na wildcardu *sent namísto konkrétně na InvoiceSent. MessageLevelStatusSent není potvrzením sami odeslané faktury, ale MLS, které PSB odesílá jako odpověď na přijatý dokument, a spadá pod vzor *sent společně s InvoiceSent, OrderSent a HookSent. Pokud chcete notifikace pouze při odesílání faktur, změňte konfiguraci topicu na InvoiceSent. InvoiceSentRetry a InvoiceSentError nekončí na Sent, a proto nejsou pokryty *sent.


Chcete dokumenty raději získávat hromadně? Podívejte se na batch hook.

Podívejte se na webhook endpointy

Související