Kody statusu HTTP, odpowiedzi błędów i logika ponawiania w PSB API: jak zbudować solidną integrację.
Każda integracja z API prędzej czy później napotka błędy. Awaria sieci, nieosiągalny serwer, nieprawidłowo sformatowany dokument: to normalna część pracy z API. PSB API komunikuje błędy za pomocą standardowych kodów statusu HTTP i ustrukturyzowanych odpowiedzi JSON. Ponadto PSB posiada wbudowany mechanizm ponawiania, który automatycznie obsługuje tymczasowe błędy podczas dostarczania dokumentów.
W tym artykule dowiesz się, jakie kody statusu zwraca PSB, jak interpretować odpowiedzi błędów, kiedy można bezpiecznie ponowić żądanie i jak działa automatyczny mechanizm ponawiania PSB.
PSB API używa standardowych kodów statusu HTTP do wskazania wyniku żądania. Kody statusu dzielą się na dwie kategorie: błędy klienta (4xx), które musisz naprawić samodzielnie, oraz błędy serwera (5xx), które możesz ponowić.
Przy błędzie 4xx problem leży w samym żądaniu. Ponowne wysłanie z tymi samymi danymi da ten sam rezultat. Napraw przyczynę przed ponowną próbą.
VerstuurInvoice): podany PartyId nie znajduje się (dla tego typu dokumentu) w Peppol/SMPqueryRecipientParty lub lookup.peppol.org dla podanego ID, następnie opcjonalnie sprawdź powiązane schematy (np. BE 0208 w porównaniu z 9925/BE:VAT, ten sam numer podstawowy) -- zmianę EndpointID zalecaj tylko przy potwierdzonym trafieniu lookup. Brak trafienia dla żadnego kandydata ID: odbiorca jest nieosiągalny na tych identyfikatorach; klient musi zapytać odbiorcę o rejestrację lub inny ID dostawyapplication/json tam gdzie wymaganequeryRecipientParty. Komunikat błędu: EConnect.Psb.Models.EConnectException: 'Duplicate id agencies {code} requested.' (gdzie {code} to kod agencji bez wiodącego zera, np. schemat 0208 → 208).API403 Access forbidden: dosłowny komunikat błędu [API403] Access forbidden. Please check PartyId authorization and make sure the Subscription-Key is valid może wystąpić między innymi przy nieudanym wysłaniu Peppol z Business Central ("delivery failed"), ale przyczyna jest ogólna dla PSB, nie specyficzna dla BC. Kolejność diagnozy:
Uwaga: wzmianka o "Subscription-Key" w komunikacie błędu nie oznacza automatycznie, że klucz trzeba odnowić. Autoryzacja PartyId i problem z powiązaniem po stronie platformy są równie częstą przyczyną. Jeśli dostawa nadal się nie powodzi po prawidłowej weryfikacji tokenu i partyId, zgłoś sprawę do wsparcia eConnect, zamiast wielokrotnie rotować Subscription-Key.
Walidacja koperty SBDH (API400.USRMS1 / API400.USRMS2): te kody błędów wskazują na niezgodność między kopertą Peppol (SBDH) a samym dokumentem e-faktury. Przy USRMS1 nadawca lub odbiorca w kopercie nie zgadza się z identyfikatorami w XML faktury. Przy USRMS2 PSB nie może znaleźć rozpoznawalnego nadawcy w dokumencie. Sprawdź, czy EndpointID i PartyIdentification w Twoim UBL zgadzają się z wartościami podanymi podczas wysyłki. PSB odrzuca dokument na poziomie AS4 i zwraca błąd do wysyłającego Access Point.
Wyjątek od zasady „tylko 5xx można ponawiać”: 429 Too Many Requests wskazuje na ograniczenie liczby żądań i można go ponowić. Poczekaj i uwzględnij nagłówek Retry-After przed ponownym wysłaniem żądania.
Retry-After, następnie ponówBłąd 5xx wskazuje na tymczasowy problem po stronie serwera. Samo żądanie może być poprawne. Razem z 429 są to jedyne kody statusu, przy których ponowienie ma sens.
Uwaga: endpoint wysyłki akceptuje maksymalnie 24 MB na żądanie, włącznie z narzutem HTTP. Ładunki przekraczające ten limit są odrzucane przez serwer WWW z HTTP 500 zamiast 413, ponieważ odrzucenie następuje przed walidacją na poziomie aplikacji. Pamiętaj o tym przy załącznikach zakodowanych w base64: dodają one około 33% do rozmiaru pliku.
API500UH podczas wdrożeń: kod błędu API500UH (Unhandled error) może wystąpić, gdy PSB wykonuje wewnętrzną aktualizację usługi (Service Fabric deployment). W wielu przypadkach dokument został już pomyślnie dostarczony do odbiorcy, ale krok potwierdzenia nie powiódł się z powodu migracji. Mechanizm ponawiania PSB automatycznie próbuje dokończyć pozostałe kroki. Jeśli otrzymasz API500UH, sprawdź za pomocą zdarzeń statusu, czy dokument został dostarczony, zanim wyślesz go ponownie.
Przy błędzie 4xx odpowiedź zawiera treść JSON opisującą problem. Te informacje pomagają szybko zidentyfikować przyczynę.
{
"error": "Validation failed",
"message": "The supplied document is not valid UBL 2.1",
"details": [
"cbc:InvoiceTypeCode is missing"
]
}
Przy błędzie 5xx odpowiedź nie zawsze jest ustrukturyzowana. Opieraj logikę ponawiania na kodzie statusu HTTP, a nie na treści body.
Nie każdy błąd zasługuje na ponowienie. Zasada jest prosta: tylko kody statusu 5xx i timeouty sieciowe warto ponawiać. Przy błędach 4xx musisz zmodyfikować żądanie przed ponownym wysłaniem.
Zalecaną strategią ponawiania jest exponential backoff: zacznij od krótkiego czasu oczekiwania i podwajaj go przy każdej kolejnej próbie.
Wskazówka: dodaj niewielki losowy rozrzut (jitter) do czasu oczekiwania. Jeśli wielu klientów ponawia żądania jednocześnie po awarii, jitter zapobiega ich jednoczesnym trafieniu na serwer.
Zawsze łącz logikę ponawiania z headerem X-EConnect-DocumentId. Dołączając ten sam documentId przy każdej próbie, PSB gwarantuje, że dokument nigdy nie zostanie przetworzony dwukrotnie. Jeśli PSB otrzyma documentId, który został już przetworzony, zwraca 409 Conflict jako potwierdzenie.
Zobacz Idempotency: zapobieganie podwójnym wysyłkom, aby uzyskać pełne wyjaśnienie i przykłady kodu.
Oprócz logiki ponawiania, którą implementujesz samodzielnie, PSB posiada własny mechanizm ponawiania dostarczania dokumentów. Jeśli PSB próbuje dostarczyć fakturę lub zamówienie do odbiorcy, a ta strona zwraca błąd 5xx, PSB automatycznie wznawia dostarczanie.
PSB wykonuje do 8 prób ponawiania rozłożonych na około 35 godzin. Przy każdej próbie PSB publikuje zdarzenie, dzięki czemu możesz śledzić postęp:
InvoiceSentRetryInvoiceSentErrorOrderSentRetryOrderSentErrorJeśli skonfigurowano webhook dla tych tematów, przy każdej próbie otrzymujesz powiadomienie. Po InvoiceSentError lub OrderSentError wymagane jest ręczne działanie: skontaktuj się z odbiorcą lub eskaluj przez eConnect Support.
Wskazówka: subskrybuj tematy
InvoiceSentRetryiInvoiceSentErrorza pomocą webhooka. Dzięki temu natychmiast wykryjesz problemy z dostarczaniem i możesz działać proaktywnie.
Dla webhooków PSB stosuje oddzielny harmonogram ponawiania. Jeśli Twój endpoint webhookowy jest nieosiągalny lub nie zwraca kodu statusu 2xx, PSB ponawia dostarczanie zdarzenia.
HookSentRetryHookSentErrorPSB oczekuje odpowiedzi 2xx od Twojego endpointu w ciągu 100 sekund. Każda inna odpowiedź (lub timeout) liczy się jako nieudana próba. Dlatego przetwarzaj przychodzące webhooki jak najszybciej, potwierdź odbiór odpowiedzią 200 OK i wykonuj ciężkie przetwarzanie asynchronicznie w procesie w tle.
Uwaga: jeśli Twój endpoint jest nieosiągalny przez dłuższy czas, PSB przestaje ponawiać po 5 dniach. Pominięte zdarzenia można nadal pobrać za pomocą endpointu batch. Zobacz Batch hooks, aby uzyskać więcej informacji.
W przypadku integracji uzyskujących dostęp do PSB z chronionej sieci (zapora ogniowa, proxy, lista dozwolonych), należy zezwolić na podstawowe nazwy hostów i nazwy hostów failover. everbinding.nl to starszy domen eConnect, aktywnie używany do failover PSB.
psb.econnect.euapi.everbinding.nlaccp-psb.econnect.eutestapi.everbinding.nlUmieść wszystkie cztery nazwy hostów na białej liście na porcie 443 (HTTPS). Bez nazw hostów failover poprawne połączenie PSB może stać się nieosiągalne podczas zdarzenia awaryjnego, podczas gdy PSB sama działa.
Retry-After, exponential backoffW skrócie
Błędy klienta (4xx) wymagają Twojej uwagi: napraw problem w żądaniu. Błędy serwera (5xx) są tymczasowe i można je bezpiecznie ponawiać z exponential backoff. Zawsze używaj headera X-EConnect-DocumentId, aby zapobiec podwójnemu przetworzeniu przy ponawianiu. PSB automatycznie ponawia dostarczanie dokumentów do 8 razy w ciągu około 35 godzin, a webhooków przez okres do 5 dni.
Zobacz pełną dokumentację API