Krajowy system e-Faktur

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

Ktoś widzi, co w tym wywołaniu jest błędnego?

Kopiuj
POST https://ksef-test.mf.gov.pl/api/online/Payment/Identifier/Request HTTP/1.1
Connection: Keep-Alive
Content-Type: application/json
Accept: application/json;q=0.9,text/plain;q=0.9,text/html
Accept-Charset: UTF-8
Cookie: dtCookie=v_4_srv_5_sn_704596725E5007F690C7FC6A6816AD1F_perc_100000_ol_0_mul_1_app-3Ae03f7c58bcd8b063_1
User-Agent: Proman - KSeF RESTClient/1.0
SessionToken: 6e95067adb6e0fe005be3d8eae90ba7351e4d1ae4f16e8069a12e2b022002434
Content-Length: 67
Host: ksef-test.mf.gov.pl

{"ksefReferenceNumberList":["5830011969-20230912-32471A59A852-E4"]}

Odp:

Kopiuj
HTTP/1.1 400 Bad Request
(...)

{"exception":{"serviceCtx":"srvTEMFC","serviceCode":"20231020-EX-C67D6506DA-248DD88E1D-4C","serviceName":"online.payment.payment.identifier.request","timestamp":"2023-10-20T08:04:45.613Z","referenceNumber":"20231020-SE-67C4B5194A-01AEABDE4E-B4","exceptionDetailList":[{"exceptionCode":31000,"exceptionDescription":"Nieprawidłowe wywołanie."}]}}

Co ciekawe, jak robię to samo ale na sesji, której kontekst jest Identyfikator wewnętrzny jednostki, to już mam:

Kopiuj
HTTP/1.1 400 Bad Request
(...)

{"exception":{"serviceCtx":"srvTEMFC","serviceCode":"20231020-EX-DFB692B224-CF857BF018-E8","serviceName":"online.payment.payment.identifier.request","timestamp":"2023-10-20T08:05:29.108Z","referenceNumber":"20231020-SE-8FFE69E14B-2310FC7A1B-6F","exceptionDetailList":[{"exceptionCode":21169,"exceptionDescription":"Brak autoryzacji lub faktura o podanym identyfikatorze nie istnieje."}]}}

A może po prostu to wciąż nie działa od pół roku?

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

Mam pytanie. Czy orientujecie się może czy KSEF będzie zmieniał model Faktury i czy planujecie w aplikacji obsługiwać wszystkie historyczne modele faktury? Zastanawia mnie kwestia importu faktur na przełomie zmiany modelu faktury. Ktoś wystawił fakturę w starej strukturze logicznej a potem KSEF zmieni sobie strukturę logiczną i deserializacja takiego modelu nie będzie możliwa przy próbie importu i wczytania faktury zakupowej.

Tomasz Górny (Gortex Tomasz Górny)
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Cześć, jest tu ktoś kto zrobił tą integrację w javascript? Zacząłem w nodejs i już na initToken poległem. Dokumentacja jest praktycznie żadna.

AL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 38
0

W weekend, interaktywna wysyłka faktur na test, trwa średnio 0.20 na jeden dokument, rozmiar faktury 2.6kb, 1000 dokumentów wysłanych około 10:30 w niedzielę.

Tomasz Górny (Gortex Tomasz Górny)
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Hej, Próbuję wykonać initToken w nodejs, niestety cały czas dostaję zwrotkę ,,nieprawidłowo zaszyfrowana treść, widzi może ktoś tutaj błąd?

Kopiuj
         const encryptStringWithRsaPublicKey = function(toEncrypt, relativeOrAbsolutePathToPublicKey) {
                const absolutePath = path.resolve(relativeOrAbsolutePathToPublicKey); //path to publicKey.pem
                const publicKey = fs.readFileSync(absolutePath, "utf8"); //read publicKey.pem
                const buffer = Buffer.from(toEncrypt); //Token  
                const encrypted = crypto.publicEncrypt(publicKey, buffer);
                console.log(encrypted);
                return encrypted.toString("base64");
            };


            const encryptedToken = encryptStringWithRsaPublicKey(`${token}|${timestamp}`,'public/ksef/publicKeyTest.pem')


            const absolutePathToXML = path.resolve('public/ksef/ksef.xml');
            const localXML = fs.readFileSync(absolutePathToXML, "utf8");//local xml file
    
            const xml = localXML
            .replace("${challenge}", challengeKey)// challenge
            .replace("${indefier}", '8471609963') //NIP
            .replace("${token}", encryptedToken) //token 

            const initToken =  await fetch(ksefUrlIniToken, {
                method: 'POST',
                headers: {
                  'Accept': 'application/json',
                  'Content-Type': 'application/octet-stream',
                },
                body:xml,
              })
              
            const responseInitToken = await initToken.json()
            console.log(responseInitToken.exception);

Plik wyjściowy:

Kopiuj
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<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>20231022-CR-0F04239EDA-512EA4236B-57</Challenge>
        <Identifier xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:SubjectIdentifierByCompanyType">
            <ns2:Identifier>8471609963</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/2023/06/29/12648/</ns2:TargetNamespace>
                <ns2:Value>FA</ns2:Value>
            </ns2:FormCode>
        </DocumentType>
        <Token>eym2nPITGRa3t5sinIiblBxXycp4cpVUUygdwfxFy7t0X8LlY2VJOqewXYrpEDx5uCi8T3w5T6GlbVh26Os1IvJbKKUj9rjmOack2e08gXPTpWD68IC4YSkbu0PREf997VTK4WBXNkuJ3yDhKiKc8IkGAwZW1tfV62b0UGaN1mV1XNdva4jDrKm2ZGwZSfN/Kz0Q2ffsQI7PbDb+ZVNw6rAuLXyIfKA9c0dHuiEjeudpoJWHZ5XOGUPJiZEr1yKmu4g1Oyj22Eg8r0yQ4B3LDfwZF25oKr+9p1wCXcrZXG3Mep3dAdhx5Do11l+/xUyf1ZQFQDcjVK2VlU4BshB69g==</Token>
    </ns3:Context>
</ns3:InitSessionTokenRequest>

Odpowiedź :

Kopiuj
{
  serviceCtx: 'srvTEMFB',
  serviceCode: '20231022-EX-DF9793AEC4-BAD79C09DD-8C',
  serviceName: 'online.session.session.token.init',
  timestamp: '2023-10-22T12:05:03.585Z',
  referenceNumber: '20231022-SE-4197E7D296-934EA38828-54',
  exceptionDetailList: [
    {
      exceptionCode: 20005,
      exceptionDescription: 'Nieprawidłowo zaszyfrowana treść.'
    }
  ]
}
Tomasz Górny (Gortex Tomasz Górny)
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Ogarnięty temat, zamiast:

Kopiuj
         const encryptStringWithRsaPublicKey = function(toEncrypt, relativeOrAbsolutePathToPublicKey) {
                const absolutePath = path.resolve(relativeOrAbsolutePathToPublicKey); //path to publicKey.pem
                const publicKey = fs.readFileSync(absolutePath, "utf8"); //read publicKey.pem
                const buffer = Buffer.from(toEncrypt); //Token  
                const encrypted = crypto.publicEncrypt(publicKey, buffer);
                console.log(encrypted);
                return encrypted.toString("base64");
            };


Powinno być:

Kopiuj
   const encryptStringWithRsaPublicKey = function(toEncrypt, relativeOrAbsolutePathToPublicKey) {
                const absolutePath = path.resolve(relativeOrAbsolutePathToPublicKey); //path to publicKey.pem
                const publicKey = fs.readFileSync(absolutePath, "utf8"); //read publicKey.pem
                const buffer = Buffer.from(toEncrypt); //Token  
                const padding = crypto.constants.RSA_PKCS1_PADDING; //<- opcja niezbędna
                const oaepHash = 'sha256';//<- opcja niezbędna
                const encrypted = crypto.publicEncrypt({key:publicKey,padding:padding,oaepHash:oaepHash}, buffer);
                return encrypted.toString("base64");
            };

Mam nadzieje że komuś pomoże :)

TO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 22
0

Sprawdzanie czy faktura o danym numerze była już wgrana do KSeF.

Ponowne wgranie do KSeF ten samej faktury może spowodować trochę kłopotów, a jest niestety możliwe (blokują tylko ponowne wgranie w tej samej sesji), więc przydałoby się przed wgraniem faktury sprawdzać, czy już jej przypadkiem w KSeF nie ma.
O ile wgranie faktury, a nawet poczekanie na jej zatwierdzenie nie trwa długo, to odpytanie o fakturę po numerze i dacie może potrwać. O ile początkowo jest to kilka sekund, to po wgraniu kilku tysięcy faktur czas oczekiwania na odpowiedź z KSeF rośnie do kilkudziesięciu sekund na fakturę.
Korzystam z "/online/Query/Invoice/Sync" oraz QueryCriteriaInvoiceDetailType podając numer faktury, zakres dat i Subject1.

Czy jest jakiś lepszy/szybszy sposób na sprawdzenie czy dana faktura jest już wgrana?
Czy macie u siebie takie zabezpieczenie? Jak je realizujecie?

96
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5
0

Hej, wie ktoś coś odnośnie kodów QR? Chodzi o to, że na wydruku dokumentu chyba powinien być kod QR do zeskanowania, da się go jakoś z API pobrać, albo wiadomo chociaż co ten kod ma zawierać żeby go samemu wygenerować?

Tomasz Górny (Gortex Tomasz Górny)
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Hej, wie ktoś może jak uzupełnić pole P_12 w fakturze w przypadku stawki np - Nie podlega? Wszystkie stawki działają oprócz tej :/

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

Witam,
w maju zwracałem się już z tym tematem, ale w międzyczasie przestałem zajmować się nim i teraz wracam do tej sprawy. Przy próbie przesłania faktury KSeF (testowy) zwraca błąd "Nieprawidłowy rozmiar pliku". Próbuję różnych sposobów ale niestety wciąż to samo. Tmp10.zip. XML i request w załączniku. Tworzenie requesta w Delphi 11. Dziękuję za ewentualne sugestie.

ZB
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 66
0

Witam,

Spadło na mnie zrobienie modułu do KSeFa w Delphi, obejrzałem webinary, przeczytałem dokumentację i trochę osiwiałem. Kompletny chaos czuję. Z JPK było o niebo prościej.
Czy ktoś może w żołnierskich słowach pomóc mi wystartować?

  1. W webinarze programista MF miał dostęp do webowego swaggera/openapi i sobie tam klikał i wywoływał requesty, to było nazwane "Edytor OpenApi" na stronie ksef-test.mf.gov.pl, tuż pod "Dokumentacja OpenAPI", teraz tego nie ma, gdzie to się podziało? Ma ktoś link?
  2. W tej ich webowej "Aplikacji Podatnika" założyłem testowe konto na wygenerowany NIP oraz w tym koncie wygenerowałem token dla mojej aplikacji. Co jest następnym krokiem do wykonania, gdy już mam token? Z bełkotu dokumentacji nie potrafię zrozumieć co mam robić, poza tym, że mam RESTem wysyłać XMLe. Proszę o wskazówkę.
JG
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0

Wszystkie te wyniki, o których piszesz udało mi się otrzymać. 2804 mam gdy plik ściągam do FileStreamu. Rozumiem, że to poprawny wynik. Ale nie udało mi się go zakodować w Base64. Wynik 2795 powstał gdy przetwarzałem ciągi tekstowe.

M0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

Cześć, przychodzę z pytaniem o limity.
Teraz podczas testowania wiele razy używam authorisation challenge albo innych wyzwań, ale patrząc na dokumentację z limitami, tak kolorowo na prodzie chyba nie jest, bo

jednostka czasu: MINUTES
default | limit : 20 | czas życia : 20 | Domyślne ograniczenie na liczbę identycznych wywołań usługi w sekwencji.
bad_request | limit : 10 | czas życia : 10 | Ograniczenie na liczbę błędnych wywołań usługi w sekwencji.
online.session.authorisation.challenge | limit : 2 | czas życia : 2 | Ograniczenie na liczbę identycznych wywołań usługi authorisation.challenge w sekwencji.
online.session.session.token.init | limit : 1 | czas życia : 60 | Ograniczenie na liczbę identycznych wywołań usługi session.token.init w sekwencji.

Z tego wynika, że mogę tylko raz zrobić autentykację za pomocą tokena w ciągu godziny zegarowej? Czyli jak klient ma np. 20 faktur i chce je wszystkie przenieść za pomocą wysyłki interaktynwje (po kolei każda) to musi to być wykonane w jednej sesji?

Ale nawet:
online.invoice.invoice.send | limit : 1 | czas życia : 60 | Ograniczenie na liczbę identycznych wywołań usługi invoice.send w sekwencji.
Jak to traktować?
Chyba że źle to rozumiem.

Docelowo jako że klient ma mało faktur, chcę wysyłąć wiele faktur pojedynczo za pomocą sesji interaktywnej, gdzie klient może zaznaczyć sobie do 10 faktur i je na raz wysłać (pseudo wysyłka wsadowa) i na ksef-test to przechodzi (odpowiednie pętle w kodzie itp.) , ale się zastanawiam czy to się uda w związku z tymi limitami.

Piotr Józefowski
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Cześć,
wiecie może o co mu chodzi ? [Pobieranie nagłówków faktur zakupu]. Wysyłanie faktur w oparciu o tą samą autoryzację działa.

POST https://ksef-test.mf.gov.pl/api/online/Query/Invoice/Sync?PageSize=10&PageOffset=0

{
"timestamp" : "2023-10-24T07:41:58.763Z",
"queryCriteria": {
"subjectType": "subject2",
"type": "range",
"invoicingDateFrom": "2023-01-01T00:00:00",
"invoicingDateTo": "2023-10-20T12:00:00"
}
}

{
"exception": {
"serviceCtx": "srvTEMFC",
"serviceCode": "20231024-EX-2C80FEAF85-46CE2117D9-8F",
"serviceName": "online.query.query.invoice",
"timestamp": "2023-10-24T08:29:41.345Z",
"exceptionDetailList": [
{
"exceptionCode": 21001,
"exceptionDescription": "Nieczytelna treść."
}
]
}
}

ZB
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 66
0

Chcę odpalić tryb interaktywny za pomocą tokena. Przeszedłem pierwszy krok z wywołaniem RESTowego:

Kopiuj
/online/Session/AuthorisationChallenge

mam response z timestamp i challenge.

Teraz kolejny krok to:

Kopiuj
/online/Session/InitToken

ale tu już zdurniałem, wiem, że muszę zrobić XML, w yamlu jest link do przykładowego XMLa (https://ksef-test.mf.gov.pl/document/InitSessionTokenRequestExample/1.0) wygląda on tak:

Kopiuj
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<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>20211001-CR-FFFFFFFFFF-FFFFFFFFFF-FF</Challenge>
        <Identifier xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:SubjectIdentifierByCompanyType">
            <ns2:Identifier>1111111111</ns2:Identifier>
        </Identifier>
        <DocumentType>
            <ns2:Service>KSeF</ns2:Service>
            <ns2:FormCode>
                <ns2:SystemCode>FA (1)</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>
        <Encryption>
            <ns2:EncryptionKey>
                <ns2:Encoding>Base64</ns2:Encoding>
                <ns2:Algorithm>AES</ns2:Algorithm>
                <ns2:Size>256</ns2:Size>
                <ns2:Value>Kmrs/g9ZjI5lKDoMukGDMDULgvx0BkZ6qHEazLLo+LmzK4FNhNp4owcPioydkuiJE02norz5P5hjFO+SMO9kgtPji0Qjx57B+o6tKMUlL6EA3nn40+JNkZuvW+hUnEt7/kxZCcjxEXTuLpQuANwovUxdej041nKRY+sthBEDb3gN4pzJ+HfACysB8H5dpvZj1MkBe7hydLCJlNkEYHYA5dO/3FnW/5fh12Be3ij7Z410+3XZT5AiteEwGCJCPdC0epM3yJgi8uZt2vqn83fgYqSqmMtXLk0ZVjTT4Z1wd2cZ3DF7tlIfoYeB2DKQiwbXAZr/W3jVzYliXBykZLC/Sg==</ns2:Value>
            </ns2:EncryptionKey>
            <ns2:EncryptionInitializationVector>
                <ns2:Encoding>Base64</ns2:Encoding>
                <ns2:Bytes>16</ns2:Bytes>
                <ns2:Value>H9KQyy/SHurlswE4pxSIsg==</ns2:Value>
            </ns2:EncryptionInitializationVector>
            <ns2:EncryptionAlgorithmKey>
                <ns2:Algorithm>RSA</ns2:Algorithm>
                <ns2:Mode>ECB</ns2:Mode>
                <ns2:Padding>PKCS#1</ns2:Padding>
            </ns2:EncryptionAlgorithmKey>
            <ns2:EncryptionAlgorithmData>
                <ns2:Algorithm>AES</ns2:Algorithm>
                <ns2:Mode>CBC</ns2:Mode>
                <ns2:Padding>PKCS#7</ns2:Padding>
            </ns2:EncryptionAlgorithmData>
        </Encryption>
        <Token>uH6dmA9lr7/5izGMOTXVzIAe1awXZYZ61zLCEaImSLP+BftDtziV5I+4EaKvWZ+IUCkXHP8FEGDsLHfefUVLS5vbZ8r0W5UxiSqqOAKxvkE7pCfh31+AmKZxZa0TlXYK5EYa4RkJhm7HTgKe4WGZ/Y4G2PdCzdImtvZL49yqQQ3bLqeGeVJ9rMzkuxCbtKGbdopN1/V+64fvLClIuolWI+/z0FlxDVE9a0f8EFKPPpzGowVwJcn5PHBkvVh45vT+pyNbDSvEsyL/udRBXCioWbgRaZReRJNIg6YWZLTSHyi8BK4ofQVuhdcPwHjkETmEQ0aktj+uyqmxqvHbFTA93Q==</Token>
    </ns3:Context>
</ns3:InitSessionTokenRequest>

Jak rozumiem mam go zakodować Base64 i wsadzić do body requesta RESTowego. Dobrze?

Rozumiem też, że token mam zbudować wg wzoru: Base64(encrypt(public_key, bytes(token + ‘|’ + challengeTime))) - RSA kluczem MF?

Ale co wsadzić w pole, które w przykładzie też jest przejechane Base64 o nazwie ns2:Value w sekcji EncryptionKey? O jaki klucz tu chodzi?

I pytanie ostatnie: w tym przykładowym XMLu, pobranym dziś ze stron mf, jest kod FA (1), a to się chyba zmieniło?

Jakub Wardyn
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Cześć, piszę klienta ksefowego w c#. W gruncie rzeczy już to działało, natomiast dzisiaj dostałem telefon że wyskakuje dziwny wyjątek i o co chodzi. Mianowicie próbując nawiązać sesję initToken, dostaję wyjątek "Wartość nie może być zerowa. Nazwa parametru: value". Wyjątek wychodzi już po wysłaniu żądania do api. Plik exe który już wcześniej działał nagle dzisiaj przestał. Spotkał się ktoś z czymś takim?

Wywala się już samo zapytanie initToken, poniżej wklejam body:

Kopiuj
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<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>20231024-CR-69D7A3E4FB-963BB71DBD-02</Challenge>
    <Identifier xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:SubjectIdentifierByCompanyType">
      <ns2:Identifier>1111111111</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/2023/06/29/12648/</ns2:TargetNamespace>
        <ns2:Value>FA</ns2:Value>
      </ns2:FormCode>
    </DocumentType>
    <Token>jpYVs3tKg(...)lb1PjCtilfuQ==</Token>
  </ns3:Context>
</ns3:InitSessionTokenRequest>
GM
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 29
0

Komunikat nr 74 Prace serwisowe na środowisku testowym KSeF
24.10.2023

26 października 2023 r. w godzinach od 14.00 do 20.00 będą prowadzone prace serwisowe na środowisku testowym API Krajowego Systemu e-Faktur i Aplikacji Podatnika KSeF.
W tym czasie mogą wystąpić chwilowe utrudnienia w dostępie do tych środowisk.

Przygotujmy się do tego mentalnie, bo przy tak długim czasie prac, to szanse na niedziałanie czegoś są dość duże.

AL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 38
0

Może zacznie działać identyfikator zbiorczy wreszcie.

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

Prośba o pomoc. Próbuję nawiązać sesję interaktywną tokenem. Z powodzeniem przechodzę wyzwanie autoryzacyjne:

Kopiuj
/api/online/Session/AuthorisationChallenge

W odpowiedzi dostaję:

Kopiuj
{
    "timestamp": "2023-10-24T11:30:35.023Z",
    "challenge": "20231024-CR-6B65EC2896-2B163671F1-63"
}

Teraz mam 3 próby (w pythonie), z których każda jest nieudana (W KAŻDEJ RÓŻNI SIĘ timestamp, Z KTÓREGO KORZYSTAM):

1 Próba:

Kopiuj
import os
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization, asymmetric
import base64
from datetime import datetime
def encrypt_string_with_rsa_public_key(to_encrypt, relative_or_absolute_path_to_public_key):
    absolute_path = os.path.abspath(relative_or_absolute_path_to_public_key)
    with open(absolute_path, "rb") as key_file:
        public_key = serialization.load_pem_public_key(
            key_file.read(),
            backend=default_backend()
        )
    
    encrypted = public_key.encrypt(
        to_encrypt.encode(),
        asymmetric.padding.PKCS1v15()  # używam PKCS1v15 padding
    )
    
    return base64.b64encode(encrypted).decode('utf-8')
token = "(...)B5DAF9EE4C4124B297A4A30FC77"
timestamp = "2023-10-24T11:30:35.023Z" # <-- UŻYWAM TAKIEGO TIMESTAMP

encryptedToken = encrypt_string_with_rsa_public_key(f"{token}|{timestamp}",'publicKey.pem')
print(encryptedToken)

Następnie generuję XML:

Kopiuj
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<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>20231024-CR-6B65EC2896-2B163671F1-63</Challenge>
        <Identifier xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:SubjectIdentifierByCompanyType">
            <ns2:Identifier>1111111111</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/2023/06/29/12648/</ns2:TargetNamespace>
                <ns2:Value>FA</ns2:Value>
            </ns2:FormCode>
        </DocumentType>
        <Token>(...)DuKo2lYhsDc4qIXffVDPGkPlBq5D+4DLzVQ==</Token>
    </ns3:Context>
</ns3:InitSessionTokenRequest>

W następnym kroku:

Kopiuj
/api/online/Session/InitToken

Odpowiedź jaką dostaję:

Kopiuj
{
    "exception": {
        "serviceCtx": "default",
        "serviceCode": "20231024-EX-65AE82B089-C2DED48B3E-51",
        "serviceName": "online.session.session.token.init",
        "timestamp": "2023-10-24T14:44:47.513Z",
        "referenceNumber": "20231024-SE-5ADE6D582C-77ACD0DCB5-EE",
        "exceptionDetailList": [
            {
                "exceptionCode": 21116,
                "exceptionDescription": "Nieprawidłowy token."
            }
        ]
    }
}

2 Próba:

Kopiuj
import os
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization, asymmetric
import base64
from datetime import datetime
def encrypt_string_with_rsa_public_key(to_encrypt, relative_or_absolute_path_to_public_key):
    absolute_path = os.path.abspath(relative_or_absolute_path_to_public_key)
    with open(absolute_path, "rb") as key_file:
        public_key = serialization.load_pem_public_key(
            key_file.read(),
            backend=default_backend()
        )
    
    encrypted = public_key.encrypt(
        to_encrypt.encode(),
        asymmetric.padding.PKCS1v15()  # używam PKCS1v15 padding
    )
    
    return base64.b64encode(encrypted).decode('utf-8')
token = "(...)B5DAF9EE4C4124B297A4A30FC77"
timestamp = int(datetime.strptime('2023-10-24T11:23:14.332Z', '%Y-%m-%dT%H:%M:%S.%fZ').timestamp()*1000) # <-- UŻYWAM TAKIEGO TIMESTAMP

encryptedToken = encrypt_string_with_rsa_public_key(f"{token}|{timestamp}",'publicKey.pem')
print(encryptedToken)

Następnie generuję XML:

Kopiuj
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<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>20231024-CR-6B65EC2896-2B163671F1-63</Challenge>
        <Identifier xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:SubjectIdentifierByCompanyType">
            <ns2:Identifier>1111111111</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/2023/06/29/12648/</ns2:TargetNamespace>
                <ns2:Value>FA</ns2:Value>
            </ns2:FormCode>
        </DocumentType>
        <Token>(...)DuKo2lYhsDc4qIXffVDPGkPlBq5D+4DLzVQ==</Token>
    </ns3:Context>
</ns3:InitSessionTokenRequest>

W następnym kroku:

Kopiuj
/api/online/Session/InitToken

Odpowiedź jaką dostaję:

Kopiuj
{
    "exception": {
        "serviceCtx": "default",
        "serviceCode": "20231024-EX-2132D8A125-7487D95B0B-A7",
        "serviceName": "online.session.session.token.init",
        "timestamp": "2023-10-24T14:48:31.811Z",
        "referenceNumber": "20231024-SE-3C96C28D13-173D380778-3C",
        "exceptionDetailList": [
            {
                "exceptionCode": 21112,
                "exceptionDescription": "Nieprawidłowy czas tokena."
            }
        ]
    }
}

3 Próba:

Kopiuj
import os
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization, asymmetric
import base64
from datetime import datetime
def encrypt_string_with_rsa_public_key(to_encrypt, relative_or_absolute_path_to_public_key):
    absolute_path = os.path.abspath(relative_or_absolute_path_to_public_key)
    with open(absolute_path, "rb") as key_file:
        public_key = serialization.load_pem_public_key(
            key_file.read(),
            backend=default_backend()
        )
    
    encrypted = public_key.encrypt(
        to_encrypt.encode(),
        asymmetric.padding.PKCS1v15()  # używam PKCS1v15 padding
    )
    
    return base64.b64encode(encrypted).decode('utf-8')
token = "(...)B5DAF9EE4C4124B297A4A30FC77"
timestamp = int(datetime.strptime('2023-10-24T11:23:14.332Z', '%Y-%m-%dT%H:%M:%S.%fZ').timestamp()) # <-- UŻYWAM TAKIEGO TIMESTAMP

encryptedToken = encrypt_string_with_rsa_public_key(f"{token}|{timestamp}",'publicKey.pem')
print(encryptedToken)

Następnie generuję XML:

Kopiuj
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<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>20231024-CR-6B65EC2896-2B163671F1-63</Challenge>
        <Identifier xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:SubjectIdentifierByCompanyType">
            <ns2:Identifier>1111111111</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/2023/06/29/12648/</ns2:TargetNamespace>
                <ns2:Value>FA</ns2:Value>
            </ns2:FormCode>
        </DocumentType>
        <Token>(...)DuKo2lYhsDc4qIXffVDPGkPlBq5D+4DLzVQ==</Token>
    </ns3:Context>
</ns3:InitSessionTokenRequest>

W następnym kroku:

/api/online/Session/InitToken

Odpowiedź jaką dostaję:

Kopiuj
{
    "exception": {
        "serviceCtx": "default",
        "serviceCode": "20231024-EX-6FA8374F44-ED28BD4B9D-31",
        "serviceName": "online.session.session.token.init",
        "timestamp": "2023-10-24T14:51:05.785Z",
        "referenceNumber": "20231024-SE-EFDD254BC9-72841AD57F-D8",
        "exceptionDetailList": [
            {
                "exceptionCode": 21112,
                "exceptionDescription": "Nieprawidłowy czas tokena."
            }
        ]
    }
}
MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0

Widziałem, że wiele osób miało z tym problem, ale niestety w moim przypadku nic nie pomogło
Wysyłam fakturę na https://ksef-demo.mf.gov.pl/api/online/Invoice/Send i jako błąd otrzymuje

Kopiuj
stdClass Object
(
    [exception] => stdClass Object
        (
            [serviceCtx] => srvTRMFC
            [serviceCode] => 20231024-EX-899C252EC1-BBE43F677C-62
            [serviceName] => online.invoice.invoice.send
            [timestamp] => 2023-10-24T15:48:37.744Z
            [exceptionDetailList] => Array
                (
                    [0] => stdClass Object
                        (
                            [exceptionCode] => 21405
                            [exceptionDescription] => Dokument nie jest zgodny ze schemą (json).
                        )

                )

        )

)

Dokument XML jest na 100% poprawny bo pobrałem go z ksefu
Json-a liczę jak poniżej. Domyślam się, że w nim jest błąd

Kopiuj
curl_setopt($ch3, CURLOPT_URL, 'https://ksef-demo.mf.gov.pl/api/online/Invoice/Send');
curl_setopt($ch3, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch3, CURLOPT_POST,1);
curl_setopt($ch3, CURLOPT_CUSTOMREQUEST, "PUT");

$headers = array(
    'accept: application/json',
	'SessionToken: '.$session_token,
    'Content-Type: application/json'
);
$jesik = json_encode(array("invoiceHash" => array(
						"fileSize" =>  strlen($faktura2),
						"hashSHA" => array(
							"algorithm" => "SHA-256",
							"encoding" => "Base64",
							"value" => base64_encode(hash('sha256',$faktura2))
						)
				),
				"invoicePayload" => array(
					"invoiceBody" => base64_encode($faktura2),
					"type" => 'plain'
				)
			));
			

curl_setopt($ch3, CURLOPT_POSTFIELDS,  $jesik);

$faktura2 to string z XMLem

Ktoś może naprawadzić?

R8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 11
0

Witam Szanowne grono walczące z KSEF-em.
Czy poza jest jakaś metoda aby sprawdzić, czy wysłałem już daną fakturę o danym numerze poza metodą /online/Query/Invoice/Sync?PageSize=%&PageOffset=%" ?
z tego co widzę nie da się tam zawęzić danych poza datą ? W takim wypadku zawsze będzie trzeba sprawdza wszystkie FA z danego dnia. Ma ktoś inne rozwiązanie ?

Drugie pytanie, ile trwa sesja i czy ona się automatycznie przegłuża po każdym działaniu/zapytaniu w API ?

DVI Kesatuan
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 13
0

Znalazłem działający kod aplikacji winformsowej wywołującej InitToken. Robi to na podstawie HttpPipelinów tak jak poniżej:
screenshot-20231025143354.png
I działa to Ok natomiast do swojego api, chce to przepisać na restSharpa i tu się pojawia problem, ponieważ dostaje komunikat o pliku niezgodnym ze schemą.
screenshot-20231025143554.png
Czy ktoś załączał plik autoryzacyjny za pomocą RestSharpa, jeżeli tak to w jaki sposób?

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

Orientujecie się może czy da się pobrać paczkę FV metodą asynchroniczną innym numerem referencyjnym sesji niż została zainicjowana (oczywiście mowie tu w kontekście tego samego NIP'u)? Jak można zauważyć w odpowiedzi jest parametr "partExpiration", zakładam, że chodzi o to, że za około 3 tygodnie zostanie usunięta co świadczy o tym, że można ja w dowolnym momencie pobrać., może się mylę ;/.

Jak wykonuję online/Query/Invoice/Async/Status/{QueryElementReferenceNumber} podająć QueryElementReferenceNumber otrzymane z poprzedniej sesji ale zapytanie wykonuję już w nowo otwartej sesji to otrzymuję
"exceptionDetailList": [
{
"exceptionCode": 31000,
"exceptionDescription": "Nieprawidłowe wywołanie."
}
]

ZB
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 66
0

Czytam dokumentację w zakresie sprawdzania sesji:

5.6.4 Status sesji (wsadowej / interaktywnej)

5.6.4.1 Ogólny

Do sprawdzenia ogólnego statusu sesji po numerze referencyjnym nie są potrzebne dodatkowe uprawnienia. Nie jest też potrzebna sesja interaktywna.

5.6.4.2 Interaktywny dowolny

Sprawdzenie interaktywne statusu dowolnej sesji po numerze referencyjnym nie wymaga dodatkowych uprawnień. Metoda wymaga aktywnej sesji interaktywnej i ogranicza się wyłącznie do sesji w tego samego Kontekstu.

5.6.4.3 Interaktywny aktualny
Sprawdzenie interaktywne status aktualnej sesji nie wymaga dodatkowych uprawnień. Wymaga aktywnej sesji interaktywnej.

To jak to jest? Wymaga sesji interaktywnej czy nie? Co to jest ogólny status sesji i czym się różni od statusu dowolnej sesji?

R8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 11
0

Jak zarządzacie pobieraniem UPO ?
Genrealnie UPO można pobrać dopiero po zakończeniu sesji , ale jeżeli wysyłam dużą ilość faktury synchronicznie to przedłużam tą sesje w nieskończoność.
Jak podejść do tematu:

  1. Robić oddzielne sesje na każdy dokument ? Wtedy chyba można szybko dostać Limit żądań ?
  2. przed pobraniem UPO sprawdzać u siebie czy nie mam gdzieś otwartego procesu wysyłki/sprawdzania statusu tuż po i jeżeli nie ma to zamykać wtedy sesje, jeżeli jest zaś otwarte to poczekać z pobraniem UPO?
  3. zawsze zamykać sesje przed pobraniem UPO i jeżeli gdzieś nie pobrało status to sprawdzać fakturę po numerze i hashSHA prze metodę Sync ?
  4. Pobierać upo tylko w nocy ?

Ciekawe jestem waszego podejścia do tematu.

JN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 19
0

Wersja DEMO, wysyłka wsadowa.

Wszystko dzieje się w porządku tj. inicjowanie sesji wsadowej, wysyłka części ZIP i zamknięcie sesji wsadowej. W momencie wywołania /api/common/Status/ w celu pobrania UPO, w odpowiedzi na status sesji wsadowej dostaję

Kopiuj
{
    "processingCode": 441,
    "processingDescription": "Błąd etapu weryfikacji wyników podprocesów przetwarzania faktury",
    "referenceNumber": "20231026-SE-5451931332-3C3893A93B-89",
    "timestamp": "2023-10-26T10:11:26.156Z"
}

Warto dodać, że te faktury wysyłane pojedynczo, zostają przyjęte przez KSeF w sesji interaktywnej i otrzymują UPO bez problemu.
ZIP sprawdzałem, jest poprawny.
Próbowałem wysłać nawet jedną fakturę wsadowo, ale nadal dostaję kod 441.

Czy macie może jakieś pomysły, co może być nie tak?

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

Czy można pobrać faktury, które się wysłało wcześniej (w innej sesji)
Próbuje to zrobić przy pomocy /api/online/Query/Invoice/Sync?PageSize=10&PageOffset=0 ale cały czas mam pusty zwrot - brak błędu

Kopiuj
$ch = curl_init();
		
		$searchQuery = json_encode(array(
						"queryCriteria" => array(
							/*"type" => "list_all",
							"queryCredentialsTypeResultType" => "all",
							"queryCredentialsScopeResultType" => "current"*/
							"subjectType" => "",/*subject1*/
							"type" => "detail",
							"invoicingDateFrom" => "2023-01-01T00:00:00",
							"invoicingDateTo" => "2023-10-26T09:52:58"/*,
							"invoiceNumber" => "4/10/2023"*/
						)
		));

		curl_setopt($ch, CURLOPT_URL, 'https://ksef-demo.mf.gov.pl/api/online/Query/Invoice/Sync?PageSize=10&PageOffset=0');
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_POST,1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $searchQuery);

		$headers = array(
			'accept: application/json',
			'Content-Type: application/octet-stream',
			'SessionToken: '.$session_token
		);
		curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

		$result = curl_exec($ch);
		curl_close($ch);

		var_dump($result);
R8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 11
0
marinoee napisał(a):
  					"subjectType" => "",/*subject1*/

Nie może być pusty, zrób "subject1" jak o wystawca faktury

L3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0

Przed chwilą sprawdziłem status sesji i dostałem w odpowiedzi html zamiast json.
Prace serwisowe - czy nie ma na to komunikatu i tak to zostanie?
Sprawdzacie w swoim kodzie, czy dostaliście json w odpowiedzi?

2023-10-26_15-59.png

L3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0

Powyżej przeglądarka tylko dla ilustracji, a to wyglądało tak:

Kopiuj
GET https://ksef-test.mf.gov.pl/api/online/Session/Status?PageSize=10&PageOffset=0&IncludeDetails=true
Accept: application/json
Content-Type: application/json
SessionToken: 162a604f534c2ca08d2f31e632311a035cb410eeb1c9cdd2aab306126ba420a1

(no content)


HTTP/1.0 200 OK
Connection: close
Server: BigIP
Content-Length: 47763
Client-Date: Thu, 26 Oct 2023 13:40:48 GMT
Client-Peer: 145.237.204.177:443
Client-Response-Num: 1
Client-SSL-Cert-Issuer: /C=PL/O=Unizeto Technologies S.A./OU=Certum Certification Authority/CN=Certum Organization Validation CA SHA2
Client-SSL-Cert-Subject: /C=PL/ST=mazowieckie/L=Warszawa/O=Ministerstwo Finansow/CN=*.mf.gov.pl
Client-SSL-Cipher: TLS_AES_128_GCM_SHA256
Client-SSL-Socket-Class: IO::Socket::SSL
Client-SSL-Version: TLSv1_3

\n
<!DOCTYPE html>
<html>
<head>
<title>Strona chwilowo niedost&#281;pna</title>
...

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.