U Was klienci też na DI się upierali?
https://www.bankier.pl/wiadomosc/KSeF-chaos-w-oznaczeniach-Ktora-opcje-wybrac-Ministerstwo-odpowiada-9114444.html
Krajowy system e-Faktur
- Rejestracja: dni
- Ostatnio: dni
- Postów: 264
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1
Cz nie macie problemów z tokenami wersji demo i test ?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 36
Hej.
Czy ktoś wie (albo może wskazać informację) w jaki sposób liczony jest VAT na fakturze w Aplikacji Podatnika?
Klient mi zarzuca, że źle kalkuluję VAT.
Po analizie przypadku wychodzi mi, że w AP VAT jest liczony od sumy netto.
W mojej aplikacji VAT jest liczony dla każdej pozycji faktury osobno.
Oba sposoby są oczywiście zgodne z prawem i ja z tym nie mam problemu.
Szukam tylko jawnej informacji o tym, że AP liczy właśnie tak, bo nie potrafię znaleźć opcji, która pozwala to zmienić.
Dzięki za pomoc
- Rejestracja: dni
- Ostatnio: dni
- Postów: 106
No i na czym stanęły te wszystkie dyskusje o wgrywanie certów czy upraweniania ?:) Widzę, że jednak dużo firm postawiło jednak na wgrywanie certów i każdy olewa to i bierze normalnie klucze prywatne.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 108
Cześć,
szukam i pobieram faktury w następujący sposób:
- Loguję się certyfikatem
- Pobieram w pętli listę metadanych faktur (dopóki
hasMore== true), gdzie limit pozycji na stronę mam ustawiony na 50 - Dla każdego wyszukanego numeru KSeF (jeśli nie istnieje on już w mojej bazie), pobieram XML'a w pętli i wstawiam go do bazy.
Niestety, dzisiaj dostałem informację, że mój program zwrócił błąd 429 too many requests. Zakres filtrów był ustawiony na cały kwiecień i wyszukiwanie zwróciło tylko jedną stronę - czyli nie więcej niż 50 faktur. Jak to jest możliwe, że zostałem ograniczony przez limit? Według dokumentacji API, pobieranie faktur po nr ksef jest ograniczone do 80 pozycji na sekundę.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 3902
Pytanie: czy da się skorygować datę wystawienia, klient wysłał korektę z datą wcześniejszą niż faktura korygowana...
- Rejestracja: dni
- Ostatnio: dni
- Postów: 125
"zostanie przeanalizowana zasadność ewentualnego utrzymania niektórych rozwiązań liberalizujących warunki wdrożenia KSeF dla najmniejszych podmiotów czy też dokonania ew. ewaluacji narzędzi do autoryzacji w KSeF. Jednak obecnie jest za wcześnie, by o tym decydować."
I teraz nie wiadomo - cieszyć się bo tokeny zostaną, czy płakać bo przeorka uwierzytelnienia się szykuje xd
- Rejestracja: dni
- Ostatnio: dni
- Postów: 17
czy tylko u mnie ksef ma czkawkę i czka 150-tkami ?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 10
#JST#Uprawnienia
Mam bardzo dziwną sytuacje u klienta, i nawet nie wiem gdzie szukać informacji! Ale fakt że na portalu ministerstwa to działa!
Mam:
NIP1 - 1111111111 (Gmina)
NIP2 - 222222222 (Szkoła)
PESEL - 333333333 (Pani księgowa)
Gmina -> nadała uprawniania szkole za pomocą !!!Pisma do US!!!. Niestety nie widziałem tego pisma
Szkoła -> nadała uprawnienia na pesel księgowej do pracy w kontekście !!!Szkoły!!!
Księgowa -> zalogowała się na NIP Szkoły i wygenerowała certyfikat. W "moje uprawnienia" widzi, że ma uprawnienia na wystawianie faktur w kontekście Szkoły!
I tutaj się zaczyna magia! :)
Pani księgowa - będąc zalogowana w kontekście Szkoły, mając uprawnienia na wystawianie faktur w kontekście Szkoły, wchodzi w "Wystaw fakturę", wpisuje jako NIP Sprzedawcy - NIP Szkoły, i dostaje komunikat, że nie może wystawić fakturę dla tego NIPu. Wpisuje NIP Gminy i wszystko przechodzi!
Czyli w uprawnieniach w prost napisano, że może wystawiać faktury jako Szkoła, ale de fakto nie może. W uprawnieniach nie ma żadnego słowa o nipie Gminy, ale może wystawić fakturę jako Gmina.
Zwykłą ścieżkę uprawnień (Gmina -> Szkoła -> Pesel) mam ogarniętą.
Czy ktoś miał podobną sytuacje? Czy może chociażby wie jak taki scenariusz się nazywa?
Z góry dziękuję za każdą podpowiedż!!!
- Rejestracja: dni
- Ostatnio: dni
- Postów: 92
Proszę o pomoc w rozwikłaniu niuansów JST.
-
W strukturze FA(3) w węźle Podmiot2 pole JST określa, czy faktura dotyczy jednostki podrzędnej . Wartość pola to integer z możliwymi wartościami 1 i 2. Czy zgodnie z opisem w .xsd 1 = "TAK (faktura dotyczy)" i 2 = "NIE (faktura nie dotyczy)" jednostki podrzędnej? Czy jest jednak odwrotnie (1 - nie dotyczy, 2 - dotyczy) jak mówią niektóre źródła?
-
Jeśli pole Podmiot2.JST mówi "dotyczy" to wtedy musi istnieć węzeł Podmiot3 z rolą 8 (JST odbiorca) z NIPem innym niż NIP Podmiotu2. I z jego istnienia wynika potrzeba ustawienia w Podmiot2 pola JST na "dotyczy". Czy tak jest?
-
Istnienie węzła Podmiot3 z rolą 7 (JST Wystawca) nie wpływa na wartość pola JST w Podmiot2, po prostu znaczy to tyle że fakturę też wystawia jednostka podrzędna. Czy tak jest?
-
Przyjmijmy takich aktorów na scenie jak poniżej. Proszę o potwierdzenie poprawności "kombinacji" Podmiotów1, 2 i 3 w wynikowym pliku XML.
Aktorzy:
Sprzedawca (JST nadrzędna) - Województwo
Sprzedawca - jednostka podległa (tech. wystawca) - Wojewódzki Ośrodek Metodyczny
Nabywca (JST nadrzędna) - Gmina
Nabywca - jednostka podległa (odbiorca) - Szkoła w Gminie
Nabywca Inny - randomowa firma ABC, niezwiązana w żaden sposób z nikim
sytuacja a)
Wojewódzki Ośrodek Metodyczny wystawia fakturę randomowej firmie ABC
W tym przypadku Wojewódzki Ośrodek Metodyczny jest wystawcą operacyjnym, działającym w imieniu JST nadrzędnej (Województwa), a nabywca nie jest jednostką JST.
Podmiot1: Dane JST nadrzędnej (Województwo).
Podmiot2: Dane firmy ABC.
Podmiot3: Dane Wojewódzkiego Ośrodka Metodycznego z rolą 7 (Jednostka samorządu terytorialnego - wystawca)
Pole JST w Podmiot2: "nie dotyczy"
sytuacja b)
Wojewódzki Ośrodek Metodyczny wystawia fakturę dla Szkoły
Jest to transakcja między jednostkami podległymi różnym JST (Województwo -> Gmina).
Podmiot1: Dane JST nadrzędnej sprzedawcy (Województwo)
Podmiot2: Dane JST nadrzędnej nabywcy (Gmina)
Pole JST w Podmiot2: "dotyczy"
Podmiot3 (wystąpienie nr 1): Dane Wojewódzkiego Ośrodka Metodycznego z rolą 7 (JST - wystawca)
Podmiot3 (wystąpienie nr 2): Dane Szkoły z rolą 8 (JST - odbiorca)
sytuacja c)
Randomowa firma ABC wystawia fakturę dla Szkoły
Standardowy zakup jednostki podrzędnej JST od zewnętrznego dostawcy.
Podmiot1: Dane firmy ABC.
Podmiot2: Dane JST nadrzędnej nabywcy (Gmina)
Pole JST w Podmiot2: "dotyczy"
Podmiot3: Dane Szkoły z rolą 8 (JST - odbiorca)
- Rejestracja: dni
- Ostatnio: dni
- Postów: 125
Tak z ciekawości, gdyż zakładam, że macie już jakieś obserwacje: jaką kreatywnością wykazali się wystawcy faktur, która spowodowała u was wydanie dźwięku "ehh..."?
U mnie (zakładam, że u wszystkich w sumie) FaWiersz to zagadka logiczna: podawanie cen netto i brutto, wiadomo... rabat itp. Najbardziej frustrujące z operacyjnego punktu widzenia jest pakowanie w pole Indeks po przecinku wszystkiego co się da w 50 znakach zmieścić (id dostawcy, data przydatności, nr partii i czasem o dziwo kod towaru), co u tych samych dostawców nie miało miejsca przed ksefem i teraz rzeźbić trzeba w module magazynowym.
Poza tym (jak się cieszę, że to wyłączyłem) wystawianie faktur na IdWew w Nabywcy. Jak? TPodmiot2.KodKraju = PL, TPodmiot2.NrId = identyfikator wew i wtedy hura: nie trzeba odbiorcy wpisywać
Faktury opłacone wystawiane w ksef jako nieopłacone (ponownie - wcześniej Ci sami dostawcy wystawiali poprawnie)
O tym, że są dwa obiegi pewnie wspominać nie trzeba: faktura jest w ksef ale również: na mailu albo przez kierowcę tira przywieziona (i to taka bez qr bez numeru ksef i też nie jest to WZ'ka)
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: 700m n.p.m.
- Postów: 687
Czołem,
mam cały czas od wielu godzin pewien problem z długością XML faktur na endpoint:
czyli tworzenie faktury w sesji interaktywnej.
- Inicjalizacja sesji OK (i potem jej zamknięcie)
- wysłanie faktury OK
Następnie kiedy weryfikuje fakturę / pobieram status z endpoint:
Zawsze mam błąd 430:
[status] => stdClass Object
(
[code] => 430
[description] => Błąd weryfikacji pliku faktury
[details] => Array
(
[0] => Rozmiar faktury nie zgadza się z zadeklarowaną wartością: '2024'.
)
)
Funkcja która koduje XML (na początku XML to obiekt klasy \SimpleXMLElement):
public function &encrypt() {
// 1. Wygeneruj surowy XML
$xml = $this->xml->asXML();
// 2. ABSOLUTNE CZYSZCZENIE
// Usuwamy BOM, wszystkie znaki nowej linii i powrotu karetki.
// Robimy to, aby XML był jednym ciągłym ciągiem bajtów.
$xml = str_replace(["\xEF\xBB\xBF", "\r", "\n"], "", trim($xml));
$xml = preg_replace('/>\s+</', '><', $xml);
// 3. ZAPISZ TYMCZASOWY PLIK "CZYSTY"
$tmpXml = tempnam(sys_get_temp_dir(), 'k_xml_');
$tmpEnc = tempnam(sys_get_temp_dir(), 'k_enc_');
file_put_contents($tmpXml, $xml);
// 4. POBIERZ ROZMIAR I HASH Z PLIKU (To jest jedyna pewna wartość dla KSeF)
$this->invoiceSize = (int)filesize($tmpXml);
$this->invoiceHash = base64_encode(hash_file('sha256', $tmpXml, true));
// 5. RĘCZNY PADDING PKCS#7 na bazie ROZMIARU Z PLIKU
$blockSize = 16;
$pad = $blockSize - ($this->invoiceSize % $blockSize);
$xmlPadded = $xml . str_repeat(chr($pad), $pad);
// Nadpisujemy plik wersją z paddingiem
file_put_contents($tmpXml, $xmlPadded);
// 6. Szyfrowanie OpenSSL 3
$aesKeyBin = $this->session->symmetricKey;
$ivBin = random_bytes(16);
$cmdEnc = sprintf(
'openssl enc -aes-256-cbc -K %s -iv %s -in %s -out %s -nosalt -nopad 2>&1',
strtoupper(bin2hex($aesKeyBin)),
strtoupper(bin2hex($ivBin)),
escapeshellarg($tmpXml),
escapeshellarg($tmpEnc)
);
exec($cmdEnc, $out, $code);
if ($code !== 0) throw new \Exception("AES Error: " . implode("\n", $out));
// 7. Budowa paczki do wysłania
$ciphertext = file_get_contents($tmpEnc);
$fullPayloadBin = $ivBin . $ciphertext;
$this->encryptedInvoiceContent = base64_encode($fullPayloadBin);
$this->encryptedInvoiceSize = (int)strlen($fullPayloadBin);
$this->encryptedInvoiceHash = base64_encode(hash('sha256', $fullPayloadBin, true));
@unlink($tmpXml);
@unlink($tmpEnc);
return true;
}
Później używam oczywiście $this->encryptedInvoiceContent i reszty do payloadu, $this->cmdCreate->jsonBody to payload na którym jest potem \json_encode
$this->cmdCreate->jsonBody = new \stdClass();
$this->cmdCreate->jsonBody->invoiceHash = $this->invoiceHash;
$this->cmdCreate->jsonBody->invoiceSize = $this->invoiceSize;
$this->cmdCreate->jsonBody->encryptedInvoiceContent = $this->encryptedInvoiceContent;
$this->cmdCreate->jsonBody->encryptedInvoiceSize = $this->encryptedInvoiceSize;
$this->cmdCreate->jsonBody->encryptedInvoiceHash = $this->encryptedInvoiceHash;
Zamiast $this->invoiceSize = (int)filesize($tmpXml);
próbowałem $this->invoiceSize = strlen(xml)
albo $this->invoiceSize = mc_strlen(xml, '8bit');
albo $this->invoiceSize = mc_strlen(xml, 'UTF-8');
nic nie pomaga KSEF cały czas po rokodowaniu po swojej stronie ma inną długość XML niż moje $this->invoiceSize
Jakieś pomysły o co chodzi?
Środowisko to Debian 12, OpenSSL 3, PHP 7.4
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: 700m n.p.m.
- Postów: 687
Przerobiłem funkcję, aby korzystała z natywnej funkcji PHP:
public function &encrypt() {
// 1. Pobranie XML (wyczyść string przed szyfrowaniem)
$xml = $this->xml->asXML();
$xml = str_replace(["\xEF\xBB\xBF", "\r", "\n"], "", trim($xml));
$xml = preg_replace('/>\s+</', '><', $xml);
// 2. Metadane oryginału
// Używamy strlen(), ponieważ openssl_encrypt operuje na bajtach
$this->invoiceSize = (int)strlen($xml);
$this->invoiceHash = base64_encode(hash('sha256', $xml, true));
// 3. Przygotowanie kluczy
$aesKeyBin = $this->session->symmetricKey;
$ivBin = random_bytes(16);
// 4. Szyfrowanie natywne PHP
/**
* openssl_encrypt z opcją 0 (domyślną) automatycznie:
* - nakłada padding PKCS#7
* - szyfruje AES-256-CBC
* - zwraca wynik zakodowany w Base64 (dlatego używamy OPENSSL_RAW_DATA, by dostać binaria)
*/
$ciphertext = openssl_encrypt(
$xml,
'aes-256-cbc',
$aesKeyBin,
OPENSSL_RAW_DATA, // zwraca surowe bajty zamiast base64
$ivBin
);
if ($ciphertext === false) {
throw new \Exception("Błąd openssl_encrypt: " . openssl_error_string());
}
// 5. Budowa paczki do wysłania: [16B IV] + [Szyfrogram]
$fullPayloadBin = $ivBin . $ciphertext;
// 6. Przypisanie wartości do pól obiektu
$this->encryptedInvoiceContent = base64_encode($fullPayloadBin);
// Rozmiar zaszyfrowany to zawsze IV (16B) + Ciphertext (z dopełnieniem do 16B)
$this->encryptedInvoiceSize = (int)strlen($fullPayloadBin);
// Hash zaszyfrowany liczony z paczki IV + Szyfrogram
$this->encryptedInvoiceHash = base64_encode(hash('sha256', $fullPayloadBin, true));
return true;
}
Dalej to samo, weryfikacja faktury zwraca błąd:
[status] => stdClass Object
(
[code] => 430
[description] => Błąd weryfikacji pliku faktury
[details] => Array
(
[0] => Rozmiar faktury nie zgadza się z zadeklarowaną wartością: '2024'.
)
)
Enigma
Nawet jak "chamsko" zrobię coś takiego, czyli krótki XML który nie ma polskich znaków, to dalej to samo, długość XML po stronie KSEF się nie zgadza, WTF?
$xml = $this->xml->asXML();
$xml = '<?xml version="1.0" encoding="UTF-8"?><Faktura xmlns="http://crd.gov.pl/wzor/2025/06/25/13775/"></faktura>';
$xml = str_replace(["\xEF\xBB\xBF", "\r", "\n"], "", trim($xml));
$xml = preg_replace('/>\s+</', '><', $xml);
- Rejestracja: dni
- Ostatnio: dni
- Postów: 264
Jeśli by do kogoś nie dotarło, to pozwolę sobie dać tu info też:
W dniu 22.04.2026 (środa) w godzinach 18:00 - 18:30 zostanie przeprowadzona symulacja braku przetwarzania faktur po stronie API KSeF (środowisko TEST).
W trakcie symulacji:
- API będzie dostępne,
- możliwe będzie przesyłanie faktur oraz paczek faktur (sesja interaktywna i wsadowa),
- przyjęte dokumenty nie będą przetwarzane.
Efektem będzie:
- brak nadawania numerów KSeF,
- brak generowania UPO dla faktur,
- brak generowania UPO dla paczek.
Po zakończeniu symulacji przetwarzanie zostanie wznowione, a wszystkie wcześniej przyjęte faktury i paczki faktur zostaną obsłużone.
Próbujemy ustalić, co miało miejsce w piątek od ok 12:50 do 13:40, czego efektem było ponowne wysłanie faktur przez systemy i oznaczenie tych wysokiej jako duplikatów.
Osobiście nie wierzę, że to, co ma być symulowane. Wg mnie zamykanie sesji wsadowej zwracało błędny status http mimo, iż operacja przebiegła pomyślnie.
I z ostatniej chwili, są planowane też kolejne testy:
W następnym tygodniu zrobimy scenariusz zatrzymania obsługi exportów, co doprowadzi do błędu 21182 - Osiągnięto limit trwających eksportów.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 35
Czy i ew. skąd można teraz pobrać aktualny pdf pt. "Specyfikacja interfejsów Krajowego Systemu e-Faktur (KSEF)" ?
(kiedyś było pod adresem: https://ksef-test.mf.gov.pl/document/InterfaceSpecification/1.8/PL )
- Rejestracja: dni
- Ostatnio: dni
- Postów: 17
czy mieliście przypadek braku <FP>1</FP> w XML KSeF dla faktury wystawionej do paragonu fiskalnego? czy trzeba to korygować skoro to pole fakultatywne - czy lepiej skorygować żeby nie było traktowane jako osobna faktura i podwójne opodatkowanie ?
- Rejestracja: dni
- Ostatnio: dni
@akodo23
w statusie duplikatu mam info że ta faktura była już wysłana w poprzedniej sesji (interaktywnej) sprzed kilku minut (20260417-SO-25861A8000-54CD3E2ACB-EF), w której to sesji była wysłana poprzednia faktura
resource:
sessions/20260417-SB-265705C000-7E8F5FED15-19
response:
{"status":{"code":445,"description":"Błąd weryfikacji, brak poprawnych faktur"},"dateCreated":"2026-04- 7T11:10:02.3321401+00:00","dateUpdated":"2026-04- 17T11:10:05+00:00","validUntil":"2026-04- T23:10:02.3321401+00:00","invoiceCount":1,"successfulInvoiceCount":0,"failedInvoiceCount":1}
resource:
sessions/20260417-SB-265705C000-7E8F5FED15-19/invoices
response:
{"invoices":[{"ordinalNumber":1,"invoiceNumber":"FV/00001870","referenceNumber":"20260417-EE- 26578A6001-49D26C481C-7E","invoiceHash":"nt9MBxPxqS99QRPYlPW8MW2tS5u0Tr5OperqPJuY +Nc=","invoiceFileName":"zip_0.xml","invoicingDate":"2026-04- 17T11:10:02.3321401+00:00","status":{"code":440,"description":"Duplikat faktury","details": ["Duplikat faktury. Faktura o numerze KSeF: 8150002938-20260417-5BA7E700000F-CD została już prawidłowo przesłana do systemu w sesji: 20260417-SO-25861A8000-54CD3E2ACB- EF"],"extensions":{"originalSessionReferenceNumber":"20260417-SO-25861A8000-54CD3E2ACB- EF","originalKsefNumber":"8150002938-20260417-5BA7E700000F-CD"}}}]}
- Rejestracja: dni
- Ostatnio: dni
- Postów: 264
https://github.com/CIRFMF/ksef-docs/issues/794
KSeF 3.0 :) [a właściwie to próba dokończenia tego, co było opisane]
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: 700m n.p.m.
- Postów: 687
Dynamiczne/złośliwe limity w środowisku testowym?
Od wczoraj mam cały czas dziwny nierozwiązany problem z weryfikacją faktury (https://api-test.ksef.mf.gov.pl/docs/v2/index.html#tag/Status-wysylki-i-UPO/paths/~1sessions~1%7BreferenceNumber%7D~1invoices~1%7BinvoiceReferenceNumber%7D/get), cały czas mam błąd 430:
[status] => stdClass Object
(
[code] => 430
[description] => Błąd weryfikacji pliku faktury
[details] => Array
(
[0] => Rozmiar faktury nie zgadza się z zadeklarowaną wartością: '2032'.
)
)
Pomijając to, że nie ma tu żadnych szczegółów tego błędu - np. jaka wartość jest po stronie KSEF, to w dodatku od dzisiaj nagle pojawiły się niesamowicie restrykcyjne limity.
Wczoraj intensywnie testowałem robiąc około 100 sesji na godzinę (i zamykając je), dzisiaj nagle mam ogromne ograniczenia które uniemożliwiają mi testowanie:
Otwarcie sesji interaktywnej (https://api-test.ksef.mf.gov.pl/docs/v2/index.html#tag/Wysylka-interaktywna/paths/~1sessions~1online/post)
W API limit: 1200 na godzinę
Ja dostaję: 10 na godzinę
Pobranie statusu sesji (https://api-test.ksef.mf.gov.pl/docs/v2/index.html#tag/Status-wysylki-i-UPO/paths/~1sessions~1%7BreferenceNumber%7D/get)
W API limit: 100 na sekundę, 12000 na godzinę
Ja dostaję: 1 na sekundę (!!!) i 2 na godzinę (!!!!)
Czyli w przypadku pobierania sesji, 6000 razy większy limit niż zadeklarowany w dokumentacji.
Dlaczego tak jest? To co robiłem wczoraj i tak jest wielokrotnie poniżej limitów z dokumentacji.
Zmienili nagle globalnie te limity bez poprawiania dokumentacji, czy ktoś specjalnie uniemożliwia mi testowanie?
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: 700m n.p.m.
- Postów: 687
PROBLEM ROZWIĄZANY
Nadal mam problem z błędem 430 otrzymywany z endpoint https://api-test.ksef.mf.gov.pl/docs/v2/index.html#tag/Status-wysylki-i-UPO/paths/~1sessions~1%7BreferenceNumber%7D~1invoices~1%7BinvoiceReferenceNumber%7D/get
Mam taki XML testowy, w którym dodatkowo usunąłem wszystkie polskie znaki diakrytyczne i zastąpiłem znakiem x aby zmniejszyć prawdopodobieństwo jakiegoś błędu kodowania:
<?xml version="1.0" encoding="UTF-8"?><Faktura xmlns="http://crd.gov.pl/wzor/2025/06/25/13775/"><Naglowek><KodFormularza kodSystemowy="FA (3)" wersjaSchemy="1-0E">FA</KodFormularza><WariantFormularza>3</WariantFormularza><DataWytworzeniaFa>2026-04-22T13:26:49Z</DataWytworzeniaFa><SystemInfo>Testowy generator</SystemInfo></Naglowek><Podmiot1><DaneIdentyfikacyjne><NIP>5170359458</NIP><Nazwa>Testowy 69e8cc9925776</Nazwa></DaneIdentyfikacyjne><Adres><KodKraju>PL</KodKraju><AdresL1>Ulica testowa 69e8cc9925780, 43-502 Czechowice-Dziedzice</AdresL1></Adres></Podmiot1><Podmiot2><DaneIdentyfikacyjne><NIP>5250000000</NIP><Nazwa>Testowy 69e8cc9925787</Nazwa></DaneIdentyfikacyjne><Adres><KodKraju>PL</KodKraju><AdresL1>Ulica testowa 69e8cc9925785, 66-200 xwiebodzin</AdresL1></Adres><JST>2</JST><GV>2</GV></Podmiot2><Fa><KodWaluty>PLN</KodWaluty><P_1>2026-04-17</P_1><P_2>FV-1/4/2026</P_2><P_6>2026-04-17</P_6><P_15>25.98</P_15><Adnotacje><P_16>2</P_16><P_17>2</P_17><P_18>2</P_18><P_18A>2</P_18A><Zwolnienie><P_19N>1</P_19N></Zwolnienie><NoweSrodkiTransportu><P_22N>1</P_22N></NoweSrodkiTransportu><P_23>2</P_23><PMarzy><P_PMarzyN>1</P_PMarzyN></PMarzy></Adnotacje><RodzajFaktury>VAT</RodzajFaktury><FaWiersz><NrWierszaFa>1</NrWierszaFa><P_7>Opus O.CLICK /25/ 6mm biaxe zamykane</P_7><GTIN>5903868703012</GTIN><P_8A>szt</P_8A><P_8B>1</P_8B><P_9A>8.12</P_9A><P_9B>9.99</P_9B><P_11>8.12</P_11><P_11Vat>1.87</P_11Vat><P_12>23.00</P_12></FaWiersz><FaWiersz><NrWierszaFa>2</NrWierszaFa><P_7>Kurier DPD</P_7><P_8A>szt</P_8A><P_8B>1</P_8B><P_9A>13.00</P_9A><P_9B>15.99</P_9B><P_11>13.00</P_11><P_11Vat>2.99</P_11Vat><P_12>23.00</P_12></FaWiersz></Fa></Faktura>
Po zapisie do pliku, jego długość to 1651
Do KSeF też wysyłam taką długość, to mój payload:
Array
(
[invoiceHash] => DcmiI5DuIhq0AWYvBQX4hmtfrqc/Mqrszhqek5YZyoM=
[invoiceSize] => 1651
[encryptedInvoiceContent] => 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
[encryptedInvoiceSize] => 1680
[encryptedInvoiceHash] => lz2m1k6bVy31AuA+ksv45/986WWY/mEhsGCFYFXojEw=
)
Ten sam payload po konwersji przez JSON: \json_encode($payload, \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES);
[jsonBody] => {"invoiceHash":"EUYaa16WSC+J4jiCNtPpC5TBVcvob6TvWOLUoUUvSow=","invoiceSize":1651,"encryptedInvoiceContent":"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","encryptedInvoiceSize":1680,"encryptedInvoiceHash":"U5gvHLU+rw+8a3Dri+XWW7B+6KWREcDsIXPDAJynw+c="}
Czyli: zapisany surowy XML do pliku dla testu: długość 1651, do KSEF wysyłam też 1651.
Symetryczny klucz oraz IV jest taki sam dla sesji jak i zakodowania faktury.
Nic więcej się z tym XML przed wysyłką dalej nie dzieje, TUTAJ funkcja która to koduje:
public function encrypt() {
// 1. Wygeneruj XML
$xml = $this->xml->asXML();
// 2. ABSOLUTNE CZYSZCZENIE (KSeF 430 Fix)
// Zamieniamy polskie znaki na x
$polskie = ['ą', 'ć', 'ę', 'ł', 'ń', 'ó', 'ś', 'ź', 'ż', 'Ą', 'Ć', 'Ę', 'Ł', 'Ń', 'Ó', 'Ś', 'Ź', 'Ż'];
$xml = str_replace($polskie, 'x', $xml);
// Usuwamy BOM i WSZYSTKIE znaki białe między tagami
$xml = str_replace(["\xEF\xBB\xBF", "\r", "\n"], "", trim($xml));
$xml = preg_replace('/>\s+</', '><', $xml);
if ($this->debug) {
echo 'Wysyłany XML = ' . \PHP_EOL;
echo $xml;
echo \PHP_EOL;
}
// 3. MIERZENIE I HASZOWANIE
// Ważne: mierzymy surowy XML przed nałożeniem szyfrowania/paddingu
$this->invoiceSize = (int)strlen($xml);
$this->invoiceHash = base64_encode(hash('sha256', $xml, true));
// 4. PRZYGOTOWANIE KLUCZY
$aesKeyBin = $this->session->symmetricKey;
$ivBin = $this->session->iv;
if ($this->debug) {
echo "DEBUG ENC : " . bin2hex($aesKeyBin) . "\n";
echo "DEBUG ENC IV : " . bin2hex($ivBin) . "\n";
}
// 5. SZYFROWANIE AES (phpseclib3)
try {
$aes = new \phpseclib3\Crypt\AES('cbc');
$aes->setKey($aesKeyBin);
$aes->setIV($ivBin);
// USUNIĘTO: manualny padding i disablePadding()
// phpseclib3 domyślnie używa PKCS#7, co jest zgodne z KSeF
$ciphertext = $aes->encrypt($xml);
} catch (\Exception $e) {
throw new \Exception("Błąd AES: " . $e->getMessage());
}
// 6. PACZKA DLA KSeF
// Paczka musi zawierać IV (16 bajtów) na początku, a potem zaszyfrowaną treść
$fullPayloadBin = $ivBin . $ciphertext;
$this->encryptedInvoiceContent = base64_encode($fullPayloadBin);
$this->encryptedInvoiceSize = (int)strlen($fullPayloadBin);
$this->encryptedInvoiceHash = base64_encode(hash('sha256', $fullPayloadBin, true));
return true;
}
Używam do zakodowania sprawdzonej i stabilnej biblioteki phpseclib3 zamiast natywnych funkcji php lub linii poleceń, aby się bardziej uniezależnić od środowiska serwera.
Nie rozumiem dlaczego jest ten błąd, co ja robię źle, skoro długość XML jest dokładnie taka jak wysyłam.
Proszę o pomoc, bo zaraz oszaleję. Zdarzało mi się tu w ostatnich latach kilkanaście razy komuś pomoc w PHP, może znajdzie się ktoś kto się nad tym pochyli i przez chwilę zastanowi, co może być źle?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 31
Mam taki problem i wyrywam sobie włosy z głowy próbując go rozwiązać. Firma dostała 2 pisma z powiatu w którym zostały zawarte 2 różne ID wewnętrzne których musimy użyć w fakturze. Więc tworzę fakturkę która w podmiocie 3cim zamiast pola NIP używa pole IDWEW w formacie NIP-000IDWEW (Idwew jest 2 cyfrowe w obu przypadkach). No i na demo wysłałem te faktury i bajka, przeszło i cud miód. Na produkcji w obu tych i tylko tych przypadkach dostaję błąd że Identyfikator wewnętrzny podmiotu trzeciego: 'NIP-000IDWEW jest nieprawidłowy. Inne faktury z Idwew wysyłają się normalnie. Nie jestem w stanie zidentyfikować przyczyny problemu, XMLe między demo a produkcją są identyczne. Jedyne co mi przychodzi do głowy obecnie to że to powiat nam wysłał niepoprawne ID wewnętrzne dlatego na demo przeszło a na produkcji nie, ale z drugiej strony kierownik działu faktur mówi ze powinno być wszystko ok. Więc ja nie wiem co robić.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 35
17.03.2026 opisałem problem w PHP z generowaniem Csr z pieczęci - tutaj: https://4programmers.net/Forum/Nietuzinkowe_tematy/355933-krajowy_system_e_faktur?p=2015321#id2015321
ROZWIĄZANY
Informacje dla ciekawych/potrzebujących:
- wszystko działało ok z użyciem openssl ale problem był gdy nazwa firmy była dłuższa niż 64 znaki (nie udało mi się tego obejść również przez plik konfiguracyjny openssl)
- przeszedłem na phpseclib3 z użyciem X509 - tutaj działało ale nie dla pieczęci
- okazało się, że X509 "nie zna pola organizationIdentifier" i go nie dawał w Csr, nawet przez podanie jako OID 2.5.4.97
- nie udało się go do tego zmusić przez ASN1::loadOIDS
- dopiero udało się przez X509->setDN( ['rdnSequence'] => [ ..... ] ) z podaniem OID'a.
Dziękuję wszystkim, którzy się odezwali w tym temacie :)
- Rejestracja: dni
- Ostatnio: dni
- Postów: 264
Nowa wizualizacja
Umie ktoś powiedzieć, o co może chodzić? Kompiluje się, ale uruchamiając jest:
node:internal/process/promises:288
triggerUncaughtException(err, true /* fromPromise */);
^
[UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "Unrecognized document structure: {"alignment":"right"}".] {
code: 'ERR_UNHANDLED_REJECTION'
}
nie mam pojęcia czego i gdzie szukać :| po zmianach nic szczególnego nie widzę...
- Rejestracja: dni
- Ostatnio: dni
- Postów: 6
Hej,
mieliście przypadki korygowania danych podmiot3?
Z jednej stony schema nie przewiduje, z drugiej korekta do zera i nowa faktura jest niezasadna i problematyczna księgowo.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2
Hej,
Czy mieliście kiedyś potrzebę skorygowania samej sekcji Odliczenia/Obciążenia? Mam klienta, który niepotrzebnie wpisał do Obciążeń pewną opłatę na 100PLN. Teraz chce wystawić korektę usuwającą to obciążenie i mam problem z tym jakie wartości powinienem wstawić w DoZaplaty/DoRozliczenia ponieważ z jednej strony logiczne byłoby wstawienie 100PLN w DoRozliczenia, z drugiej strony nie jest to zgodne z opisem "Podaje się kwotę nadpłaconą do rozliczenia/zwrotu stanowiącą wynik powiększenia kwoty należności ogółem, wynikającej z faktury (P_15) o sumę obciążeń i pomniejszenia jej o sumę odliczeń" ponieważ zarówno P_15 jak i SumaObciazen i SumaOdliczen mam teraz na 0
Oczywiście odpowiedź z pomocy technicznej ograniczyła się do zacytowania powyższego opisu...
- Rejestracja: dni
- Ostatnio: dni
- Postów: 106
Hm też zgłaszają Wam ze na nowych wydrukach nie ma stawki vat w pozycjach ?
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: 700m n.p.m.
- Postów: 687
Jeżeli mamy kilka korekt do tej samej faktury:
- pierwsza korekta obniża wartość o 20 zł brutto
- druga korekta obniża wartość o 30 zł brutto
Czy w drugiej korekcie w polu P_15 wpisujemy -30, czy robimy podsumowanie z wszystkich poprzednich korekt i powinno być -50?
To dotyczy też oczywiście pól związanych z kwotami netto, oraz VATem.
Mam niejednoznaczne odpowiedzi od AI, i ciężko też dowiedzieć się tego z dokumentacji.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 7
Czy ma ktoś aktualny plik styl.xsl (http://crd.gov.pl/wzor/2025/06/25/13775/) .Chodzi mi o widok faktur jak aktualnie w ksef (xml + xsl->hml)
- Rejestracja: dni
- Ostatnio: dni
- Postów: 7
Witaj Witold:) .Tak idzie mi o "jak w Aplikacji Podatnika" i o ten fragment -->>
<xsl:if test="tns:Fa/tns:Rozliczenie/tns:Odliczenia">
<xsl:variable name="WrapperOdl">
xsl:choose
<xsl:when test="tns:Fa/tns:Rozliczenie/tns:Obciazenia">
<xsl:value-of select="'section-data__wrapper-right'"/>
</xsl:when>
xsl:otherwise<xsl:value-of select="'section-data__wrapper-left'"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="KeepTogetherOdl">
xsl:choose
<xsl:when test="tns:Fa/tns:Rozliczenie/tns:Obciazenia">
<xsl:value-of select="'keep-together to-right to-right--with-margin'"/>
</xsl:when>
xsl:otherwise<xsl:value-of select="'keep-together to-left to-left--with-margin'"/></xsl:otherwise>
</xsl:choose>
</xsl:variable> też to znalazłem i nie miałem pewności czy warto się tym zająć. Dzięki jeszcze raz za rekomendację.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 7
Jeszcze jeden temat, w schemat,xsd mamy ->> <xsd:element name="TypKorekty" type="tns:TTypKorekty" minOccurs="0">
xsd:annotation
xsd:documentationTyp skutku korekty w ewidencji dla podatku od towarów i usług</xsd:documentation>
</xsd:annotation>
</xsd:element>
TypKorekty pole w xml nieobowiązkowe. Czy ma ktoś doświadczenie czy formalnie walidowany(status ok) przez plik xsd plik xml(fa3) może zostać odrzucony w ksef. Tak się dzieje w przypadku np nip formalnie(1-9\d{7}-\d{5}) jest ok(zgodnie z plikiem xsd) ale jest błędny(https://sprawdznip.podatki.gov.pl/) i ksef to odrzuca. Czy mają coś dodatkowego na serwerze ksef, co może odrzucić xml faktuy korygującej gdy nie podamy typKorekty(1,2,3) ??? Na berdyczów nie piszę bo szkoda czasu.