Krajowy system e-Faktur

0

Czy działa was logowanie do KSeF dzisiaj (03.10.2024)?
Ja przy próbie tworzenia AuthorisationChallenge dostaję błąd

HTTP/1.1 403 Forbidden <html style="height:100%"><head><META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW"><meta name="format-detection" content="telephone=no"><meta name="viewport" content="initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"></head><body style="margin:0px;height:100%">Request unsuccessful. Incapsula incident ID: 325000190053127939-139639686145836235</iframe></body></html>

Przez przeglądarkę mogę się zalogować ale przez aplikację już nie (a nic nie zmieniałem w kodzie).

0

Dostaje taką zwrotkę z testowego API - /online/Query/Invoice/Async/Status
{
"timestamp" : "2024-10-03T11:31:07.618Z",
"referenceNumber" : X",
"processingCode" : 325,
"processingDescription" : "Zakończenie etapu podziału na podzapytania oraz inicjalizacja podprocesów przygotowania części odpowiedzi",
"elementReferenceNumber" : "X"
}

I coś mi tutaj nie pasuję.. ponieważ zawsze zwrotka była inna, a co więcej w dokumentacji którą pobieram na stronie ksefu, widzę dalej starą zwrotkę czyli:
screenshot-20241003133333.png
Nie wiem w takim razie czemu dostaję zupełnie coś innego niż do tej pory? Ma ktoś może informacje na ten temat?

2

Finalne konsultacje KSeF na równych zasadach dla wszystkich przedsiębiorców rozpoczną się na przełomie października i listopada 2024 r.

https://www.gov.pl/web/kas/finalne-konsultacje-ksef-za-miesiac

3

https://ksef.podatki.gov.pl/komunikaty-techniczne/ograniczenia-w-zakresie-przyjmowania-faktur-na-srodowisku-testowym-krajowego-systemu-e-faktur/

Dotyczą one:

ograniczenie rozmiaru wysyłanego zapytania do 10 MB,
ograniczenie liczby wysyłanych zapytań do 100/min. W przypadku naruszenia tego ograniczenia następuje chwilowa blokada IP użytkownika, potem z progresją od 1 min do 10 minut, następnie co 10 minut.
Ze względu na duże zainteresowanie środowiskiem testowym KSeF oraz jego specyfiki wprowadzone zmiany mają na celu zapewnienie wszystkim użytkownikom możliwości prowadzenia testów na stabilnym środowisku. Jednocześnie informujemy, że serwer testowy nie jest przeznaczony do testów wydajnościowych.

no to koniec testowania ;)

0

Czy w pozycjach faktur zakładacie unikalność wiersza na podstawie jakiegoś jednego lub kilku pól?

Mam założoną unikalność na NrWierszaFa (na wizualizacji PDF pochodzącej z webowego KSeFa NrWierszaFa przedstawiony jest jako Lp.).
Jednak w środowisku produkcyjnym otrzymaliśmy fakturę korygującą, w której wykazane są zdublowane wiersze w zakresie pól NrWierszaFa oraz UU_ID. Jeden wiersz opisujący co było przed korektą, drugi po korekcie.

Przejrzałem kilka podmiotów w KSeF TEST i nie spotkałem się nigdzie, żeby ktoś stosował zdublowaną numerację wierszy przy korektach.

W schemacie XSD faktury (w załączniku) opis NrWierszaFa wskazuje, że to jest "Kolejny numer wiersza faktury", natomiast UU_ID jako "Uniwersalny unikalny numer wiersza faktury".

Faktem jest, że KSeF przyjął taki układ i faktura wygenerowała się, ale nie jestem pewien, czy to jest kwestia luki w walidacji po stronie KSeF, czy tak musimy żyć? Czy może warto zapytać support o interpretację sytuacji?
Podzielcie się jak traktujecie NrWierszaFa w pozycji faktury?

ksef_schemat_xsd.pngksef_fa_korekta.png

0

Cześć
Czy ktoś wie, kiedy zostanie opublikowany schemat FA(3)? Miało być jakoś na jesieni. Spoglądam za okno i jakby nie patrzeć to już lato nie jest. Pamiętam, że kiedyś były problemy z dostępnością plików dotyczących ksef, więc może to już jest udostępnione tylko mnie ominęło i ktoś jest w posiadaniu nowego xsd'ka? W takim wypadku czy mógłby się podzielić pretty please.

1

Pozdrawiam

Niedawno zacząłem po raz pierwszy testować środowisko demo, ale mam problem z generowaniem UPO:
GET ksef-demo.mf.gov.pl/api/common/Upo/ondemand/:ReferenceNumber/:KsefReferenceNumber

Kopiuj
{
    "exception": {
        "serviceCtx": "srvTRMFA",
        "serviceCode": "E0E8E25C-3528-4336-B488-B43D5CD80CA5",
        "serviceName": "exception.handler",
        "timestamp": "2024-10-17T11:32:15.297Z",
        "exceptionDetailList": [
            {
                "exceptionCode": 21180,
                "exceptionDescription": "Nieprawidłowe żądanie."
            }
        ]
    }
}

screenshot-20241017134240.png

Ten endpoint działał na ksef-test.mf.gov.pl bez zarzutu....

Czy ktoś ma więcej informacji na temat /common/Upo/ondemand?
Czy są różne wersje działające na KSeF - wersja testowa i KSeF - wersja przedprodukcyjna ?

1

Od 29 października 2024 r. od godziny 22.00 do 30 października 2024 r. do godziny 04.00 będą prowadzone prace serwisowe na środowisku produkcyjnym oraz środowisku testowym API Krajowego Systemu e-Faktur.

W tym czasie mogą wystąpić chwilowe utrudnienia w dostępie do tych środowisk oraz Aplikacji Podatnika KSeF.

https://www.podatki.gov.pl/komunikaty-techniczne/prace-serwisowe-na-srodowisku-produkcyjnym-i-testowym-krajowego-systemu-e-faktur/

1

Konsultacje podatkowe struktur logicznych FA(3) i FA_RR(1) oraz koncepcji funkcjonowania załącznika do faktury w KSeF:
https://www.gov.pl/web/finanse/konsultacje-podatkowe-struktur-logicznych-fa3-i-farr1-oraz-koncepcji-funkcjonowania-zalacznika-do-faktury-w-ksef

0

To mój pierwszy wpis, ale czytam Wasze posty od kilku miesięcy - tj. odkąd wziąłem się za KSeF. Szczególne uznanie chciałbym wyrazić dla @Dzyszla za próby ogarnięcia tego KSyFu, który zafundował nam Wielki Brat. Ten system jest tak źle zaprojektowany, że integracja z nim po prostu boli. Implementując KSeF w swojej aplikacji próbowałem zgłaszać uwagi na info.ksef@mf.gov.pl, ale odpowiedzi przychodzą z absurdalnym opóźnieniem, i nie są ani mądre ani użyteczne. Pewnie nawet nie docierają do kogoś, kto jest tam zorientowany w temacie (o ile ktoś taki jest). Na wypadek więc gdyby ktoś z Was miał jakiś kontakt z twórcami KSeF, i podzielił moje postulaty, proszę o ich przekazanie:

  1. Brakuje identyfikacji faktur. W przypadku wysyłki wsadowej nie ma praktycznie możliwości znalezienia faktury, która była niezgodna ze schemą i wywaliła wysyłkę. Ten problem mogłoby rozwiązać podawanie w odpowiedzi na /api/online/Session/Status nazw plików w paczce (o tym @Dzyszla już pisał), choć już sama koncepcja, że trzeba nawiązać sesję interaktywną żeby się czegoś dowiedzieć o wsadowej jest absurdalna.
    Problem identyfikacji nie dotyczy jednak wyłącznie wysyłki wsadowej, ale wszystkich wysyłanych faktur. Można je rozpoznawać w odpowiedziach wyłącznie po numerze faktury lub skrócie, ale ani jedno ani drugie nie jest jednoznaczym identyfikatorem, bo przepisy pozwalają mieć np. fakturę i korektę (innej faktury) o tych samych numerach, a skróty nie są z definicji unikalne (choć w praktyce duplikaty są mało prawdopodobne).
    KSeF powinien wraz z każdą przesyłaną fakturą przyjmować jej identyfikator nadawany przez aplikację kliencką, i podawać ten identyfikator (o ile go podano) w każdej odpowiedzi na pytanie o fakturę, także w UPO. Z punktu widzenia aplikacji klienckiej wystarczyłoby żeby identyfikator był unikalny w sesji, ale równie dobrze mogły to być AUTOINC, SERIAL lub tp. w bazie klienta. Tak w ogóle, to mógłby zastąpić nieszczęsne "elementReferenceNumber", które w wysyłce wsadowej i tak są nie do ogarnięcia.
  2. Brak api/batch/Abort. Wysyłka wsadowa i zapis informacji o niej do bazy danych klienta powinny być operacją atomową (transakcją) - albo powinny być pomyślnie wykonane obie, albo żadna. Niestety aktualnie nie ma możliwości przerwania - tj. wymuszenia zamknięcia z kodem 4xx - sesji wsadowe, np. w przypadku błędu bazodanowego po stronie klienta. Samo niewywołanie api/batch//Finish, lub wywołanie go przed api/batch/Upload nic nie daje - sesja wisi ze statusem 3xx.
  3. Gorąco popieram postulat udostępniania przez KSeF faktur w postaci PDF i HTML. Skoro uzasadnieniem (raczej nieprawdziwym) KSeF była potrzeba standaryzacji, to faktura powinna wyglądać tak samo niezależnie gdzie i w jakim programie ją oglądamy (dotyczy to zwłaszcza księgowych w biurach rachunkowych).
  4. KSeF powinien też udostępniać kod QR dla faktury w postaci JPG, PNG lub tp. Nie powinni wymuszać na klientach implementacji lub zakupu narzędzi do generowania tych kodów.
  5. Specyfikacja powinna zawierać algorytm obliczania cyfr kontrolnych (tj. ostatnich dwóch) w numerach KSeF faktur, sesji itp. Szczególnie numery KSeF faktur będą wprowadzane w księgowości z klawiatury, i powinna być przy wprowadzaniu możliwość wyłapania błedu - jak to jest w przypadku NIP, PESEL itp.
    Pisałem w tej sprawie do KSeF; odpisali że to jest tajne żeby nikt nie podrobił numeru KSeF. To nie ma sensu, skoro i tak do potwierdzenia że numer jest autentyczny konieczne jest UPO.
  6. Nie ma (ja nie znam) możliwości ustalenia numeru sesji dla numeru KSeF faktury. To by się bardzo przydało żeby móc uzupełnić bazę danych klienta w przypadku gdy faktura była przesłana poza aplikacją kliencką (np. z Aplikacji Podatnika KSeF) lub wystąpił błąd w trakcie wysyłki i informacja o wysyłce się nie zapisała.
  7. Mała, ale bezsensowna rzecz: do RevokeToken potrzebny jest numer referencyjny tokena zamiast samego tokena. Nie da sie tego uzasadnić względami bezpieczeństwa, skoro w odpowiedzi na GenerateToken token podawany jest jawnie. Niestety teraz żeby unieważnić token trzeba mieć tabelę wygenerowanych tokenów z ich numerami referencyjnymi. I niestety nie da się unieważnić tokena jeśli nie ma go w tej tabeli. Można niby użyć /api/online/Query/Credential/Sync, ale do tego potrzebne są wyższe uprawnienia niż do samego RevokeToken.
  8. Czy ktoś wie jak bardzo unikalne są tokeny?
    a) są unikalne uniwersalnie (w sensie UUID) - tj. nie mogą się powtórzyć w ogóle?
    b) są unikalne w obrębie środowiska (ale token z jednego środowiska może też wystąpić w innym)?
    c) są unikalne tylko w ramach pojedynczej firmy w pojedynczym środowisku KSeF?

PS. Tego się raczej nie zmieni, ale dualizm KSeF - rozdział na sesje interaktywne i wsadowe - to fundamentalny błąd. Z powodzeniem można by zaimplementować wysyłkę wsadową jako sesje interaktywne albo zalozyc ze wysylka (nawet pojedynczej faktury) jest zawsze wsadowa.

0

Pytanie: mówię użytkownikowi żeby wypróbował obsługę KSeF w mojej aplikacji, i żeby zaczął od środowiska testowego, wymyślonej firmy - np. z NIP 9999999999.
Ale jak on ma podpisać np. wysyłkę wsadową, skoro przecież jego podpis kwalifikowany ani profil zaufany nie ma nic wspólnego z firmą, która ma NIP 9999999999?
Nie powiem przecież użytkownikowi żeby sobie zrobił do tego (niekwalifkowaną) pieczęć firmową, bo 99% użytkowników na tym polegnie. Jest jakaś sztuczka na to podpisywanie? Może coś podobnie dziwacznego jak logowanie do środowiska testowego w Aplikacji Podatnika KSeF?

0

@Dzyszla
OK, ma to pewien sens żeby nie dawać użytkownikom dostępu do środowiska testowego. Sam też szybko je porzuciłem implementując obsługę KSeF, między innymi w związku z opisanym wyżej problemem. Kłopot jednak w tym, że w środowisku demo można fakturować tylko w swojej firmie; jak wobec tego użytkownik ma tam wypróbować dostawanie faktur od innych firm (tj. działanie jako nabywca)?

0

Witajcie.
Taka heheszka (ale kolejna kropla dziekciu): zrobiłem sobie "po siekierze" skrypt sprawdzający komunikaty z https://ksef.podatki.gov.pl/komunikaty-techniczne/ w temacie KSeF i się zaczął sypać. Sprawdzam więc "co tym razem skopałem", ale wchodzę na wspomnianą stronę i widzę :
screenshot-20241206081531.png
;)

0

Witajcie,
Chciałbym również podzielić się swoimi postulatami na temat ksef.

  1. Aktualnie ksef jest odpowiedzialny za dwie rzeczy: Magazynowanie faktur i Generowanie numeru ksef. Niniejszym postuluję, aby system ksef był odpowiedzialny wyłącznie za magazynowanie. Aktualnie odroczono kwestie powiązania tego numeru z płatnościami, a uważam że z tego względu będą z tym ogromne problemy. Przykładowo co jeśli płatność jest przed fakturą? Rozwiązałoby to również problem z niedostępnością systemu.
  2. Niedługo będzie system europejski. Postuluję aby konwersja standardów była zrobiona po stronie ksef, żeby nie robić drugiej integracji.
0

Cześć.
Czy spotkał się ktoś z problemem dostępu do środowiska testowego.
Gdy wklejam w przeglądarce adres https://ksef-test.mf.gov.pl/api/common/Status/123 dostaję odpowiedź:

Kopiuj
{"exception":{"serviceCtx":"srvTEMFD","serviceCode":"68770DEA-A667-4027-9779-F99EF9CE6DD6","serviceName":"exception.handler","timestamp":"2024-12-23T21:09:17.788Z","exceptionDetailList":[{"exceptionCode":21180,"exceptionDescription":"Nieprawidłowe żądanie."}]}}

tutaj jest ok.
Natomiast jeśli wchodzę na tę samą stronę z innej maszyny [inny numer IP] dostaję błąd 403
screenshot-20241223221617.png
Czyżby ten adres został zablokowany przez KSeF? Parę dni temu jeszcze działało normalnie. Jak napiszę do ksef-info to pewnie dostanę odpowiedź za 3 miesiące.
Edit: Samo wejście na stronę https://ksef-test.mf.gov.pl/ z maszyny z innym IP wyrzuca błąd jak na załączonym obrazku

0

Czy ktoś już wie (i może się tą wiedzą podzielić) jak obliczać cyfry kontrolne - tj. ostatnie dwie - w numerze KSeF?
Spytałem o to info.ksef w sierpniu br. We wrześniu odpowiedzieli:
"(..) Informujemy, że z uwagi na bezpieczeństwo generowania numerów KSeF oraz aby ograniczyć możliwości nadużyć w związku z generowaniem numeru KSeF nie będziemy udostępniać algorytmu tworzenia numeru KSeF oraz algorytmu tworzenia tokenów."
Odpowiedź wydała mi się równie bezsensowna jak ich inne, więc spróbowałem drążyć:
*"(..) Proszę mi wyjaśnić (podać przykłady) jakie nadużycia byłyby możliwe gdyby algorytm obliczania cyfr kontrolnych był jawny (i podany w specyfikacji).
Zwracam uwagę, że skoro jedynym dowodem na autentyczność numeru KSeF jest UPO KSeF (gdyby tak nie było, i sam numer KSeF by czegoś dowodził, to istnienie UPO KSeF nie miałoby sensu), to wygenerowanie fałszywego numeru KSeF nie rodzi żadnych konsekwencji. Jeśli ktoś prześle w zapytaniu taki numer do KSeF, to po prostu nie zostanie on odnaleziony w bazie danych KSeF i zwrócony zostanie błąd."

A oni, 30 grudnia, znów swoje:
"Dziękujemy za przesłaną opinię. Nie przewidujemy jednak zmiany w podejściu do udostępniania algorytmu tworzenia numeru KSeF." :/

0

Cześć.
Od wczoraj (07.01.2025) na KSeF-TEST przy próbie sprawdzenia statusu sesji (/common/Status/[NrSesji]) dostaję zwrot:
<head>

<title>Blokada dostÄpu: wykryto podejrzanÄ aktywnoÅÄ</title> </head> <body> Przepraszamy, dostÄp do tej strony zostaÅ zablokowany z powodu wykrycia podejrzanego ruchu.
Aby zapewniÄ bezpieczeÅstwo naszych usÅug oraz danych użytkowników, system automatycznie zablokowaÅ Twoje żÄdanie.
JeÅli uważasz, że to bÅÄd, prosimy o kontakt z administratorem systemu pod adresem info.ksef@mf.gov.pl w celu uzyskania dalszej pomocy.
DziÄkujemy za zrozumienie.
[Wstecz]

We're sorry, access to this page has been blocked due to detected suspicious behavior.
To ensure the security of our services and user data, the system has automatically blocked your request.
If you believe this is a mistake, please contact the system administrator at info.ksef@mf.gov.pl for further assistance.
Thank you for your understanding.
[Go Back]

Support ID: 9175858694855234185<script type="text/javascript" src="/_Incapsula_Resource?SWJIYLWA=719d34d31c8e3a6e6fffd425f7e032f3&amp;ns=2&amp;cb=734424731" async="async"></script></body></html>

AuthorisationChallenge oraz online/Session/InitToken przechodzi ale gdy próbuję później wywołać /common/Status/[NrSesji] to już się wysypuje. Przez przeglądarkę loguję się bez problemu.

Próbowałem na różnych komputerach, w różnych lokalizacjach (inne adresy IP). Próbowałem również logować się na 3 różne numery NIP z różnymi tokenami i wszędzie to samo.

Czy ktoś z was miał taki problem?

0

Czy działa Wam pobieranie upo czy to dla sesji czy dla pojedynczej faktury dla nowo wysłanej faktury ? Środowisko test.

0

Znacie kogoś w ogóle kto używa tego KSEFu na "aktualnej" produkcji ?:)

1
Stl86 napisał(a):

Znacie kogoś w ogóle kto używa tego KSEFu na "aktualnej" produkcji ?:)

Tutaj chyba masz jednego.

0

Hej,
Działa u kogoś query/Invoice/Sync (środowisko testowe)? Czego bym nie dał w body, dostaję odpowiedź "Dokument nie jest zgodny ze Schemą (json)'

Wygląda to tak:

Kopiuj
{
  "queryCriteria": {
    "hidingDateFrom": "2025-01-20T13:12:07",
    "hidingDateTo": "2025-01-30T13:12:07",
    "isHidden": true,
    "subjectType": "subject1",
    "type": "detail"
  }
}

Ma ktoś ewentualnie przykład poprawnego żądania?

0

Witam wszystkich na tym łez padole. Czy ma ktoś jakieś insajderskie info kiedy FA3 będzie przyklepana albo wypuszczą oficjalną nową wersję? Wszędzie słyszę tylko, że "przed wejściem w życie fakultatywnego ksef" czyli równie dobrze mogliby powiedzieć "wypuścimy za miesiąc, albo za sześć... whatever f*** you".
Nie siedziałem w ksefie od początku, więc może ktoś pamięta jak to było z przechodzeniem z FA1 na FA2? Schema FA2 w finalnej wersji bardzo się różniła od tej wypuszczonej do konsultacji?

0

Hej, piszę funkcję do generowania tokena w javascript pod url {{ksef_url}}/online/Session/InitToken.

Niestety nie wiem jakie są wymagania od ksefu, jest tylko formułka tokenu, ale co konkretnie to nie ma:
Base64(encrypt(public_key, bytes(token + ‘|’ + challengeTime)))

Niestety error cody Ksefu nie sa zbyt pomocne i dostaję odpowiedź:
"exceptionCode": 31000,
"exceptionDescription": "Nieprawidłowe wywołanie."

Czy ktoś robi integrację z KSeFem przez javascript / Typescript i ma gotowca żeby się podzielić? Byłbym niezmiernie wdzięczny, albo o zerknięcie na kod niżej i zobaczenie czy coś jest w moim myśleniu nie tak.

Struktura projektu:
files/publicKey.pem
initToken.js

publicKey.pem

Kopiuj
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuWosgHSpiRLadA0fQbzshi5TluliZfDsJujPlyYqp6A3qnzS3WmHxtwgO58uTbemQ1HCC2qwrMwuJqR6l8tgA4ilBMDbEEtkzgbjkJ6xoEqBptgxivP/ovOFYYoAnY6brZhXytCamSvjY9KI0g0McRk24pOueXT0cbb0tlwEEjVZ8NveQNKT2c1EEE2cjmW0XB3UlIBqNqiY2rWF86DcuFDTUy+KzSmTJTFvU/ENNyLTh5kkDOmB1SY1Zaw9/Q6+a4VJ0urKZPw+61jtzWmucp4CO2cfXg9qtF6cxFIrgfbtvLofGQg09Bh7Y6ZA5VfMRDVDYLjvHwDYUHg2dPIk0wIDAQAB
-----END PUBLIC KEY-----

Kopiuj
import fs from 'fs';
import path from 'path';
import crypto from 'crypto';
import { fileURLToPath } from 'url';
import { dirname } from 'path';

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

const USER_AUTH_TOKEN = '9B25A44A7FC94B00C3BB17C2E1468380522609DD96B667DDC8741EEB555E2ED4'; // Token autoryzacyjny
const AUTHORIZATION_CHALLENGE = {
    timestamp: "2025-02-06T08:51:51.318Z",
    challenge: "20250205-CR-3C98C1F822-4588DBAD54-47"
};

function fetchKsefPublicKey() {
    const publicKeyPath = path.join(__dirname, "files", "publicKey.pem");
    const publicKeyPem = fs.readFileSync(publicKeyPath, "utf8");
    return publicKeyPem;
}

function parseChallengeTimestamp(challengeTimestamp) {
    return new Date(challengeTimestamp);
}

// formula: Base64(encrypt(public_key, bytes(token + ‘|’ + challengeTime)))
function generateSessionToken(userAuthToken, challengeTimestamp) {
    const publicKeyPem = fetchKsefPublicKey();
    const publicKey = crypto.createPublicKey({
        key: publicKeyPem,
        format: 'pem',
        type: 'spki'
    });

    const message = `${userAuthToken}|${challengeTimestamp.getTime()}`;
    console.log('token|timestamp: \n', message);
    const buffer = Buffer.from(message, 'utf8');

    const encryptedToken = crypto.publicEncrypt({
        key: publicKey,
        padding: crypto.constants.RSA_PKCS1_PADDING
    }, buffer);

    return encryptedToken.toString('base64');
}


// Example usage
const challengeTimestamp = parseChallengeTimestamp(AUTHORIZATION_CHALLENGE.timestamp);
const encodedToken = generateSessionToken(USER_AUTH_TOKEN, challengeTimestamp);
console.log('Encoded Token: \n', encodedToken);

logi:
token|timestamp:
9B25A44A7FC94B00C3BB17C2E1468380522609DD96B667DDC8741EEB555E2ED4|1738832031318
tokenForInitSessionTokenRequest.js:36

Encoded Token:
StVogqPJW2m/4vj6bfAfXexioMAdLDMYEbwvouamP82naGNy2bRBgbT+ZZy5o6XaC09tPi1ycW2zy4h6Yqd1ESbOnsIHBbzkO3G+GtdwfANSzdbKHjJuoMIzjgeFpFsiGexXfgsrkAUhRXcK9dhywFEZHOtNYMEgfQO+t09I2o2Z/TT8B7Z1Dg+EmUG0TqgSW5u7iP6TJPNSlKpR/P4uG10isEwibe8wfrXePy6bY5xx2SN0o/4WEATMGQsxoYW+xte4nAIBktsdhk1IyjWMRhxOhXfWVB5YiFlMRrPscQJq4EyxcxwK70TrCg0fbN1D2dR7m3SG8v7QKpt8KOXaww==

POST {{ksef_url}}/online/Session/InitToken
POST https://ksef-test.mf.gov.pl/api/online/Session/InitToken
W headerach Content-Type: application/octet-stream

Kopiuj
<ns3:InitSessionTokenRequest xmlns="http://ksef.mf.gov.pl/schema/gtw/svc/online/types/2021/10/01/0001"
    xmlns:ns2="http://ksef.mf.gov.pl/schema/gtw/svc/types/2021/10/01/0001"
    xmlns:ns3="http://ksef.mf.gov.pl/schema/gtw/svc/online/auth/request/2021/10/01/0001">
    <ns3:Context>
        <Challenge>{{-challenge-}}</Challenge>
        <Identifier xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:SubjectIdentifierByCompanyType">
            <ns2:Identifier>{{-nipIdentifier-}}</ns2:Identifier>
        </Identifier>
        <DocumentType>
            <ns2:Service>KSeF</ns2:Service>
            <ns2:FormCode>
                <ns2:SystemCode>FA (2)</ns2:SystemCode>
                <ns2:SchemaVersion>1-0E</ns2:SchemaVersion>
                <ns2:TargetNamespace>http://crd.gov.pl/wzor/2021/11/29/11089/</ns2:TargetNamespace>
                <ns2:Value>FA</ns2:Value>
            </ns2:FormCode>
        </DocumentType>
<Token>{{-initSessionToken-}}</Token>
    </ns3:Context>
</ns3:InitSessionTokenRequest>

0

Hej

Krok 1: Udało mi się uzyskać authorization challange: POST /online/Session/AuthorisationChallenge 201 Created

Krok 2: Stamtąd generuję token i inicjuję sesję interaktywną: POST /online/Session/AuthorisationChallenge 201 Created
Zwraca mi coś takiego:

Kopiuj
{
    "timestamp": "2025-02-10T10:48:25.173Z",
    "referenceNumber": "aaaaaaaaaa",
    "sessionToken": {
        "token": "bbbbbbbbbbbbbbbb",
        "context": {
            "contextIdentifier": {
                "type": "onip",
                "identifier": "ccccccccccccccc"
            },
            "contextName": {
                "fullName": "CN_cccccccccccccccccc"
            },
            "credentialsRoleList": [
                {
                    "type": "token",
                    "roleType": "invoice_read",
                    "roleDescription": "Test Token for OC - all rights",
                    "startTimestamp": "2025-02-04T08:58:01.409Z",
                    "roleRecipientIdentifier": {
                        "type": "onip",
                        "identifier": "ccccccccccccccc"
                    }
                },
...

Krok 3: (chyba dobry krok...) Chcę zainicjować zapytanie asynchroniczne na adresie: POST /online/Query/Invoice/Async/Init

  • Według swaggera w headerach nic nie muszę wpisywać, jest jeden opcjonalny parametr, więc go pomijam.
  • Według swaggera body w requeście wyglądać ma tak:
Kopiuj
{
  "queryCriteria": {
    "hidingDateFrom": "2024-02-10T11:06:36.301Z",
    "hidingDateTo": "2025-02-10T11:06:36.301Z",
    "isHidden": true,
    "subjectType": "subject1"
  }
}

Zwraca mi odpowiedź 400 Bad Request

Kopiuj
{
    "exception": {
        "serviceCtx": "srvTEMFC",
        "serviceCode": "20250210-EX-B7544A2A71-FB2588300F-B3",
        "serviceName": "online.query.query.invoice.init",
        "timestamp": "2025-02-10T11:30:21.856Z",
        "exceptionDetailList": [
            {
                "exceptionCode": 21001,
                "exceptionDescription": "Nieczytelna treść."
            }
        ]
    }
}

Nie wiem co w body wrzucić, dla mnie ten request nie ma sensu, chyba że coś w headerach brakuje, jakiś reference number albo body mam zły template.

0

Hej, próbuję rozgryźć w jaki sposób wysyłana faktura ma być zaszyfrowana, dokumentacja wspomina o sha256, ale jak próbuję jej użyć to mi zwraca błąd, że plik jest za duży, by encryptować:

Piszę w Javascript. Mój algorytm to:

Kopiuj
import fs from 'fs';
import path from 'path';
import crypto from 'crypto';
import { fileURLToPath } from 'url';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

function fetchKsefPublicKey() {
    const publicKeyPath = path.join(__dirname, "files", "publicKey.pem");
    const publicKeyPem = fs.readFileSync(publicKeyPath, "utf8");
    return publicKeyPem;
}

function fetchDocument() {
    const documentPath = path.join(__dirname, "files", "INPUT_INVOICE_FILE.xml");
    const documentXML = fs.readFileSync(documentPath, "utf8");
    return documentXML;
}

// formula: Base64(encrypt(public_key, bytes(invoice)))
function encryptDocument(userAuthToken) {
    const publicKeyPem = fetchKsefPublicKey();
    const publicKey = crypto.createPublicKey({
        key: publicKeyPem,
        format: 'pem',
        type: 'spki'
    });

    const message = fetchDocument();
    const buffer = Buffer.from(message, 'utf8');
    console.log(buffer.length)

    const encryptedDocument = crypto.publicEncrypt({
        key: publicKey,
        padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
        oaepHash: 'sha256'
    }, buffer);

    return encryptedDocument.toString('base64');
}

// Example usage
const encryptedDocument = encryptDocument();
console.log('Encoded Token: \n', encryptedDocument);

Niestety zwraca błąd, że mój algorytm nie może być użyć do szyfrowania: Uncaught Error Error: error:0200006E:rsa routines::data too large for key size

Przykładowe body jakie oczekują wg dokumentacji to:

Kopiuj
{
  "invoiceHash": {
    "fileSize": 2095,
    "hashSHA": {
      "algorithm": "SHA-256",
      "encoding": "Base64",
      "value": "XmkSPD+29077TumY6E49OkHkmbScHqtbvRw0XXmNJ3Q="
    }
  },
  "invoicePayload": {
    "type": "encrypted",
    "encryptedInvoiceHash": {
      "hashSHA": {
        "algorithm": "SHA-256",
        "encoding": "Base64",
        "value": "SJ/hCjkiDGjJiXifcn6IqUGaX6ZEKe6JpXKLd4s3N+w="
      },
      "fileSize": 2368
    },
    "encryptedInvoiceBody": "HbtITYLk4Eae...9A9bK2pOHc47ZnbA7SSEA=="
  }
}

Jakie są poprawne kroki, żeby zaenkryptować fakturę i czy ja dobrze rozumiem, że hash ma też być zaencryptowany? czy to jest hash zaenkryptowanej faktury? Pls, help :)

0

Witajcie.
Widzę, że czasem ciężko coś znaleźć na tym forum i to w konkretnym wątku/temacie KSeF.
Jako, że nigdzie nie znalazłem wyszukiwania w ramach tylko jednego wskazanego wątku,
to posługuję się wyszukiwaniem z poziomu "wujka G" pisząc w ten sposób:
sha256 site:https://4programmers.net/Forum/Nietuzinkowe_tematy/355933-krajowy_system_e_faktur
(może się komuś przyda taka wskazówka).

1
v2 napisał(a):

Czy ktoś już wie (i może się tą wiedzą podzielić) jak obliczać cyfry kontrolne - tj. ostatnie dwie - w numerze KSeF?

Właśnie napisałem do tego prostą klasę w JS na podstawie tego "wycieku" informacji z aplikacji webowej :)
https://gist.github.com/zb3/6e87e84b302e34b5bdb4e94fc3cd8c2b

0

witam.
dawno nie zaglądałem do ksefu i postanowiłem odświeżyć wiedzę i pod adresem https://ksef-test.mf.gov.pl/ jest jakieś nowe upo v4 oraz stara wersja wersja specyfikacji jakby 1.7 ale w treści 1.6, a ja zapisaną u siebie mam 1.8. yaml-e niby się nie zmieniły. Ostatnie zmiany robiłem w czerwcu 2024. Coś się zmieniło w tym czasie? I o co chodzi z tym upo4?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.