Wystawienie faktury ustrukturyzowanej z wykorzystaniem Open API Krajowego Systemu e-Faktur (KSeF)
Proces wystawienia e-Faktury z wykorzystaniem API KSeF wcale nie jest trywialny, dlatego przygotowaliśmy poniższą instrukcję, żeby każdy kto się nie boi mógł spróbować swoich sił w tej „konkurencji”. Zresztą nie ma co przedłużać wstępu – zobaczcie sami:
1. Wyzwanie autoryzacyjne
Aby wystartować komunikację z API KSeF w pierwszej kolejności musimy wywołać AutrhorisationChallenge , czyli tzw. wyzwanie autoryzacyjne, na podstawie którego będziemy mogli ustanowić sesję. A zatem wywołujemy:
POST /online/Session/AuthorisationChallenge
Gdzie podajemy czas w formacie timestamp (np.: „timestamp„: „2023-10-10T13:00:00Z”) oraz typ identyfikatora („identifierType„: „onip„) i jego wartość („identifier„: „<nip wystawcy faktury>”)
Zwrócony zostanie znacznik czasowy oraz wartość samego wyzwania autoryzacyjnego
2. Sesja podpisana
Następnie wywołujemy nawiązanie sesji podpisanej:
POST /online/Sesision/InitSigned
InitSessionSignedRequest – zawiera opcjonalną sekcję Encryption – każda faktura wysłana w ramach utworzonej sesji interaktywnej będzie zaszyfrowana kluczem symetrycznym wskazanym w sesji Encryption.
Uzupełniamy:
Uwaga! Mając token sesji – każde kolejne zapytanie powinno być autoryzowane tym tokenem
3. Nadanie uprawnień do wysyłania żądań do KSeF
Nadanie uprawnień (czyli komu i co nadajemy) dla konkretnego numeru PESEL, czyli osobie która w ramach firmy będzie mogła np. wystawiać i odczytywać faktury:
POST /online/Credentials/Grant
Proces nadawania uprawnień jest asynchroniczny i może chwilę potrwać. Ale za pomocą wartości zwróconego atrybutu elementReferenceNumber możemy dowiedzieć się jaki jest status – w tym przypadku – nadania uprawnień.
3a. Sprawdzenie statusu nadania uprawnień
GET /online/Credentials/Status/{CredentialsElementReferenceNumber}
4. Żądanie uwierzytelniające
Teraz mając nadane uprawnienia dla PESEL możemy jeszcze raz wysłać podpisane żądanie uwierzytelniające podpisane kwalifikowanym (z PESEL):
POST /online/Sesision/InitSigned
W odpowiedzi powinniśmy otrzymać:
Ważny jest token sesyjny (token), który umożliwia wykonywanie takich operacji jak wystawianie i odbiór faktur. Oczywiście jest o też zupełnie inna sesja (inna wartość dla referenceNumber).
5. Wygenerowanie tokena autoryzacyjnego
Poniżej przykłada żądania, które należy wysłać do metody GenerateToken.
POST /online/Credentials/GenerateToken
Wywołanie i odpowiedź:
Uwaga! Token autoryzacyjny (authorisationToken) jest zwracany i możliwy do pobrania tylko raz po wywołaniu metody GenerateToken, później nie jest już możliwy do uzyskania.
Ten token autoryzacyjny można już wpisać w aplikacji.
Z uwagi na processingCode:100 musimy sprawdzić kiedy zakończy się proces generowania tokenu…. I dopiero wtedy (jak będzie processingCode:200) token będzie gotowy do użycia.
5a. Sprawdzenie statusu generowania tokenu
W celu sprawdzenia statusu generowania tokenu, musimy wysłać wartość atrybutu elementReferenceNumber z odpowiedzi uzyskanej w kroku 5 wysłać na adres metody:
GET /online/Credentials/Status/{CredentialsElementReferenceNumber}
6. Nawiązanie sesji umożliwiającej wysłanie e-Faktury
Jeśli mamy token autoryzacyjny to teraz należy nawiązać nim sesję w celu wykonania czynności takich jak wysłanie lub odbieranie faktur.
Uwaga! Taka przygotowanego żądania nie musimy już podpisywać – to jest różnica między nawiązaniem sesji z wykorzystaniem podpisu, a sesją z wykorzystaniem tokenu autoryzacyjnego.
W odpowiedzi dostajemy token sesyjny: w atrybucie sessionToken > token
Uwaga! Z tym tokenem możemy dopiero wystawiać/odbierać faktury!!!
7. Wysłanie e-Faktury do KSeF
PUT /online/Invoice/Send
Wartość w atrybucie faktury <Podmiot1><DaneIdentyfikacyjne><NIP> musi być taka sama jak w wartość z kontekstu zadeklarowana w wyzwaniu autoryzacyjnym. Wyjątkiem jest np. samofakturowanie, wtedy w tym polu może pojawić się inny NIP, ale trzeba mieć uprawnienia nadane do samofakturowania (a w danych odbiorcy musi być NIP zgodny z zadeklarowanym w wyzwaniu autoryzacyjnym).
Przykład żądania:
Uwaga! Atrybut referenceNumber, czyli numer referencyjny sesji należy odłożyć ponieważ po nim będziemy mogli sprawdzić i pobrać UPO.
7a. Sprawdzenie statusu odebrania przez KSeF wysłanej przez nas faktury
GET /online/Credentials/Status/{CredentialsElementReferenceNumber}
Jeśli faktura została zaakceptowana (status 200), to ważny jest atrybut ksefReferenceNumber, który jednoznacznie identyfikuje fakturę. Atrybut acquisitionTimestamp określi datę i czas kiedy dokładnie faktura została przyjęta do systemu KSeF.
Tak to już wszystko i możemy cieszyć się z wystawienia pierwszej e-faktury w KSeF.
Niniejszy wpis powstał na podstawie Webinarium przeprowadzonego w dniu 25.11.2022r. przez przedstawicieli Ministerstwa Finansów.