Krajowy system e-Faktur

GS
  • Rejestracja: dni
  • Ostatnio: dni
0

Czy certyfikat pobrany z KSef przez aplikację MCU może byc użyty do testów na środowisku Demo albo Test. Mam z tym duży problem, np...

Kopiuj
'{"exception":
  {"exceptionDetailList":[
    {"exceptionCode":21115,"exceptionDescription":"Nieprawidłowy certyfikat."}],
    "serviceCode":"00-05fbd947f32e294337cafd36f49ed7e4-b3fd5c0d35184db8-00","timestamp":"2025-11-14T18:44:20.9270427Z"}}'
PK_64
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 30
0

Witam wszytskich !!!

Chcę przeprowadzić kontrolę ( walidacje ) pliku XML.
Zatem w katalogu : http://crd.gov.pl/wzor/2025/06/25/13775/ powinny być odpowiednie pliki XSD .. Tak?
A ja, nie mogę odczytać tego katalogu .. Ba ale na jednym z komputerów odczytałem ten katalog. A WY możecie odczytać ten katalog ?

NO ale w XML jest drugi katalog walidacyjny : http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2022/01/05/eD/DefinicjeTypy/ też nieczytelny to jak ma sprawdzić XML ?

Czekam na dobre objaśnienia .

Paweł

Dzyszla
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 185
1

Informacyjnie, interpelacja o wstrzymanie zaczyna interesować coraz więcej mediów - bardzo szeroki artykuł:
https://ksiegowosc.infor.pl/ksef/7455108,coraz-wiecej-apeli-o-odroczenie-ksef-nowa-interpelacja-jest-juz-w-sejmie.html

Ja zachęcam do wyrażenia swojego zdania do p. posła bądź to przez maila biura lub sejmu (bartlomiej.pejo@sejm.pl), bądź otwarcie przez FB, jak ktoś ma - z pewnością każdy głos będzie argumentem podczas wygłaszania uwag przez niego. Jak ktoś chce, może się inspirować tym: Krajowy system e-Faktur

JK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 38
RA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 62
0

Chciałbym się upewnić: wyciągając "nowe" faktury z ksefu najlepiej użyć /api/v2/invoices/query/metadata do pobrania listy a filtrach użyć ostatniego znanego PermanentStorage które otrzymaliśmy w fakturach z poprzedniego wywołania?
Czy macie jakieś lepsze sposoby? Ewentualnie czy nadzialiście się na jakiś problem z powyższym podejściem?

RA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 62
0

Kolejne pytanie z tyłka: Wysyłamy faktury, wszystko idzie ok, mamy upo. Użytkownik sobie ściągnął plik upo.xml
Gdzie/jak można zweryfikować autentyczność tego upo?

MS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1
0

Cześć,

Poratuje ktoś pomocą - integruję własny system FK z KSeF 2.0 i testuję pełny proces autoryzacji tokenem KSeF w środowisku DEMO.
Mam wdrożony kompletny przepływ:

/api/v2/auth/challenge
szyfrowanie tokenu RSA-OAEP SHA256
/api/v2/auth/ksef-token
polling /api/v2/auth/status/{referenceNumber}
/api/v2/auth/token
wysyłka FA(3) – InitUpload → Upload → Finish

Krok 1 i 2 działają prawidłowo.

Problem pojawia się od kroku 4 – /auth/status, który w DEMO nie zwraca żadnych danych (HTTP 204 No Content).
W efekcie /auth/token również zwraca pustą odpowiedź, więc nie jesteśmy w stanie pobrać accessToken – co blokuje dalszą wysyłkę faktur FA(3).

Mój kod...…..….....
using System;
using System.IO;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
// ================================================
// KONFIGURACJA
// ================================================
static string NIP = "moj_NIP";
static string TOKEN = "moj_token";
static string XML_FILE = @"C:\KSeF\24150_.xml";
static string PEM_FILE = @"C:\KSeF\publicKey.pem";
static string LOG_DIR = @"C:\KSeF\Logs";

static async Task Main()
{
    Directory.CreateDirectory(LOG_DIR);
    using var http = new HttpClient();

    Console.WriteLine("=== AUTORYZACJA KSeF 2.0 DEMO START ===");

    // ================================================
    // 1) CHALLENGE
    // ================================================
    var challengeReq = new { contextIdentifier = new { type = "onip", value = NIP } };

    var challengeResp = await http.PostAsync(
        "https://ksef-demo.mf.gov.pl/api/v2/auth/challenge",
        new StringContent(JsonSerializer.Serialize(challengeReq), Encoding.UTF8, "application/json")
    );

    var challengeJson = await challengeResp.Content.ReadAsStringAsync();
    File.WriteAllText(Path.Combine(LOG_DIR, "1_challenge.json"), challengeJson);
    Console.WriteLine("CHALLENGE:\n" + challengeJson);

    using var doc1 = JsonDocument.Parse(challengeJson);
    string challenge = doc1.RootElement.GetProperty("challenge").GetString();
    string timestamp = doc1.RootElement.GetProperty("timestamp").GetString();
    long timestampMs = DateTimeOffset.Parse(timestamp).ToUnixTimeMilliseconds();

    // ================================================
    // 2) SZYFROWANIE TOKENA
    // ================================================
    string toEncrypt = $"{TOKEN}|{timestampMs}";
    byte[] tokenBytes = Encoding.UTF8.GetBytes(toEncrypt);

    string pem = File.ReadAllText(PEM_FILE)
        .Replace("-----BEGIN PUBLIC KEY-----", "")
        .Replace("-----END PUBLIC KEY-----", "")
        .Replace("\n", "")
        .Replace("\r", "");
    byte[] keyBytes = Convert.FromBase64String(pem);

    using RSA rsa = RSA.Create();
    rsa.ImportSubjectPublicKeyInfo(keyBytes, out _);
    string encryptedToken = Convert.ToBase64String(
        rsa.Encrypt(tokenBytes, RSAEncryptionPadding.OaepSHA256)
    );

    // ================================================
    // 3) /auth/ksef-token
    // ================================================
    var authReq = new
    {
        challenge = challenge,
        contextIdentifier = new { type = "nip", value = NIP },
        encryptedToken = encryptedToken
    };

    var authResp = await http.PostAsync(
        "https://ksef-demo.mf.gov.pl/api/v2/auth/ksef-token",
        new StringContent(JsonSerializer.Serialize(authReq), Encoding.UTF8, "application/json")
    );

    var authJson = await authResp.Content.ReadAsStringAsync();
    File.WriteAllText(Path.Combine(LOG_DIR, "2_auth_ksef-token.json"), authJson);
    Console.WriteLine("\nAUTH/KSEF-TOKEN:\n" + authJson);

    using var doc2 = JsonDocument.Parse(authJson);
    var authTokenObj = doc2.RootElement.GetProperty("authenticationToken");
    string authToken = authTokenObj.GetProperty("token").GetString();
    string validUntil = authTokenObj.GetProperty("validUntil").GetString();
    string refNum = doc2.RootElement.GetProperty("referenceNumber").GetString();

    Console.WriteLine($"AuthToken: {authToken}\nWażny do: {validUntil}\nRefNum: {refNum}");

    // ================================================
    // 4) POLLING /auth/status/{refNum}
    // ================================================
    string statusUrl = $"https://ksef-demo.mf.gov.pl/api/v2/auth/status/{refNum}";

    string statusJson = "";
    for (int i = 0; i < 10; i++)
    {
        Console.WriteLine($"Czekam na status ({i + 1}/10)...");
        await Task.Delay(2000);

        var statusResp = await http.GetAsync(statusUrl);
        statusJson = await statusResp.Content.ReadAsStringAsync();

        if (!string.IsNullOrWhiteSpace(statusJson) && statusJson.Contains("ready"))
            break;
    }

    File.WriteAllText(Path.Combine(LOG_DIR, "3_auth_status.json"), statusJson);
    Console.WriteLine("\nSTATUS:\n" + statusJson);

    // ================================================
    // 5) POBRANIE accessToken
    // ================================================
    var tokenReq = new { authenticationToken = authToken };
    var tokenResp = await http.PostAsync(
        "https://ksef-demo.mf.gov.pl/api/v2/auth/token",
        new StringContent(JsonSerializer.Serialize(tokenReq), Encoding.UTF8, "application/json")
    );

    var tokenJson = await tokenResp.Content.ReadAsStringAsync();
    File.WriteAllText(Path.Combine(LOG_DIR, "4_accessToken.json"), tokenJson);
    Console.WriteLine("\nTOKEN:\n" + tokenJson);

    using var doc3 = JsonDocument.Parse(tokenJson);
    string accessToken = doc3.RootElement.GetProperty("token").GetString();

    Console.WriteLine("\nAccessToken: " + accessToken);

    // ================================================
    // 6) InitUpload – FA(3)
    // ================================================
    string xmlContent = File.ReadAllText(XML_FILE);
    string xmlHash = Convert.ToBase64String(SHA256.HashData(Encoding.UTF8.GetBytes(xmlContent)));

    var initReq = new
    {
        contextIdentifier = new { type = "nip", value = NIP },
        invoiceType = "FA3",
        invoiceHash = xmlHash,
        inputHashType = "SHA-256"
    };

    var initResp = await http.PostAsync(
        "https://ksef-demo.mf.gov.pl/api/v2/online/Session/InitUpload",
        new StringContent(JsonSerializer.Serialize(initReq), Encoding.UTF8, "application/json")
        {
            Headers = { { "Authorization", $"Bearer {accessToken}" } }
        }
    );

    string initJson = await initResp.Content.ReadAsStringAsync();
    File.WriteAllText(Path.Combine(LOG_DIR, "5_initUpload.json"), initJson);

    Console.WriteLine("\n=== InitUpload Zakończony ===");
    Console.WriteLine(initJson);
}

}

Czy w środowisku DEMO (uruchomione 15 listopada 2025) endpointy:
GET /api/v2/auth/status/{referenceNumber}
POST /api/v2/auth/token

są już aktywne, czy ich obsługa zostanie dopiero uruchomiona w kolejnych dniach?
Dokumentacja opisuje pełny proces, ale faktycznie:
/auth/challenge działa
/auth/ksef-token działa
/auth/status zwraca 204 No Content
/auth/token również zwraca pustą odpowiedź

Czy to znany problem?
Czy MF potwierdziło gdzieś ETA aktywacji tego fragmentu autoryzacji?

Każda wskazówka mile widziana.

PK_64
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 30
0

Witam

Czy to DEMO to działa ?
Mam certyfikat, mam autoryzację ale wiele poleceń odpowiada kodem 403 ..
Przykład : https://ksef-demo.mf.gov.pl/api/v2/auth/sessions

Kopiuj
{
    "items": [
        {
            "referenceNumber": "20251115-AU-505FD4D000-26CDB49735-46",
            "isCurrent": true,
            "startDate": "2025-11-15T23:24:38.5719906+00:00",
            "authenticationMethod": "InternalCertificate",
            "status": {
                "code": 200,
                "description": "Uwierzytelnianie zakończone sukcesem"
            },

no ale https://ksef-demo.mf.gov.pl/api/v2/auth/20251115-AU-505FD4D000-26CDB49735-46
juz odpowiedź 403
i dalej pytanie https://ksef-demo.mf.gov.pl/api/v2/sessions odpowiedź 403
Założenie nowej sesji 403

to działa komuś ?

Paweł

RA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 62
0

Kontekst pytania: Niektóre firmy mają swoje systemy erp, które pozwalają na pobieranie faktur. Klient ma swoje konto dostaje maila "W systemie pojawiła się nowa faktura", klika w link i ma listę swoich faktur zakupowych, klika konkretną fakturę, ściąga i spoko. Tylko tak: klikając w przycisk "Pobierz" wyskakuje info: "Pobranie faktury jest równoznaczne z jej otrzymaniem".

Nie mam pojęcia co z prawnego punktu widzenia znaczy otrzymanie faktury (znaczy domyślam się, ale nie drążę tematu), natomiast: Z tego co rozumiem w ksefie to czy pobrałem fakturę czy nie... jest nieistotne z tego punktu widzenia. Otrzymanie faktury to moment kiedy staje się ona dostępna dla odbiorcy w systemie, prawda?

Pytam w kontekście pobierania faktur. W mojej głupiej głowie zrodziło się pytanie czy przyrostowe eksportowanie faktur (/api/v2/invoices/exports) ma jakieś dodatkowe konsekwencje w porównaniu z np. pobraniem listy metadanych (/api/v2/invoices/query/metadata), wyświetleniu jej użytkownikowi i pozwoleniu na wybranie tych, które chce pobrać.

PS. Jeśli komuś po przeczytaniu tego mojego kolejnego posta rodzi się w głowie pytanie o moją stabilność psychiczną to wyjaśniam: popsuł mnie projekt jakieś 15 lat temu. Był prowadzony przez kilka lat jako PoC i jak nagle trzeba było go zrobić production ready. Dostałem dwie jiry: "Error handling" i "Loss of communication handling". Od tamtego czasu mam takie podejście do kodowania, więc wybaczcie.

PK_64
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 30
0

Cześć .

Autoryzowałem się za pomocą : "authenticationMethod": "InternalCertificate",
Przy generowaniu certyfikatu nie pytano się o prawa .

Ale jakie mam prawa ? mogę wystawiać faktury ?
Mowa tiu o systememie DEMO ..

Paweł

Dzyszla
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 185
1

Właśnie w głównym wydaniu Wydarzeń w Polsacie było o KSeF.
Jaki wniosek? No przecież błędy były stwierdzone, więc teraz ich na pewno nie ma! (Więc interpelacja jest niezasadna)

PS. Oczywiście przekaz spłycony - część to od 1.04 się będzie martwić, księgowość się tym zajmie, darmowe szkolenia są uruchomione. Wszystko gra, bo przecież 2 razy przełożone już było, więc teraz git.

PS2. Ktoś mi podesłał - kanał ma całkiem spory posłuch (4:40, nie wiem czemu nie łapie znacznika link):

SK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
0

Może ktoś ma jakiś pomysł, co robię nie tak?
Zalogowałem się do środowiska demo (https://web2tr-ksef.mf.gov.pl/) własnym podpisem kwalifikowanym. Wygenerowałem certyfikat dostępowy. Pobrałem klucz prywatny i ten certyfikat.
Z zaszyfrowanego klucza wyodrębniłem faktyczny klucz (żeby móc potem użyć w demo).
Pobrałem najnowsza wersję klienta RC5.7.1.
Uruchomiłem DemoWebApp na adresie https://ksef-demo.mf.gov.pl/api/v2.
Próbuję się zalogować za pomocą certyfikatu dostępowego: podaję dane certyfikatu, nip i klucz prywatny (poprawiłem kod AuthWithKsefCert, bo tam ciągle RSA, choć Aplikacja Podatnika pracuje na ECDsa).
I w zamian po wywołaniu GetAuthChallengeAsync dostaję odpowiedź z Ksef: KSeF.Client.Core.Exceptions.KsefApiException: Not found.
O co chodzi z tym Not found? Co tu źle robię?

H1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1
0
SylwesterK napisał(a):

Może ktoś ma jakiś pomysł, co robię nie tak?
Zalogowałem się do środowiska demo (https://web2tr-ksef.mf.gov.pl/) własnym podpisem kwalifikowanym. Wygenerowałem certyfikat dostępowy. Pobrałem klucz prywatny i ten certyfikat.
Z zaszyfrowanego klucza wyodrębniłem faktyczny klucz (żeby móc potem użyć w demo).
Pobrałem najnowsza wersję klienta RC5.7.1.
Uruchomiłem DemoWebApp na adresie https://ksef-demo.mf.gov.pl/api/v2.
Próbuję się zalogować za pomocą certyfikatu dostępowego: podaję dane certyfikatu, nip i klucz prywatny (poprawiłem kod AuthWithKsefCert, bo tam ciągle RSA, choć Aplikacja Podatnika pracuje na ECDsa).
I w zamian po wywołaniu GetAuthChallengeAsync dostaję odpowiedź z Ksef: KSeF.Client.Core.Exceptions.KsefApiException: Not found.
O co chodzi z tym Not found? Co tu źle robię?

mam tą samą sytuację , lecz dostaję status 460 "Uwierzytelnianie zakończone niepowodzeniem z powodu błędu certyfikatu" pomimo prawidłowego certyfikatu oto fragment kodu ; X509Certificate2 fullCert = LoadFromPem(crtPath, keyPath, keyPassword);
AuthenticationChallengeResponse challengeResponse = await _client.GetAuthChallengeAsync();
AuthenticationTokenRequest authTokenRequest = AuthTokenRequestBuilder.Create().WithChallenge(challengeResponse.Challenge).WithContext(AuthenticationTokenContextIdentifierType.Nip, nip)
.WithIdentifierType(AuthenticationTokenSubjectIdentifierTypeEnum.CertificateSubject).Build();
string unsignedXml = AuthenticationTokenRequestSerializer.SerializeToXmlString(authTokenRequest);
string signedXml = _signatureService.Sign(unsignedXml, fullCert);
SignatureResponse submission = await _client.SubmitXadesAuthRequestAsync(signedXml, verifyCertificateChain: false);
AuthStatus status = await _client.GetAuthStatusAsync(submission.ReferenceNumber, submission.AuthenticationToken.Token);

tmg
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 11
1

Może mi ktoś wyjaśnić czemu na instancji demo jest wymóg anonimizacji danych? Przecież to jest instancja przedprodukcyjna na której ma wszystko działać tak jak na produkcji ale bez skutków prawnych. Ale jak ma tak działać skoro dane które wprowadzam są nieprodukcyjne? To poważnie utrudnia testowanie bo nigdy nie wiesz czy będzie działać na produkcyjnych danych (szczególnie na wszekich aderesach, indentyfikatorach podatkowych itp). Do tego instancja demo jest zabezpieczona tak jak produkcja i dane są tam rozumiem bezpieczne. Nie lepiej zezwolić na wszystko ale automatycznie czyścić te dane po paru dniach?

AdrianWladyka
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Szybkie pytanko .. jak sprawdzacie czy KSEF (ich serwery) jest offline? I trzeba przejść do opcji u siebie na offline.
Oraz to samo gdy u nas certyfikaty sa poprawne?
Chciałbym robic to przy uruchomienia a nie zakazdym razem

M2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
0

Wracam znowu z pytaniem bo już mnie szlag jasny trafia. Próbuję wysłać fakturę do KSEF, po wysyłce dostaję referenceNumber ale w aplikacji KSEF za każdym razem mam "Błąd odszyfrowania pliku". Zakładam, że sama struktura XML-a jest poprawna ponieważ kiedy zapisałem ją do pliku i wgrałem ręcznie do aplikacji KSEF to faktura zapisała się poprawnie. W kodowaniu faktury wzoruje się na użytkowniku @N1ebieski i niby mam to samo ale coś musi nie grać. encryptedKey to u mnie encryptedSymmetricKey wysłany do API podczas tworzenia sesji (zakodowany w base64), analogiczna sytuacja z iv.

Kopiuj
$ksefXMLGenerator = new KsefXMLGenerator();

        $invoiceContent = $ksefXMLGenerator->generateFullInvoice($invoice);

        $invoiceHash = base64_encode(hash('sha256', $invoiceContent, true));
        $invoiceSize = strlen($invoiceContent);

        $encryptedInvoice = openssl_encrypt(
            $invoiceContent,
            'AES-256-CBC',
            $interactiveSessionData['encryptedKey'],
            OPENSSL_RAW_DATA,
            $interactiveSessionData['iv']
        );

        $encryptedInvoiceHash = base64_encode(hash('sha256', $encryptedInvoice, true));
        $encryptedInvoiceSize = strlen($encryptedInvoice);
        $encryptedInvoiceContent = base64_encode($encryptedInvoice);

        $data = [
            'invoiceHash' => $invoiceHash,
            'invoiceSize' => $invoiceSize,
            'encryptedInvoiceHash' => $encryptedInvoiceHash,
            'encryptedInvoiceSize' => $encryptedInvoiceSize,
            'encryptedInvoiceContent' => $encryptedInvoiceContent,
        ];

        $ch = curl_init("https://ksef-test.mf.gov.pl/api/v2/sessions/online/{$interactiveSessionData['referenceNumber']}/invoices");
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
GigaKatowice
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 26
0

Hej.
Mam parę pytań dotyczących wysyłki wsadowej.

  1. Jak pobieracie Nr KSeF dla faktury?
  2. Jak, w przypadku faktur bez nr KSeF (błąd przetwarzania) sprawdzicie, której faktury w waszym systemie dotyczy ten błąd?

W przypadku sesji interaktywnej jest prosto - zawsze jest ReferenceNumber dla każdej wysyłanej faktury.
W przypadku sesji wsadowej nie ma takich wartości.
Jedyne co mi przychodzi do głowy to HashSHA z XML faktury.
Dobrze myślę?

Dzięki!

Dzyszla
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 185
0

W nawiązaniu do Krajowy system e-Faktur (nie mogę już edytować) - wreszcie udało się tworzenie QR2 dla certyfikatu z ECDSA:

Kopiuj
SelectedCert.Cert.SaveECParameters := True;
SelectedCert.Cert.SaveKeyToStream(Key);

ecKey := TElECKeyMaterial.Create();
try
    ecKey.Curve := SB_EC_NIST_P256;
    Key.Position := 0;
    ecKey.Load(Key);

    SetLength(OutBytes, 64);
    RSize := 32;
    SSize := 32;
    SBECDSA.SignEx(
        ToSignBytes, Length(ToSignBytes),
        ecKey.D, Length(ecKey.D),
        ecKey.A, Length(ecKey.A),
        ecKey.B, Length(ecKey.B),
        ecKey.X, Length(ecKey.X),
        ecKey.Y, Length(ecKey.Y),
        ecKey.N, Length(ecKey.N),
        ecKey.P, Length(ecKey.P),
        ecKey.FieldType, ecKey.Field,
        0,
        @outBytes[0], RSize,
        @outBytes[RSize], SSize
        );

    OutStream.WriteString( StringReplaceEx( TNetEncoding.Base64.EncodeBytesToString( outBytes ), [#13, #10], ['', ''], [rfReplaceAll]) );
finally
    ecKey.Free;
end;

Kluczowe rzeczy - właczyć parametr zapisu parametrów EC oraz ustawić krzywą przed jej wczytaniem. (ChatGPT jest totalnie nieprzydatny)

MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0

Temat był już poruszany kilka razy - automatyzacja ściągania faktur.
Zrobiłem to następująco:

  • po autoryzacji xadesem generuję token Ksef z uprawnieniem InvoiceRead; zapominam klucz publiczny i certyfikat, a zostawiam tylko zaszyfrowany wewnętrznie token ksef
  • po wygaśnięciu refresh tokena odtwarzam go przy pomocy tokena Ksef bez ingerencji użytkownika

Ponieważ tokeny ksef nie wygasają zakładam, że będzie to działało przez lata. Jak sądzicie?

A7
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1
0

Problem z podpisem XAdES EC (KSeF 2.0) – odrzucany („Podpis zweryfikowany negatywnie”)
Próbuję wygenerować poprawny podpis XAdES dla AuthTokenRequest w KSeF 2.0, używając
klucza EC P-256 (plik .key + .crt).
Podpis generuje się poprawnie, ale serwer KSeF zwraca:
{ "exception": { "exceptionDetailList": [ { "exceptionCode": 9105, "exceptionDescription":
"Nieprawidłowy podpis.", "details": ["Podpis zweryfikowany negatywnie."] } ] } }

  1. Przykładowy challenge (mock):
    20251017-CR-1234567890-ABCDSF1234-EC
  2. AuthTokenRequest.xml (mock):
    1111111111
    20250101-CR-1234567890-ABC
RA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 62
0

Odnośnie tych nieszczęsnych potwierdzeń transakcji. Pewnie już wszyscy widzieli ale podsyłam:
https://ksef.podatki.gov.pl/informacje-ogolne-ksef-20/potwierdzenie-transakcji/
[Sorry, że tak kilka razy edytowałem posta]
Już zgłupiałem... Jak to czytać? Zakładam, że nr ksef nie jest przypisany ale w tvp nie ogłosili awarii ksef. Jeśli ktoś ma możliwość zalogowania się do ksef i kiedyś ta faktura tam trafi to mu daję potwierdzenie, pozostałe przypadki faktury offline?

VE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Witam, korzystając z narzędzia XSD w .NET wygenerowałem sobie klasę dla VisualBasic dla schemy FA3. Przy próbie serializacji obiektu otrzymuje takie błędy:

Nie można wygenerować tymczasowej klasy (wynik=1).
error CS0030: Nie można przekonwertować typu „string[]” na „string”.
error CS0029: Nie można niejawnie przekonwertować typu „string” na „string[]”.

Czy ktoś spotkał się z podobnym problemem?
Ze schemą FA2 nie miałem takiego problemu i serializacja działała...

JE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1
0

cześć, pracuję właśnie nad pobieraniem faktur z Ksef 2.0 w wersji DEMO i przy próbie pobrania faktury mam cały czas błąd 403, czy ktoś się orientuje czemu tak jest? Poniżej kawałek kodu, który wywołuję i dostaję błąd. Ktoś coś?

            string url = $"/api/v2/invoices/ksef/{Uri.EscapeDataString(ksefNumber.Trim())}";
            HttpResponseMessage resp = await http.GetAsync(url);
GS
  • Rejestracja: dni
  • Ostatnio: dni
0

Zabrałem się za generowanie kodów QR Offline.
W tym celu, korzystając z biblioteki Chilkat (DLL) dla Delphi, stworzyłem funkcję do wygenerowania podpisu RSA zgodnego wymaganiami KSef,
ale poległem zanim doszedłem do właściwego podpisu.
Mam problem z powiązaniem klucza prywatnego (HCkPrivateKey) z podpisem RSA (HCkRsa).
Klucz się wczytuje prawidłowo ale samo powiązanie klucza z podpisem kończy się błędem (wiersz 20 w załączonym kodzie).
Wbudowane w bibliotekę Chilkat funkcje raportowania błędów nie zwracają żadnej informacji o przyczynie błędu.
Ktoś coś podpowie ? :)

Kopiuj
function SignRsaPss(aText, aPrivateKeyPem, aPassword: string): string;
var
  crypt: HCkCrypt2;
  rsa: HCkRsa;
  pKey: HCkPrivateKey;
  ok: boolean;
  encodedHash: PWideChar;
  signature: PWideChar;
begin
  result := '';

  crypt := CkCrypt2_Create;
  rsa := CkRsa_Create;
  pKey := CkPrivateKey_create;
  try
    ok := CkPrivateKey_LoadEncryptedPem(pKey, PWideChar(aPrivateKeyPem), PWideChar(aPassword));
    if not ok then
      raise Exception.Create(CkPrivateKey__lastErrorText(pKey));

    ok := CkRsa_UsePrivateKey(rsa, pKey); // <==== tutaj zwraca False
    if not ok then
      raise Exception.Create(CkRSA__lastErrorText(rsa));

    CkCrypt2_putHashAlgorithm(crypt, 'sha256');
    CkCrypt2_putEncodingMode(crypt, 'base64');
    encodedHash := CkCrypt2__hashStringENC(crypt, PWideChar(aText));
    if encodedHash = nil then
      raise Exception.Create(CkCrypt2__lastErrorText(crypt));

    CkRsa_putPkcsPadding(rsa, false);
    CkRsa_putPssSaltLen(rsa, -1);
    signature := CkRsa__signHashENC(rsa, encodedHash, 'sha256');
    if signature = nil then
      raise Exception.Create(CkRSA__lastErrorText(rsa));

    result := signature;
  finally
    CkCrypt2_Dispose(crypt);
    CkRsa_Dispose(rsa);
    CkPrivateKey_dispose(pKey);
  end;
end;
MS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0

Cześć,

Od ponad tygodnia walczę z integracją interaktywną FA(3) w środowisku ksef-test i cały czas zatrzymuję się na etapie pollingu – zawsze dostaję 401 Unauthorized. Przerobiłem dokumentację i przykłady z forum, ale nie potrafię znaleźć błędu. Może ktoś bardziej doświadczony rzuci okiem?

KROK 1 — /auth/challenge

Wysyłam:
POST /api/v2/auth/challenge
{
"contextIdentifier": {
"type": "Nip",
"value": "5840251149"
}
}

Odpowiedź (200 OK):
{
"challenge": "20251117-CR-3C65F72000-58941639B2-7D",
"timestamp": "2025-11-17T17:35:32.2110101+00:00"
}

KROK 2 — szyfrowanie tokenu MF
Tworzę ciąg:

    TOKEN_Z_DOSTĘPU | nip-5840251149 | hash | timestampMS
    
    Szyfruję go RSA-OAEP-SHA256 kluczem publicznym MF.
    
    Przykładowy zaszyfrowany token:
    
    MfPKMMj2c06r9IjkU5Clky89CpnkaKSyZPBAlwvEdLm3LLE7s2boPHWUaGf9JFk...

KROK 3 — /auth/ksef-token
Wysyłam:

POST /api/v2/auth/ksef-token
{
"challenge": "20251117-CR-3C65F72000-58941639B2-7D",
"contextIdentifier": {
"type": "Nip",
"value": "5840251149"
},
"encryptedToken": "MfPKMMj2c06r9IjkU5Clky89CpnkaKSyZPBA..."
}

Odpowiedź (202 Accepted):

{
"referenceNumber": "20251117-AU-3C65FF4000-AFE4ABF43C-C9",
"authenticationToken": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"validUntil": "2025-11-17T18:20:32.3569022+00:00"
}
}

JWT wygląda poprawnie – nagłówek, payload, signature.

KROK 4 — polling /auth/{referenceNumber}
Wysyłam:

GET /api/v2/auth/20251117-AU-3C65FF4000-AFE4ABF43C-C9

Nagłówek:
authenticationToken: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Odpowiedź za każdym razem:

401 Unauthorized
(puste body)

Niezależnie od tego, czy nagłówek ustawiam jako:
authenticationToken
Authentication-Token
authentication-token

– rezultat jest zawsze taki sam: 401.

FRAGMENT KODU (uproszczony)

string referenceNumber = "...";
string authenticationToken = "...";

string url = "https://ksef-test.mf.gov.pl/api/v2/auth/+ referenceNumber;
var msg = new HttpRequestMessage(HttpMethod.Get, url);
msg.Headers.Add("authenticationToken", authenticationToken);

var resp = await http.SendAsync(msg);
string json = await resp.Content.ReadAsStringAsync();

Console.WriteLine(resp.StatusCode);
Console.WriteLine(json);

Wynik:
401 Unauthorized
(empty)

Co robię nie tak?
Każda wskazówka mile widziana – tego typu zagadnienia nie są moją mocną stroną, a utknąłem całkowicie. Z góry dziękuje !!!

RA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 62
0

Znów mnie wieczorem zbiera na rozmyślania.Tym razem odnośnie kodów QRII. Jako osoba nieposługująca się NIPem idę do kauflandu i żądam faktury. Raz drugi trzeci aż w końcu dostaję od nich fakturę offline. Teraz biorę ten kod i zaczynam go drukować na każdej fakturze którą wystawiam. Jak odbiorca takiej mojej faktury sprawdzi, że to nie mój cert? No ok - może w urlu przeczytać ale tego chyba nikt nie robi. szczególnie jak url wygląda jak chiński alfabet. Dostaje info, że cert ok i tyle, czy może coś pomijam... ?

TH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Mam do Was jeszcze pytanie dotyczące budowania aplikacji, a zasad bezpieczeństwa danych.

Jeśli chcielibyśmy by cały mechanizm był scentralizowany na serwerze - czyli programu nie będzie na komputerze klienta, tylko będzie uruchamiany po stronie serwera - czy jest to zgodne z zasadami bezpieczeństwa? Do podpisu potrzebujemy certyfikatów i kluczy prywatnych użytkowników, które musiałby by być przechowywane na serwerze, więc tutaj widzę naruszenie chociażby RODO, ale z drugiej strony serwer to prywatna własność firmy gdzie nikt nie będzie miał do niego dostępu. Druga sprawa to samo przechowywanie certyfikatów poza lokalnym komputerem użytkownika - wydawać by się mogło, że niebezpieczna sprawa, bo każdy może naszym certyfikatem podpisać dokumenty, ale klucz prywatny dodatkowo jest zabezpieczony silnym hasłem, które zna tylko dana osoba. A może uwierzytelnienie powinno być obowiązkowo po stronie klienta by użytkownik miał tylko certyfikaty lokalnie?

Takie luźne przemyślenie w jaki sposób robi się takie rzeczy by były zgodne z zasadami bezpieczeństwa.

V2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 28
0

Czy działa wam w środowisku demo pobieranie UPO faktury z sesji na podstawie numeru KSeF (tj. endpoint /api/v2/sessions/{referenceNumber}/invoices/ksef/{ksefNumber}/upo)? W KSeF 1.0 nazywało się to "UPO na żądanie" i działało chyba tylko w środowisku testowym. Nie wiem czy w KSeF 2.0 jest tak samo, czy może przyczyną niepowodzenia jest to, że próbuję tego pobierania dla faktury wysłanej wsadowo. W każdym razie dostaję kod HTTP 403.

ZB
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 66
0
  1. Gdzie znajdę aktualną wersję API na Test i Demo?
  2. Ponoć Demo różni się od Test, gdzie jest spis różnic? Ktoś wie?
    W dokumentacji na github ani słowa o Demo.
G5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1
0

Hej,

Zastnawiam się czy udało się komuś z Was wysłać fakturę FA(3) na środowisko testowe? Nie ważne jaką fakturę przesyłam i co zmieniam to dostaje taki błąd:

Kopiuj
 0 = "Could not find schema information for the element 'http://crd.gov.pl/wzor/2025/06/25/13775/:Faktura'."
description = "Błąd weryfikacji semantyki dokumentu faktury"
code = {Integer@16032} 450

A ten link do schemy http://crd.gov.pl/wzor/2025/06/25/13775/ wziąłem z przykładowych faktur dostępnych pod tym linkiem i nawet przesłanie jakiejkolwiek przykładowej faktury przygotowanej przez nich mi nie działa i zwraca błąd powyżej.

https://ksef.podatki.gov.pl//pliki-do-pobrania-ksef-20/
(plik "przykladowe-pliki-dla-struktury-logicznej-e-faktury-fa-3 ")

Zastanawiam się czy powinienem strzelać do https://ksef-test.mf.gov.pl czy może powinienem używać innego środowiska niż testowego starając się zrobić tą integrację?

Przykładowa faktura:

Kopiuj
<?xml version="1.0" encoding="UTF-8"?>
<Faktura xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2022/01/05/eD/DefinicjeTypy/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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-02-01T00:00:00Z</DataWytworzeniaFa>
		<SystemInfo>SamploFaktur</SystemInfo>
	</Naglowek>
	<Podmiot1>
		<DaneIdentyfikacyjne>
			<NIP>9999999999</NIP>
			<Nazwa>ABC AGD sp. z o. o.</Nazwa>
		</DaneIdentyfikacyjne>
		<Adres>
			<KodKraju>PL</KodKraju>
			<AdresL1>ul. Kwiatowa 1 m. 2</AdresL1>
			<AdresL2>00-001 Warszawa</AdresL2>
		</Adres>
		<DaneKontaktowe>
			<Email>abc@abc.pl</Email>
			<Telefon>667444555</Telefon>
		</DaneKontaktowe>
	</Podmiot1>
	<Podmiot2>
		<DaneIdentyfikacyjne>
			<NIP>1111111111</NIP>
			<Nazwa>F.H.U. Jan Kowalski</Nazwa>
		</DaneIdentyfikacyjne>
		<Adres>
			<KodKraju>PL</KodKraju>
			<AdresL1>ul. Polna 1</AdresL1>
			<AdresL2>00-001 Warszawa</AdresL2>
		</Adres>
		<DaneKontaktowe>
			<Email>jan@kowalski.pl</Email>
			<Telefon>555777999</Telefon>
		</DaneKontaktowe>
		<NrKlienta>fdfd778343</NrKlienta>
		<JST>2</JST>
		<GV>2</GV>
	</Podmiot2>
	<Fa>
		<KodWaluty>PLN</KodWaluty>
		<P_1>2026-02-15</P_1>
		<P_1M>Warszawa</P_1M>
		<P_2>FV2026/02/150</P_2>
		<P_6>2026-01-27</P_6>
		<P_13_1>1666.66</P_13_1>
		<P_14_1>383.33</P_14_1>
		<P_13_3>0.95</P_13_3>
		<P_14_3>0.05</P_14_3>
		<P_15>2051</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>
		<FP>1</FP>
		<DodatkowyOpis>
			<Klucz>preferowane godziny dowozu</Klucz>
			<Wartosc>dni robocze 17:00 - 20:00</Wartosc>
		</DodatkowyOpis>
		<FaWiersz>
			<NrWierszaFa>1</NrWierszaFa>
			<UU_ID>aaaa111133339990</UU_ID>
			<P_7>lodówka Zimnotech mk1</P_7>
			<P_8A>szt.</P_8A>
			<P_8B>1</P_8B>
			<P_9A>1626.01</P_9A>
			<P_11>1626.01</P_11>
			<P_12>23</P_12>
		</FaWiersz>
		<FaWiersz>
			<NrWierszaFa>2</NrWierszaFa>
			<UU_ID>aaaa111133339991</UU_ID>
			<P_7>wniesienie sprzętu</P_7>
			<P_8A>szt.</P_8A>
			<P_8B>1</P_8B>
			<P_9A>40.65</P_9A>
			<P_11>40.65</P_11>
			<P_12>23</P_12>
		</FaWiersz>
		<FaWiersz>
			<NrWierszaFa>3</NrWierszaFa>
			<UU_ID>aaaa111133339992</UU_ID>
			<P_7>promocja lodówka pełna mleka</P_7>
			<P_8A>szt.</P_8A>
			<P_8B>1</P_8B>
			<P_9A>0.95</P_9A>
			<P_11>0.95</P_11>
			<P_12>5</P_12>
		</FaWiersz>
		<Platnosc>
			<Zaplacono>1</Zaplacono>
			<DataZaplaty>2026-01-27</DataZaplaty>
			<FormaPlatnosci>6</FormaPlatnosci>
		</Platnosc>
		<WarunkiTransakcji>
			<Zamowienia>
				<DataZamowienia>2026-01-26</DataZamowienia>
				<NrZamowienia>4354343</NrZamowienia>
			</Zamowienia>
		</WarunkiTransakcji>
	</Fa>
	<Stopka>
		<Informacje>
			<StopkaFaktury>Kapiał zakładowy 5 000 000</StopkaFaktury>
		</Informacje>
		<Rejestry>
			<KRS>0000099999</KRS>
			<REGON>999999999</REGON>
			<BDO>000099999</BDO>
		</Rejestry>
	</Stopka>
</Faktura>

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.