Spracovanie chýb: HTTP kódy, retries a robustná integrácia

HTTP stavové kódy, chybové odpovede a retry logika PSB API: ako vybudovať robustnú integráciu.

Každá API integrácia skôr či neskôr narazí na chyby. Výpadok siete, nedostupný server, nesprávne formátovaný dokument: to patrí k veci. PSB API komunikuje chyby prostredníctvom štandardných HTTP stavových kódov a štruktúrovaných JSON odpovedí. Navyše PSB má zabudovaný retry mechanizmus, ktorý automaticky rieši dočasné chyby pri doručovaní dokumentov.

V tomto článku sa dozviete, aké stavové kódy PSB vracia, ako interpretovať chybové odpovede, kedy môžete bezpečne zopakovať požiadavku a ako funguje automatický retry mechanizmus PSB.

HTTP stavové kódy

PSB API používa štandardné HTTP stavové kódy na indikáciu výsledku požiadavky. Stavové kódy sa delia do dvoch kategórií: chyby klienta (4xx), ktoré musíte opraviť sami, a chyby servera (5xx), ktoré môžete zopakovať.

Úspešná odpoveď
KódVýznamVysvetlenie200OKPožiadavka bola úspešne spracovaná
Chyby klienta (4xx): neretryovať

Pri 4xx chybe je problém v samotnej požiadavke. Opätovné odoslanie s rovnakými dátami vyprodukuje rovnaký výsledok. Opravte príčinu pred ďalším pokusom.

KódVýznamKedyAkcia400Bad RequestChyba validácie alebo syntaktická chyba v dokumenteSkontrolujte telo požiadavky. JSON odpoveď obsahuje podrobnosti o tom, čo sa pokazilo401UnauthorizedNebol odoslaný token, alebo token vypršal či je neplatnýVyžiadajte si nový Bearer token z Identity Servera403ForbiddenToken je platný, ale akcia nie je povolená. Najčastejšie: používate partyId, ku ktorému váš účet nemá prístup. Ďalšie príčiny: expirovaný bearer token, neplatná subscription key alebo endpoint, ktorý nie je dostupný pre vašu úroveň autorizácieSkontrolujte, či používate správne partyId a či používateľ, ktorý získal bearer token, má k tomuto partyId prístup. Pri pochybnostiach: získajte nový token cez Identity Server404Not FoundPožadovaný endpoint alebo zdroj neexistuje (napríklad neznáme Document ID, hook alebo PartyID). Pri odosielaní sa to týka aj kombinácie "No valid delivery options. PartyId '...' not found in Peppol" (okrem iného pri VerstuurInvoice): ponúkané PartyId nie je (pre tento typ dokumentu) na Peppol/SMPSkontrolujte URL, Document ID a partyId. Pri "PartyId not found in Peppol": najprv vykonajte lookup cez queryRecipientParty alebo lookup.peppol.org na ponúkanom ID, potom voliteƾne skontrolujte súvisiace schemas (napríklad BE 0208 oproti 9925/BE:VAT, rovnaké základné číslo) -- zmenu EndpointID odporúčajte len pri potvrdených výsledkoch lookup. Bez výsledku pre žiadneho kandidátského ID: príjemca nie je dosiahnuteƾný na týchto identifikátoroch; klient sa musí správa u príjemcu opytať na registráciu alebo iné dodávateƾské ID409ConflictDokument už bol spracovaný (idempotency)Žiadna akcia nie je potrebná: dokument bol úspešne prijatý skôr. Pozri idempotency413Content Too LargeSúbor prekračuje maximálnu veľkosťZmenšite dokument alebo prílohy. IDR limit: 15 MB400 (duplicitné agentúry)Duplicitné schéma identifikátoraDva alebo viac identifikátorov s rovnakým kódom schémy/agentúry v jedinom volaní queryRecipientParty. Chybová správa: EConnect.Psb.Models.EConnectException: 'Duplicate id agencies {code} requested.' (kde {code} je kód agentúry bez úvodnéj nuly, napr. schéma 0208208).Uvedte iba jeden identifikátor na schému na volanie. Viacero kandidátov v rámci tej istej schémy: vykonajte samostatné volania.

API403 Access forbidden: doslovná chybová správa [API403] Access forbidden. Please check PartyId authorization and make sure the Subscription-Key is valid sa okrem iného môže objaviť pri neúspešnom odoslaní Peppol z Business Central ("delivery failed"), príčina je však všeobecná pre PSB, nie špecifická pre BC. Poradie diagnostiky:

  1. Skontrolujte autorizáciu PartyId: používate správne partyId a má prepojenie účtu práva k tejto party?
  2. Obnovte Bearer token, ak vypršal alebo je neplatný.
  3. Skontrolujte Subscription-Key len ak je tento header stále povinný (legacy/Collabrr/API31) -- nie ako predvolený prvý krok.

Poznámka: zmienka o "Subscription-Key" v chybovej správe automaticky neznamená, že kľúč treba obnoviť. Autorizácia PartyId a problém s prepojením na strane platformy sú rovnako častou príčinou. Ak doručenie zlyháva aj po platnej kontrole tokenu a partyId, eskalujte na podporu eConnect, namiesto opakovaného otáčania Subscription-Key.

Validácia SBDH obálky (API400.USRMS1 / API400.USRMS2): tieto chybové kódy indikujú nesúlad medzi Peppol obálkou (SBDH) a samotným dokumentom e-faktúry. Pri USRMS1 odosielateľ alebo príjemca v obálke nezodpovedá identifikátorom v XML faktúry. Pri USRMS2 PSB nemôže nájsť rozpoznateľného odosielateľa v dokumente. Skontrolujte, či EndpointID a PartyIdentification vo vašom UBL zodpovedajú hodnotám poskytnutým pri odosielaní. PSB odmietne dokument na úrovni AS4 a vráti chybu odosielajúcemu Access Pointu.

Obmedzovanie počtu požiadaviek (429): možno retryovať

Výnimka z pravidla „iba 5xx možno retryovať“: 429 Too Many Requests indikuje obmedzovanie počtu požiadaviek a možno ho retryovať. Počkajte a riaďte sa hlavičkou Retry-After, skôr než požiadavku znova odošlete.

KódVýznamKedyAkcia429Too Many RequestsObmedzovanie počtu požiadaviek: posielate príliš veľa požiadaviek v časovom oknePočkajte a riaďte sa hlavičkou Retry-After, potom zopakujte
Chyby servera (5xx): retryovať

5xx chyba indikuje dočasný problém na strane servera. Samotná požiadavka môže byť správna. Spolu s 429 sú to jediné stavové kódy, pri ktorých má opakovanie zmysel.

KódVýznamKedyAkcia500Internal Server ErrorNeočakávaná chyba serveraRetryujte s exponential backoff502Bad GatewayNeplatná odpoveď od nadväzujúcej služby; zvyčajne dočasnéRetryujte s exponential backoff503Service UnavailablePSB je dočasne nedostupný (údržba, preťaženie)Retryujte s exponential backoff504Gateway TimeoutNadväzujúca služba neodpovedá včasRetryujte s exponential backoff

Poznámka: endpoint na odosielanie akceptuje maximálne 24 MB na požiadavku, vrátane HTTP overheadu. Payloady prekračujúce tento limit sú odmietnuté webovým serverom s HTTP 500 namiesto 413, pretože odmietnutie nastane pred validáciou na aplikačnej vrstve. Majte to na pamäti pri base64-kódovaných prílohách: zväčšujú veľkosť súboru približne o 33 %.

API500UH počas deploymentov: chybový kód API500UH (Unhandled error) sa môže objaviť, keď PSB vykonáva internú aktualizáciu služby (Service Fabric deployment). V mnohých prípadoch bol dokument už úspešne doručený príjemcovi, ale potvrdzovací krok zlyhal kvôli migrácii. Retry mechanizmus PSB automaticky skúša dokončiť zostávajúce kroky. Ak obdržíte API500UH, skontrolujte prostredníctvom stavových udalostí, či bol dokument doručený, skôr než ho znova odošlete.

Čítanie chybových odpovedí

Pri 4xx chybe odpoveď obsahuje JSON telo popisujúce problém. Tieto informácie vám pomôžu rýchlo identifikovať príčinu.

{
  "error": "Validation failed",
  "message": "The supplied document is not valid UBL 2.1",
  "details": [
    "cbc:InvoiceTypeCode is missing"
  ]
}

Pri 5xx chybe odpoveď nie je vždy štruktúrovaná. Založte svoju retry logiku na HTTP stavovom kóde, nie na obsahu tela.

Stratégia retryovania pre vašu integráciu

Nie každá chyba si zaslúži retry. Pravidlo je jednoduché: iba 5xx stavové kódy a sieťové timeouty stoja za opakovanie. Pri 4xx chybách musíte požiadavku upraviť pred opätovným odoslaním.

Exponential backoff

Odporúčaná stratégia retryovania je exponential backoff: začnite s krátkou čakacou dobou a zdvojnásobte ju pri každom ďalšom pokuse.

PokusČakacia doba11 sekunda22 sekundy34 sekundy48 sekúnd516 sekúnd632 sekúnd7+60 sekúnd (maximum)

Tip: pridajte k čakacej dobe malý náhodný rozptyl (jitter). Ak po výpadku retryuje viacero klientov súčasne, jitter zabráni tomu, aby všetci zasiahli server v rovnakom okamihu.

Bezpečné retries s idempotency

Vždy kombinujte retry logiku s hlavičkou X-EConnect-DocumentId. Zahrnutím rovnakého documentId pri každom pokuse PSB garantuje, že dokument nebude nikdy spracovaný dvakrát. Ak PSB obdrží documentId, ktorý už bol spracovaný, vráti 409 Conflict ako potvrdenie.

Pozri Idempotency: zabránenie duplicitnému odosielaniu pre úplné vysvetlenie a príklady kódu.

Rozhodovací strom
Automatický retry mechanizmus PSB

Okrem retry logiky, ktorú implementujete sami, má PSB vlastný retry mechanizmus pre doručovanie dokumentov. Ak PSB skúša doručiť faktúru alebo objednávku príjemcovi a ten vráti 5xx chybu, PSB automaticky obnoví doručovanie.

Doručovanie dokumentov (faktúry a objednávky)

PSB vykoná až 8 retry pokusov rozložených približne na 35 hodín. Pri každom pokuse PSB publikuje udalosť, takže môžete sledovať priebeh:

UdalosťVýznamInvoiceSentRetryZačal nový pokus o doručenie faktúryInvoiceSentErrorVšetkých 8 pokusov zlyhalo, faktúra nemohla byť doručenáOrderSentRetryZačal nový pokus o doručenie objednávkyOrderSentErrorVšetkých 8 pokusov zlyhalo, objednávka nemohla byť doručená

Ak máte nakonfigurovaný webhook pre tieto témy, obdržíte notifikáciu pri každom pokuse. Po InvoiceSentError alebo OrderSentError je vyžadovaná manuálna akcia: kontaktujte príjemcu alebo eskalujte cez eConnect Support.

Tip: prihláste sa na odber tém InvoiceSentRetry a InvoiceSentError prostredníctvom webhooku. Týmto spôsobom okamžite detegujete problémy s doručovaním a môžete konať proaktívne.

Doručovanie webhookov

Pre webhooky PSB používa samostatný retry plán. Ak je váš webhook endpoint nedostupný alebo nevracia 2xx stavový kód, PSB opakuje doručenie udalosti.

ParameterHodnotaMaximálna doba retryovania5 dníStratégiaExponential backoffTimeout na pokus100 sekúndUdalosť na pokusHookSentRetryUdalosť pri definitívnom zlyhaníHookSentError

PSB očakáva 2xx odpoveď od vášho endpointu do 100 sekúnd. Akákoľvek iná odpoveď (alebo timeout) sa počíta ako neúspešný pokus. Preto spracovávajte prichádzajúce webhooky čo najrýchlejšie, potvrďte príjem odpoveďou 200 OK a náročné spracovanie vykonávajte asynchrónne v background procese.

Poznámka: ak je váš endpoint nedostupný po dlhšiu dobu, PSB prestane retryovať po 5 dňoch. Zmeškané udalosti možno stále získať prostredníctvom batch endpointu. Pozri Batch hooks pre viac informácií.

Názvy hostiteľov PSB pre whitelist siete

Pre integrácie, ktoré pristúpujú k PSB z chránenej siete (firewall, proxy, zoznam povolených), musia byť povolené primárne aj failover názvy hostiteľov. everbinding.nl je staršia doména eConnect a aktivívne sa používa pre failover PSB.

ProstrediePrimárnyFailoverProdukciapsb.econnect.euapi.everbinding.nlAkceptanciaaccp-psb.econnect.eutestapi.everbinding.nl

Pridajte všetky štyri názvy hostiteľov na whitelist na porte 443 (HTTPS). Bez failover názvov hostiteľov sa môže platné pripojenie PSB počas zlyhania stať nedostupným, zatiaľ čo PSB sama beží.

Prehľad: retryovateľné alebo nie?
Stavový kódRetryovateľnýStratégia200 OKNie je potrebnéSpracované201 CreatedNie je potrebnéSpracované202 AcceptedNie je potrebnéStav skontrolovať neskôr204 No ContentNie je potrebnéSpracované400 Bad RequestNieOpraviť požiadavku401 UnauthorizedNieVyžiadať nový token403 ForbiddenNieSkontrolovať oprávnenia404 Not FoundNieSkontrolovať URL/zdroj405 Method Not AllowedNieSkontrolovať HTTP metódu409 ConflictNieDokument už bol spracovaný413 Content Too LargeNieZmenšiť veľkosť súboru415 Unsupported Media TypeNieOpraviť hlavičku Content-Type422 Unprocessable EntityNieSkontrolovať štruktúru dokumentu/business rules429 Too Many RequestsÁnoPočkať na Retry-After, exponential backoff500 Internal Server ErrorÁnoExponential backoff502 Bad GatewayÁnoExponential backoff503 Service UnavailableÁnoExponential backoff504 Gateway TimeoutÁnoExponential backoff

V skratke Chyby klienta (4xx) vyžadujú vašu pozornosť: opravte problém v požiadavke. Chyby servera (5xx) sú dočasné a možno ich bezpečne retryovať s exponential backoff. Vždy používajte hlavičku X-EConnect-DocumentId, aby ste zabránili duplicitnému spracovaniu pri retries. PSB automaticky retryuje doručovanie dokumentov až 8-krát počas približne 35 hodín a webhooky po dobu až 5 dní.

Zobraziť kompletnú API dokumentáciu