Nastavenie a zabezpečenie webhookov

Konfigurácia webhookov v PSB: topiky, zabezpečenie HMAC SHA256 a IP whitelisting.

Webhooky sú primárny spôsob prijímania notifikácií v reálnom čase z PSB. Pri každej relevantnej udalosti, prijatej faktúre, zmene stavu, potvrdení doručenia, PSB odošle HTTP POST request na Váš endpoint s podrobnosťami o udalosti.

Ako webhooky v PSB fungujú?

V PSB zaregistrujete webhook ("hook") s URL a topikom. PSB následne odosiela všetky udalosti daného topiku na Vašu URL. Každá udalosť obsahuje príslušné dáta ako JSON payload.

Vytvorenie webhooku

Žiadne používateľské rozhranie k dispozícii: v súčasnosti nie je možné konfigurovať hook prostredníctvom používateľského rozhrania platformy. Hooky sa nastavujú cez API alebo prostredníctvom podpory eConnect. Rozhranie samoobsluhy pre hooky je v pláne (plánované na Q4 2026) a bude súčasťou Control (Platform 2.0): používatelia budú môcť hooky sami vytvárať, upravovať a mazať. Dovtedy nie je plánovaný žiadny podrobný návod na manuálnu konfiguráciu hookov cez API.

Zaregistrujte hook cez API:

POST /api/v1/hook

Najdôležitejšie konfiguračné parametre:

PolePopisurlHTTPS endpoint, na ktorý PSB odosiela udalostitopicTyp udalosti, na ktorú chcete reagovať (napr. InvoiceReceived)secretTajný kľúč na overenie HMAC podpisu

Poznámka: vyhnite sa rýchlemu mazaniu a opätovnému vytváraniu hookov pre rovnaké partyId a topik. Kvôli race conditions pri spracovaní úloh to môže dočasne viesť k tomu, že neexistuje žiadny aktívny hook, a udalosti tak nebudú doručené. Po zmazaní hooku chvíľu počkajte, kým vytvoríte nový, alebo namiesto zmazania a opätovného vytvorenia použite aktualizáciu.

Pridanie topiku k existujúcemu hooku

Chcete pridať ďalší topik (napr. InvoiceReceived) k existujúcemu hooku? Aktualizujte existujúcu konfiguráciu webhooku prostredníctvom štandardného API /hook, aby požadovaný topik bol zahrnutý v poli topics:

{
  "topics": ["InvoiceReceived"]
}

Aktualizujte existujúci hook namiesto jeho zmazania a opätovného vytvorenia. Zmazanie a opätovné vytvorenie spôsobuje race condition, pri ktorej môžu byť udalosti dočasne nedoručené (pozri upozornenie vyššie).

Nie je samoobslužné pre netechnických zákazníkov. Pridanie topiku k existujúcemu hooku je technická úloha: osoba, ktorá ju vykonáva, musí vedieť, kam má webhook smerovať (URL endpointu), a rozumieť tomu, čo je webhook. Netechnický zákazník to spravidla nemôže urobiť samostatne. Zapojte niekoho s technickými znalosťami (IT zákazníka alebo podpora eConnect).

Najpoužívanejšie topiky
TopikKedyInvoiceReceivedBola prijatá nákupná faktúraInvoiceSentPredajná faktúra bola úspešne odoslanáInvoiceSentErrorPredajná faktúra nemohla byť doručenáInvoiceSentRetryBol spustený pokus o opätovné odoslanieInvoiceResponseReceivedBola prijatá Invoice Response (stavové správy)OrderReceivedBola prijatá nákupná objednávka
Message Level Status (MLS)

MLS (Message Level Status) je nástupcom staršieho MLR a poskytuje odosielajúcej strane spätnú väzbu o prijatí a spracovaní dokumentu. MLS nie je štandardne aktivovaný a musí byť nastavený pre každú party prostredníctvom capability reviews v konfigurácii SMP. Hneď ako je MLS aktivovaný, PSB ho spracováva automaticky: ako prijímajúci Service Provider odosiela PSB správu MLS späť odosielateľovi po prijatí a doručení.

Keď sami odosielate dokumenty cez PSB, dostávate spätnú väzbu MLS od prijímajúcej strany ako webhook udalosť na topicu MessageLevelStatusReceived. Ako prijímajúci Service Provider nasleduje samostatný webhook s topicom MessageLevelStatusSent, hneď ako PSB vo vašom mene odošle MLS odosielajúcemu SP. Pomocou tohto topiku sledujte, či sú vaše vlastné vydané MLS odpovede správne doručované.

MessageLevelStatusSent nie je potvrdením odoslanej faktúry. Topic sa týka MLS, ktoré PSB odosiela ako odpoveď na prijatý dokument (Vy, ako prijímajúci SP, odosielate stavovú notifikáciu späť pôvodnému odosielateľovi), nie o e-faktúru, ktorú ste sami odoslali. Pri mnohých notifikáciách MessageLevelStatusSent pri málo odoslaných faktúrach: skontrolujte, či hook počúva na wildcarde *sent namiesto konkrétne na InvoiceSent (pozri Wildcard topiky).

Zabezpečenie webhookov pomocou HMAC

PSB zabezpečuje všetky doručenia webhookov pomocou HMAC SHA256 podpisov. Pri každom requeste PSB odosiela hlavičku:

X-EConnect-Signature: sha256={podpis}
Implementácia overenia

Na overenie podpisu:

  1. Získajte surový JSON payload z requestu.
  2. Vypočítajte HMAC SHA256 hash pomocou Vášho tajného kľúča (rovnaký, ktorý ste zadali pri vytváraní hooku).
  3. Porovnajte vypočítaný hash s hodnotou v hlavičke X-EConnect-Signature.
  4. Ak sa zhodujú, request je autentický.
Prevencia replay útokov

Skontrolujte tiež pole sentOn v payloade. Ak je tento časový údaj starší ako 5 minút, request odmietnite. Tým sa zabráni replay útokom, pri ktorých sa zachytený request neskôr opätovne prehrá.

Ďalšie bezpečnostné možnosti

Okrem HMAC overenia ponúka PSB ďalšie bezpečnostné vrstvy:

  • IP whitelisting: obmedzte prichádzajúce requesty na produkčné IP adresy PSB (104.40.188.59 a 104.47.148.207)
  • OAuth webhook autentifikácia: PSB sa môže autentifikovať na Vašom endpointe pomocou OAuth2 credentials
  • Mutual SSL: použite klientske certifikáty na vzájomnú TLS autentifikáciu
Poradie priorít

Ak máte nakonfigurovaných viacero hookov, PSB určí, ktorý hook sa použije, na základe:

  1. Hooky na úrovni PartyId majú prednosť pred hookmi na úrovni prostredia
  2. Špecifické topiky majú prednosť pred wildcardmi
  3. Ak viacero hookov s filtrami zodpovedá rovnakému topiku: vyhráva najdlhší filter (podľa počtu znakov) -- napríklad filter s ďalšou klauzulou && vyhráva nad kratším filtrom bez tejto klauzuly. Zabraňuje to duplicitnému doručeniu bez toho, aby sa filtre musely vzájomne vylučovať.
  4. Pri rovnakej priorite: hook-id ako rozhodujúci faktor
Wildcard topiky

Okrem konkrétnych topikov môžete tiež používať wildcard vzory na zachytenie viacerých typov udalostí jedným hookom.

VzorZodpovedáSend*Všetky topiky s prefixom Send*sent / *SentVšetky topiky končiace na Sent: InvoiceSent, InvoiceResponseSent, OrderSent, MessageLevelStatusSent, HookSent*ReceivedVšetky udalosti prijatia (InvoiceReceived, OrderReceived, InvoiceResponseReceived atď.)Invoice*Všetky udalosti súvisiace s faktúrami

Send* nie je to isté ako *sent. Send* zodpovedá topikom začínajúcim na Send; tento vzor sa v štandardných topikoch PSB nevyskytuje. Na zachytenie všetkých "sent" udalostí (InvoiceSent, MessageLevelStatusSent, HookSent atď.), použite *sent. InvoiceSentRetry a InvoiceSentError nekončia na Sent, a preto nie sú pokryté prípanou *sent.

Riešenie problémov

Nižšie sú uvedené bežné problémy s webhookmi a ich riešenia.

PríznakPríčinaRiešenieWebhooki nedochádzajúEndpoint nedostupný (timeout 100 sek.)Vyžadované HTTPS + platný SSL certifikát; deaktivovať ochranu CSRF na webhook endpointeWebhook odmietaný ako nezabezpečenýValidácia X-EConnect-Signature zlyháSkontrolovať výpočet HMAC SHA256: payload × secret → šestnástkový reťazec s prefixom sha256=Replay útoK zablokovanýPole sentOn staršie ako 5 minútEndpoint spracováva príliš pomaly alebo sú hodiny nastavené neprávne"No such host is known" (chyba DNS)Názov hostiteľa webhook endpointu už nie je rozložiteľný, napr. po premenovaní prostredia ERP alebo vypršaní DNS záznamuSkontrolovať a obnoviť DNS záznam domény endpointu; potom získat zmeškané udalosti cez batch endpointHookSentError (definitlvne zlyhanie)PSB sa pokršal 5 dní bez odpovede 2xxSkontrolovať logy endpointu; monitorovať topic HookSentError (pozri nižšie); získat zmeškané udalosti cez batch endpointEndpoint offline / opakované HTTP 404 (akceptácia alebo produkcia)Endpoint zákazníka dočasne vypnutý (vývoj, údržba) alebo skutočne nedostupnýNajprv overiť, či je výpadok zámerný a dočasný (pozri nižšie); nejde o incident platformy eConnectStaré faktúry opätovĞ doručenéAPI pri prvom prijímaní nevracá 2xxEndpoint musí vždy vracať 2xx, aj pri asynchrónnom spracovaníDuplicitné spracovanie pri opakovaníŽiadna kontrola idempotentnostiPoužiť hlavičku X-EConnect-Delivery (unikátne UUID) na deduplikáciuFaktúra prijatá, ale nikam neprídiť; žiadne chyby webhooku nie sú viditeľnéPSB prijal dochádzajúcu faktúru (topic InvoiceReceived), ale na tomto topicu nie je registrovaný žiaden hook (nikdy nenastavený, alebo medzitým odstránený)Najprv skontrolovať konfiguráciu hooku: je InvoiceReceived uvedený v topicoch? Bez hooku na tomto topicu sa nezobrazí žiadny HookSentError, takže absencia chybových hlásení nedokazuje, že hook je aktivnyVeľa e-mailov MessageLevelStatusSent pri málo odoslaných faktúrachMail-hook (mailto:) alebo HTTP webhook počúva na wildcarde *sent namiesto na InvoiceSentZmeniť konfiguráciu topiku na InvoiceSent (rovnaká zmena na mail-hooku aj na HTTP webhooku); pozri Wildcard topiky
Faktúra prijatá, ale nikam nedoručená (žiaden hook InvoiceReceived)

PSB môže prijať dochádzajúcu faktúru bez toho, aby ju odovzdal prijímajúcej strane. Topic InvoiceReceived znamená, že PSB faktúru prijal; bez hooku na tomto topicu sa nič neodosiela na endpoint.

  • Žiadne chyby webhooku nie sú dôkazom, že hook funguje. HookSentError existuje iba vtedy, keď je nakonfigurovaný hook, ktorý zlyháva pri doručení.
  • Hook mohol byť medzitým odstránený. Predchádzajúce úspešné doručenie rovnakej strane/endpointu dokazuje, že hook existoval, nie že je tam stále. Preto najprv skontrolujte aktuálnu konfiguráciu hooku, namiesto toho, aby ste to považovali za prvé nastavenie.
  • Potvrdenie prijatia na strane odosielateľa nie je to isté ako doručenie prijímajúcemu softvéru.

Chýbajúci hook opravte aktualizáciou existujúceho hooku namiesto jeho vymazania a opätovného vytvorenia.

Monitorovanie a obnova po HookSentError

PSB posiela webhook udalosti (napr. InvoiceReceived pri prijíaní e-faktúry) na konfigurovaný endpoint. Ak tento endpoint nie je dostupný — kvôli timeoutu, chybe SSL alebo chybe DNS ako No such host is known — PSB opakuje s exponenciálnym spätným krokom po dobu 5 dní (timeout 100 sek. na pokus). Každý pokus generuje udalosť HookSentRetry; po 5 dňoch bez odpovede 2xx je vydaný HookSentError ako konečný stav a PSB prestáva opakovať.

Dôsledok: prijatá e-faktúra nebude doručená zákazníkovi, kým je endpoint nedostupný, bez toho aby si to zákazník priamo všimol. Odporúčané kroky:

  • Nastaviť monitorovanie: prihlať hook (napr. mail-hook) k topiku HookSentError, aby definitlvne zlyhanie doručovania bolo aktlvne signalizované namiesto tichého prechodzenia. Zvážiť aj HookSentRetry pre skoré odhalenie.
  • Odstrániť príčinu: pri chybe DNS skontrolovať a obnoviť DNS záznam domény endpointu; pri timeoutoch zabezpečiť rýchlejšiu odpoveď endpointu (2xx do 100 sek., náročné spracovanie asynchrónne).
  • Obnova zmeškaných udalostí: udalosti, ktoré počas výpadku zlyhali, možno získat cez batch endpoint. Päť-dňové okno opakovaní znamená, že včasná oprava v tomto období môže ešte dobehnúť doručovanie cez štandardné doručovanie.

Prvá línia: výpadok na strane zákazníka vs. technický problém (akceptácia a produkcia)

HookSentError, opakované HTTP 404 alebo "endpoint je offline"/"akceptačné prostredie je vypnuté" môže tiež vyplývať z toho, že zákazník dočasne vypne akceptačný alebo produkčný endpoint (vývoj, údržba). To nie je incident platformy eConnect.

  1. Potvrdiť symptóm: HookSentError, endpoint offline alebo HTTP 404 na webhook endpointe nakonfigurovanom zákazníkom. Často viditeľné ako presný text Response status code does not indicate success: 404 (Not Found) (zvyčajne .NET HttpRequestException pri odchodzom požiadavku hooku). Ide o 404 z vlastného endpointu zákazníka (vypnutý alebo nesprávna cesta), nie o chybu Peppol PartyId not found pri odosielaní (SMP 404), ani o REST resource 404 zo spracovania chýb API.
  2. Opýtať sa, či je výpadok zámerný a dočasný (vývojári/zákazník).
  3. Potvrdené ako dočasné → poznamenať, žiadna ďalšia akcia na strane eConnectu, kým endpoint opäť nie je dostupný. Hneď ako endpoint znova vracia 2xx, možno zmeškané udalosti získať cez batch endpoint.
  4. Nie je zámerné alebo neznáme → postupovať podľa štandardného runbooku HookSentError vyššie (DNS/SSL/timeout, logy, monitorovanie, batch obnova).
Osvedčené postupy
  • Používajte vždy HTTPS pre Váš webhook endpoint
  • Implementujte idempotentné spracovanie: PSB môže v zriedkavých prípadoch doručiť udalosť viackrát
  • Vráťte rýchlo 2xx stavový kód: PSB považuje každú nie-2xx odpoveď za chybu a pokúsi sa o opätovné doručenie
  • Zaznamenávajte všetky prijaté udalosti na účely ladenia a auditingu
  • Používajte systém frontu (queue) na Vašej strane, ak spracovanie trvá dlhšie, potvrďte prijatie najprv a spracujte potom
Často kladené otázky
Ako overím prichádzajúci webhook pomocou HMAC SHA256?

Vezmite surové JSON telo requestu, vypočítajte HMAC SHA256 hash pomocou secretu, ktorý ste zadali pri vytváraní hooku, a porovnajte ho s hodnotou v hlavičke X-EConnect-Signature (za prefixom sha256=). Ak sa zhodujú, viete, že request pochádza z PSB a nebol počas prenosu upravený.

Prečo je potrebné kontrolovať pole sentOn v payloade?

Overte, či sentOn nie je starší ako 5 minút. Ak je časová značka príliš stará, request odmietnite. Tým zabránite útokom typu replay, pri ktorých sa skôr zachytený request znova odošle neskôr, aj keď je podpis technicky správny.

Ako predísť problémom s idempotentným spracovaním a opakovaním?

Implementujte idempotentné spracovanie na Vašej strane, pretože PSB môže v zriedkavých prípadoch doručiť udalosť viackrát. Taktiež rýchlo vráťte HTTP 2xx stavový kód: každá iná odpoveď sa považuje za chybu a spustí opakovanie. Pre náročné spracovanie najprv potvrďte príjem a potom spracujte cez front.

Čo znamená HookSentError alebo endpoint, ktorý vyzerá byť na akceptácii alebo produkcii offline?

HookSentError nasleduje po tom, čo sa PSB pokúšal 5 dní bez odpovede 2xx. Opakované HTTP 404 alebo správa, že endpoint je offline, často vyplýva z toho, že zákazník dočasne vypne akceptačný alebo produkčný endpoint (vývoj, údržba) -- nejde o incident platformy eConnect. Najprv potvrdiť, či je výpadok zámerný a dočasný; ak áno, nie je potrebná žiadna ďalšia akcia, kým endpoint opäť nie je dostupný. Zmeškané udalosti možno stále získať cez batch endpoint počas päťdňového okna opakovaní.

Prečo dostávam veľa e-mailov MessageLevelStatusSent, aj keď odosielam málo faktúr?

Je to očakávané správanie, ak mail-hook (mailto:) alebo HTTP webhook počúva na wildcarde *sent namiesto konkrétne na InvoiceSent. MessageLevelStatusSent nie je potvrdením sami odoslanej faktúry, ale MLS, ktoré PSB odosiela ako odpoveď na prijatý dokument, a spadá pod vzor *sent spolu s InvoiceSent, OrderSent a HookSent. Ak chcete notifikácie iba pri odosielaní faktúr, zmeňte konfiguráciu topiku na InvoiceSent. InvoiceSentRetry a InvoiceSentError nekončia na Sent, a preto nie sú pokryté *sent.


Chcete dokumenty radšej získavať hromadne? Pozrite sa na batch hook.

Pozrite si webhook endpointy