Krajowy system e-Faktur

0

Cześć wszystkim,

Czy ktoś orientuje się kiedy zostanie wydana broszura informacyjna struktury logicznej do nowej schemy FA(2)? Na stronie https://www.podatki.gov.pl/ksef/baza-wiedzy-ksef/pliki-do-pobrania-ksef/ znajduje się tylko broszura do FA(1)..

0

Działa komuś https://ksef-test.mf.gov.pl/ ?
Od jakiegoś czasu próbuję pobrać nowe yamle i ni chu chu...

screenshot-20230808111056.png

0
TymOnX napisał(a):

Działa komuś https://ksef-test.mf.gov.pl/ ?
Od jakiegoś czasu próbuję pobrać nowe yamle i ni chu chu...

Masz w załączniku,na pewno po aktualizacji ściągane, ale nie dziś ani wczoraj ;)
IFace.zip

0

Temat płatności... Poza tym, że nie działa generowanie, to w zasadzie co ten identyfikator komu ma dawać poza tym, żeby umieszczać na przelewie zastępując numery? To w żaden sposób przecież nie oznacza zapłacenia za fakturę. Czyli poza poznaniem listy faktur nie przynosi żadnej korzyści. Co więcej, przecież przelew można zrobić na niepełną kwotę faktury i co wtedy?
Mam wrażenie, że ta funkcjonalność jest zupełnie zbędna i niepotrzebna, pomijając fakt, że płatności mogą w ogóle nie dawać informacji o identyfikatorze w tytule (np. onlinowe). A jeśli już chcieć wykorzystać, to cała funkcjonalność powinna znajdować się w systemach płatności, a nie ERP.

0

Cześć!
Problem z initToken.
Pobrałem przykładowe żądanie z:
https://ksef-test.mf.gov.pl/document/InitSessionTokenRequestExample/1.0

W odpowiedzi na request:

curl -X 'POST'
'https://ksef-test.mf.gov.pl/api/online/Session/InitToken'
-H 'accept: application/json'
-H 'Content-Type: application/octet-stream'
--data-binary 'init.xml'

pojawia się błąd "Dokument nie jest zgodny ze schemą (xsd).", błąd pojawia się niezależnie czy użyję oryginalnego pliku czy też podstawie dane z challenge.
Przykładowe żądanie jest nieprawidłowe czy źle wysyłam?

Edit:

  • tak wygląda plik z uzupełnionymi danymi który wysyłam (bez NIP).
<?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"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://ksef.mf.gov.pl/schema/gtw/svc/online/auth/request/2021/10/01/0001 https://ksef.mf.gov.pl/schema/gtw/svc/online/auth/request/2021/10/01/0001/authRequest.xsd">
        <ns3:Context>
                <Challenge>20230808-CR-E0FA5B1A95-77474656DD-28</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>
                <Token>VXVsdm7P6I+aTCAu9u6EvXtht4tiy2V61EC7gEb3i7dqvnzNjkPUMjkbUg/XirILsLSI/TY8Syk7f7K3zYcY6u9rTlg7CrxzVeSTjCvuxrG/cNNXHi+RPlxZRCAg52bgKNp0vJCA3byP6z5fdHGs0dT3m8qNVs5k4Q/ZXbg9H2smaPkWZQ6uiLqm409pE5PD6qoGAXgUGzJ4oJ80LUwzxUqpgBl3kp1ImQ1zuewDg1n49B1CmcSvWyf4+u0QzQJRDSkQVjNHlKbPyabcrjmjyQT9TWHxIrwaQNzqjSE3coZ+V6k43c0mrRDyjobU5eu/5LzOZJLShnGHudJOQCWC0A==</Token>
        </ns3:Context>
</ns3:InitSessionTokenRequest>
0

Kolejna ciekawostka w sprawach płatności: w specyfikacji interfejsu jest napisane "Identyfikator płatności jest numerem agregującym jeden lub więcej numerów KSeF faktur tej samej pary wystawcy i odbiorcy. Do wygenerowania identyfikatora konieczne jest zadeklarowanie listy numerów KSeF faktur, gdzie Kontekst nawiązanej sesji jest wskazany jako odbiorca". Tylko czasami płaci się swoje korekty ujemne, co będzie nie możliwe, bo odbiorcą jest druga firma. Może wtedy trzeba będzie robić jeden przelew na jedną fakturę...

0

Wysyłam plik InitSessionTokenRequest.xml do ksef-test.mf.gov.pl/api/online/Session/InitToken i otrzymuje błąd {"exceptionCode":21401,"exceptionDescription":"Dokument nie jest zgodny ze schemą (xsd)." Może ktoś juz to przerabiał
skrypt do wysyłki
//--------------

curl_setopt($ch, CURLOPT_URL, 'https://ksef-test.mf.gov.pl/api/online/Session/InitToken');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, base64_encode(file_get_contents('InitSessionTokenRequest.xml')) );
$headers = array(
'accept: application/json',
'Content-Type: application/octet-stream'
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

//----------------

plik InitSessionTokenRequest.xml
NIP -> wstawiam nip
TOKEN -> wstawiam token
//---------------

<?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>
		<Timestamp>2023-08-10T07:00:41.162Z</Timestamp>
		<Challenge>20230810-CR-446290B758-0E0FB77B85-6B</Challenge>
		<Identifier xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:SubjectIdentifierByCompanyType">
			<ns2:Identifier>NIP</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>TOKEN</Token>
	</ns3:Context>
</ns3:InitSessionTokenRequest>
0

Czy wysyłaliście już na serwer test Faktury w wersji Fa(2)? Mi zwalidowana faktura nie przechodzi na serwerze. Jest odrzucana komunikatem Dokument niezgodny ze schemą.

0

@JRN: ja podczas wysylki faktury mam takiego jsona

body.JPG

0

Czy komuś udało się wygenerować z XSD faktury klasę w C#, do której dałoby się zdeserializować XML z fakturą?
Niby udało mi się taką klasę wygenerować, ale nie udaje mi się wczytać XML.
Błąd poniższy (ale to pewnie wierzchołek góry lodowej):

System.InvalidOperationException: Wystąpił błąd w czasie wykonywania odbicia typu 'Faktura_stara_wersja.Faktura'.
 ---> System.InvalidOperationException: Wystąpił błąd w czasie wykonywania odbicia właściwości 'Podmiot1'.
 ---> System.InvalidOperationException: Wystąpił błąd w czasie wykonywania odbicia typu 'Faktura_stara_wersja.FakturaPodmiot1'.
 ---> System.InvalidOperationException: Wystąpił błąd w czasie wykonywania odbicia właściwości 'DaneIdentyfikacyjne'.
 ---> System.InvalidOperationException: Wystąpił błąd w czasie wykonywania odbicia typu 'Faktura_stara_wersja.TPodmiot1'.
 ---> System.InvalidOperationException: Wystąpił błąd w czasie wykonywania odbicia właściwości 'Items'.
 ---> System.InvalidOperationException: Typ identyfikatora wyboru 'ItemsElementName' jest niezgodny z typem 'Items'. Użyj tablicy System.Collections.Generic.List`1[[Faktura_stara_wersja.ItemsChoiceType, TestKSeF, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].
0

Jakby ktoś był ciekawy, to liczba kontrolna dla identyfikatora wewnętrznego oddziału to zdaje się najzwyklejszy CRC stosowany np. przy EAN13 (czyli kolejne liczby w wagach x1, x3, x1, x3 ..., suma modulo 10.

0

Może jakaś dobra dusza wrzucić poprawnego sampla xml do requesta Session/InitToken ???

0
kilerfcb napisał(a):

Może jakaś dobra dusza wrzucić poprawnego sampla xml do requesta Session/InitToken ???

<?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>CHALLENGE</Challenge>
<Identifier xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:SubjectIdentifierByCompanyType">
ns2:IdentifierNIP</ns2:Identifier>
</Identifier>
<DocumentType>
ns2:ServiceKSeF</ns2:Service>
ns2:FormCode
ns2:SystemCodeFA (2)</ns2:SystemCode>
ns2:SchemaVersion1-0E</ns2:SchemaVersion>
ns2:TargetNamespacehttp://crd.gov.pl/wzor/2023/06/29/12648/</ns2:TargetNamespace>
ns2:ValueFA</ns2:Value>
</ns2:FormCode>
</DocumentType>
<Token>TOKEN</Token>
</ns3:Context>
</ns3:InitSessionTokenRequest>
Musisz tylko podmienić na prawidłowe NIP, CHALLENGE,TOKEN
InitToken.zip

0
kilerfcb napisał(a):

Może jakaś dobra dusza wrzucić poprawnego sampla xml do requesta Session/InitToken ???

<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> - DAJE SWOJ
<Identifier xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:SubjectIdentifierByCompanyType">
ns2:Identifier1111111111</ns2:Identifier> - DAJE SWOJ
</Identifier>
<DocumentType>
ns2:ServiceKSeF</ns2:Service>
ns2:FormCode
ns2:SystemCodeFA (1)</ns2:SystemCode>
ns2:SchemaVersion1-0E</ns2:SchemaVersion>
ns2:TargetNamespacehttp://crd.gov.pl/wzor/2021/11/29/11089/</ns2:TargetNamespace>
ns2:ValueFA</ns2:Value>
</ns2:FormCode>
</DocumentType>
<Encryption>
ns2:EncryptionKey
ns2:EncodingBase64</ns2:Encoding>
ns2:AlgorithmAES</ns2:Algorithm>
ns2:Size256</ns2:Size>
ns2:ValueKmrs/g9ZjI5lKDoMukGDMDULgvx0BkZ6qHEazLLo+LmzK4FNhNp4owcPioydkuiJE02norz5P5hjFO+SMO9kgtPji0Qjx57B+o6tKMUlL6EA3nn40+JNkZuvW+hUnEt7/kxZCcjxEXTuLpQuANwovUxdej041nKRY+sthBEDb3gN4pzJ+HfACysB8H5dpvZj1MkBe7hydLCJlNkEYHYA5dO/3FnW/5fh12Be3ij7Z410+3XZT5AiteEwGCJCPdC0epM3yJgi8uZt2vqn83fgYqSqmMtXLk0ZVjTT4Z1wd2cZ3DF7tlIfoYeB2DKQiwbXAZr/W3jVzYliXBykZLC/Sg==</ns2:Value>
</ns2:EncryptionKey>
ns2:EncryptionInitializationVector
ns2:EncodingBase64</ns2:Encoding>
ns2:Bytes16</ns2:Bytes>
ns2:ValueH9KQyy/SHurlswE4pxSIsg==</ns2:Value>
</ns2:EncryptionInitializationVector>
ns2:EncryptionAlgorithmKey
ns2:AlgorithmRSA</ns2:Algorithm>
ns2:ModeECB</ns2:Mode>
ns2:PaddingPKCS#1</ns2:Padding>
</ns2:EncryptionAlgorithmKey>
ns2:EncryptionAlgorithmData
ns2:AlgorithmAES</ns2:Algorithm>
ns2:ModeCBC</ns2:Mode>
ns2:PaddingPKCS#7</ns2:Padding>
</ns2:EncryptionAlgorithmData>
</Encryption>
<Token>uH6dmA9lr7/5izGMOTXVzIAe1awXZYZ61zLCEaImSLP+BftDtziV5I+4EaKvWZ+IUCkXHP8FEGDsLHfefUVLS5vbZ8r0W5UxiSqqOAKxvkE7pCfh31+AmKZxZa0TlXYK5EYa4RkJhm7HTgKe4WGZ/Y4G2PdCzdImtvZL49yqQQ3bLqeGeVJ9rMzkuxCbtKGbdopN1/V+64fvLClIuolWI+/z0FlxDVE9a0f8EFKPPpzGowVwJcn5PHBkvVh45vT+pyNbDSvEsyL/udRBXCioWbgRaZReRJNIg6YWZLTSHyi8BK4ofQVuhdcPwHjkETmEQ0aktj+uyqmxqvHbFTA93Q==</Token> - DAJE SWOJ
</ns3:Context>
</ns3:InitSessionTokenRequest>

Token dlugosc 344 znaki, puszczam posta

Ścieżka do pliku init.xml

$initXmlFilePath = "C:\Users\XXX\Downloads\InitSessionTokenRequestExample.xml"

URL docelowe

$targetUrl = "https://ksef-test.mf.gov.pl/api/online/Session/InitToken"

Wczytanie zawartości pliku init.xml jako bajtów

$initXmlData = Get-Content -Path $initXmlFilePath -Encoding Byte

Utworzenie żądania POST za pomocą Invoke-RestMethod

$response1 = Invoke-RestMethod -Uri $targetUrl -Method 'POST' -Headers @{
"accept" = "application/json"
"Content-Type" = "application/octet-stream"
} -Body $initXmlData -ContentType "application/octet-stream"

i dostaje Dokument nie jest zgodny ze schemą (xsd)

:/InitToken.7z

0

Udało mi sie w końcu uzyskać SessionToken z InitToken wrzucam kod, niby to samo co robiłem wcześniej ale przerobiłem kilka wersji xml. U mnie działa w ten sposób może komuś pomoże.

$fileContents = '<?xml version="1.0" encoding="UTF-8"?>
<ns3:InitSessionTokenRequest xmlns="http://ksef.mf.gov.pl/schema/gtw/svc/online/types/2021/10/01/0001" xmlns:ns2="http://ksef.mf.gov.pl/schema/gtw/svc/types/2021/10/01/0001" xmlns:ns3="http://ksef.mf.gov.pl/schema/gtw/svc/online/auth/request/2021/10/01/0001">
	<ns3:Context>
		<Challenge>'.$challenge->challenge.'</Challenge>
		<Identifier xsi:type="ns2:SubjectIdentifierByCompanyType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
			<ns2:Identifier>'.$nip.'</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>
		<Token>'.$tokenZakodowany.'</Token>
	</ns3:Context>
</ns3:InitSessionTokenRequest>';
curl_setopt($ch, CURLOPT_URL, "https://ksef-test.mf.gov.pl/api/online/Session/InitToken");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'accept: application/json',
    'Content-Type: application/octet-stream'
));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fileContents);
$response = curl_exec($ch);

if (curl_errno($ch)) {
    echo 'Błąd Curl: ' . curl_error($ch);
}

curl_close($ch);
echo $response;
0

Może ktoś na to rzucić okiem? Wyzwanie + inittoken request

$body = @{
'contextIdentifier' = @{
'type' = 'onip'
'identifier' = $nip

}
}

$bodyJSON = $body | ConvertTo-Json

$authchallengeresponse = Invoke-WebRequest -Uri 'https://ksef-test.mf.gov.pl/api/online/Session/AuthorisationChallenge' -Body $bodyJSON -ContentType 'application/json' -UseBasicParsing -Method Post

$response = $authchallengeresponse.Content | ConvertFrom-JSON

$dateString = $response.timestamp
$timestamp = [DateTime]::ParseExact($dateString, "yyyy-MM-ddTHH:mm:ss.fffZ", $null)
$milliseconds = [math]::Round(($timestamp - [DateTime]"1970-01-01T00:00:00Z").TotalMilliseconds)

$toencrypt = $apitoken+'|'+$milliseconds

Wczytanie zawrtosci klucza

$publicKeyPath = 'C:\publicKey.pem'
$publicKeyPEM = Get-Content -Path $publicKeyPath -Raw

Import biblioteki BouncyCastle

Add-Type -Path 'C:\bouncycastle.1.8.9\lib\BouncyCastle.Crypto.dll'

Zaladowanie PEM klucza

$keyReader = [IO.StringReader]::new($publicKeyPEM)
$pemReader = [Org.BouncyCastle.OpenSsl.PemReader]::new($keyReader)
$keyObject = $pemReader.ReadObject()

PEM to RSA

$rsaKeyParams = [Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters] $keyObject

Create an RSA object and set its parameters

$rsa = New-Object System.Security.Cryptography.RSACryptoServiceProvider
$rsa.ImportParameters((New-Object System.Security.Cryptography.RSAParameters -Property @{
Modulus = $rsaKeyParams.Modulus.ToByteArrayUnsigned()
Exponent = $rsaKeyParams.Exponent.ToByteArrayUnsigned()
}))

Convert the string to bytes (utf-8)

$dataToEncrypt = [System.Text.Encoding]::UTF8.GetBytes($toencrypt)

Encrypt the data using the RSA public key

$encryptedData = $rsa.Encrypt($dataToEncrypt, $true)

Convert the encrypted bytes to base64 (for display or transmission)

$encryptedBase64 = [Convert]::ToBase64String($encryptedData)

XML to inittoken request

$fileContents = '<?xml version="1.0" encoding="UTF-8"?>
<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>'+$response.challenge+'</Challenge>
<Identifier xsi:type="ns2:SubjectIdentifierByCompanyType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
ns2:Identifier'+$nip+'</ns2:Identifier>
</Identifier>
<DocumentType>
ns2:ServiceKSeF</ns2:Service>
ns2:FormCode
ns2:SystemCodeFA (1)</ns2:SystemCode>
ns2:SchemaVersion1-0E</ns2:SchemaVersion>
ns2:TargetNamespacehttp://crd.gov.pl/wzor/2021/11/29/11089/</ns2:TargetNamespace>
ns2:ValueFA</ns2:Value>
</ns2:FormCode>
</DocumentType>
<Token>'+$encryptedBase64+'</Token>
</ns3:Context>
</ns3:InitSessionTokenRequest>';

$fileEncoded = [System.Text.Encoding]::UTF8.GetBytes($fileContents)
$fileEncodedbase64Encoded = [Convert]::ToBase64String($fileEncoded)

URL docelowe

$targetUrl = "https://ksef-test.mf.gov.pl/api/online/Session/InitToken"

Utworzenie żądania POST za pomocą Invoke-RestMethod

$response1 = Invoke-RestMethod -Uri $targetUrl -Method 'POST' -Headers @{
"accept" = "application/json"
"Content-Type" = "application/octet-stream"
} -Body $fileContents -ContentType "application/octet-stream"

Wyświetlenie odpowiedzi

$response1

Rezultat: Invoke-RestMethod : {"exception":{"serviceCtx":"srvTEMFB","serviceCode":"20230814-EX-2C86D490D2-36B6F033FA-05","serviceName":"online.session.session.token.init","timestamp":"2023-08-14T08:32:00.353Z","referenceNumber":"20230814-SE-02DEE33560-5403FCDA77-95","exceptionDetailList":[{"excep
tionCode":20005,"exceptionDescription":"Nieprawidłowo zaszyfrowana treść."}]}}

Nie wiem teraz czy chodzi o źle zaszyfrowany token czy o content xml. Jak przekazuje content xml zakodowany w base64 to wraca poprzedi błąd czyli "niezgodna schema xml"...

0

może mi ktoś wyjaśnić https://ksef-test.mf.gov.pl/api/online/Invoice/Send, Pobrałem przykład z ksef

{
    "invoiceHash": {
        "hashSHA": {
            "algorithm": "SHA-256",
            "encoding": "Base64",
            "value": "ndeJt2MSJXAPbidtqM8Hnq7c2iIa7qY/y/dgkJUaQT4="
        },
        "fileSize": 2135
    },
    "invoicePayload": {
        "type": "encrypted",
        "encryptedInvoiceHash": {
            "hashSHA": {
                "algorithm": "SHA-256",
                "encoding": "Base64",
                "value": "CpecTP+QmTAbzC4i1rlJ0VKVZwJSXp/cKxkkvdElFG0="
            },
            "fileSize": 2144
        },
        "encryptedInvoiceBody": "RJ1H3kOesCQHUkcpTi7GTbIQkF0IMdKuUFGrduK+471oGc/HjH3td7M/PXVdoTPDBWIY8oIMrwNbGXEpSBo0muK+iAtt/XOQCsEBiXw1lO0O8YVd62AScttHcx4I9hOlKGSFj4/f8wkuOfM5D7Uoh3vsB0wktx0GvNNAWNM6F9XJ5LRjnIOFGy9hWoWDT2YccFtgxBSmiQD6GS0qm4KnQzVebV6ICPrmaN08d1WdYBod3JEFCA8rFNBN4e617apjvUiLO7IV/vNp5zTps59/NW9DddoiUnYR/AubKwSD93ztcsCM8rcN3XzMnYdJ3rNdg9e8n4UhAMc8DcvuHW8GY9EGcbaVDPaFSlEAJj5ubpbpqOM6Xb1XfeXLlGRn7WLHDhPDyGh+aIKc4a94pXKRzoo6Vc7j8fzrCrIr6TgEr6OmIlfaSS9QBmgn2PyzruC1ORDwgLdWdGLpZz9ic4pGj1rJPxchL5TfJzOunYqCUEt7VMW1V0H4/7cK48HctvHPBKrhu99RxPY7vddGeE2l9o8yPAjFlgYa5z4AkQPH3m3YBW+1WNl57nhlC/R5sv59BnG1W/p/OtFA3PkyNRZNzKh9u74n/1/fWy1jWcMnIuZHnqJdr6MvUBr9w3AL1sSpyv8t7v7nQvlvjFKSHeqi6QFr2umW1DOdwSerttRii571xLLONEpwChzgEMCL0G/o5p8vtD93Gaat7LvY6sxeOR8QJ5AJlif5ViguHsvlTMEnAN9F1O2h3eozkCfrm3Fh9dIrLOOOMOAWLmq8jhHSEp1gUc8RRnYqKFgagSwn8f2kzMGOSlFAY1Wz0ODaZlTKINXtCoDznjdqJ72PP3MPAB7PCw7TJbXsT9RsbfyCX9K0oTEAIe8VQj1rJ//GJ3Uugav2b5eTvMATlAzzLMdkTWoiE/LPZsoBqbq0wJZbVmcInXYZ7eI7x7FGbNO638EWfV146sUOhO6JMAKwBiKU0gMqnE+AgaNBqKve0reVdEUWs2pX2iLaXhLObbuY+ADS8odED1mz0dx4d2bPy9H9uK0WiFLTQU014oP2juYwi4JRln0lbLTYu2+R4R5J/fL1kgkH2Vd8i0wZPZKv+OyrYzT+K1vWB/kbSExw2vuxD4OYXEItiCBN4+rJh57S6hS/7kN1b2X42TiqQhgmh8pDHsjlFwjYns7laxn71VaBDoyBaU3CZj8OJrDwZPP87ZGd5GIukBandjV4/uVSVvuNlsMsfHm7zI8+b2skQpwbtbL8zEYkfqYyh2s/+Aak9wAcPl523QilLaZ89/lRUvXJhjuiHAco5Bxiod9B8jUjvZoaEZu9bNNUuEbuXDPhC8zOqisnTADyVbxQlQo64ZOb0iGbsDzK77TGiAOrYjQM9nXDMCB5QgmQ47jgVB/yt3S+lb6E+k14GwP39LKt+A5Icgl8Ztji28NT7buz8BhQyeTENcafosOkI9xiWh3ZvGqLUG0/pv926bLRLipIBUY4vqRqtAF0fQKyswqI0C6XbCBri1Kb4pv1QEC69h3N7ZlhiiAtJkZ3i1Bjj6H4Qrqw7uvA/ULVkn4Rm35aYwIP/jxf4grNGZt+A28JeXKAT1P4eqRnNYa62uSnVBel1KZJIU9Ql1Zxss7ZtGkBNS/1nlH4/I+BAYBV0zkI86Ib/ZdD4eSHnlEkCbJqtWjW3YfAFGwCcnSqlPWVtmNP+hYuCbGKGXi"
	}
}

Skąd bierze się -> ndeJt2MSJXAPbidtqM8Hnq7c2iIa7qY/y/dgkJUaQT4=
-> 2135

-> CpecTP+QmTAbzC4i1rlJ0VKVZwJSXp/cKxkkvdElFG0=
-> 2144

0

Cześć wszystkim, zacząłem przygodę integracji z KSeF i mam problem z https://ksef.mf.gov.pl/api/online/Session/InitToken

Token generuję po autoryzacji i zalogowaniu na https://ksef-test.mf.gov.pl/web/login.
Token: E3561D1BEC2FBF9D6A9FA4FE1C886BA71C8E588995474CF22794CDE4C609ECB6

Teraz według instrukcji, pytam się https://ksef.mf.gov.pl/api/online/Session/AuthorisationChallenge,
Tak wygląda szyfrowanie w C#:

            string publicKeyFilePath = "publicKey.der";
            string token = "E3561D1BEC2FBF9D6A9FA4FE1C886BA71C8E588995474CF22794CDE4C609ECB6";
            string challengeTimeISO = "2023-08-14T13:58:10.496Z"; 

            byte[] publicKeyBytes = System.IO.File.ReadAllBytes(publicKeyFilePath);

            // Konwersja znacznika czasowego z formatu ISO 8601 do milisekund
            DateTimeOffset challengeTimeUtc = DateTimeOffset.Parse(challengeTimeISO);
            long challengeTime = challengeTimeUtc.ToUnixTimeMilliseconds();


            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
            {
                rsa.ImportSubjectPublicKeyInfo(publicKeyBytes, out _);

                // Konkatenacja tokena autoryzacyjnego, znaku separatora '|' i znacznika czasowego
                string dataToEncrypt = $"{token}|{challengeTime}";
                byte[] dataBytes = Encoding.UTF8.GetBytes(dataToEncrypt);

                // Szyfrowanie danych
                byte[] encryptedData = rsa.Encrypt(dataBytes, false);

                string encryptedBase64 = Convert.ToBase64String(encryptedData);

                System.IO.File.WriteAllText("token.txt", encryptedBase64);
            }

A tak wygląda InitSessionTokenRequest.XML

<?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>20230814-CR-16DD1B78A0-8397CBAEA1-F0</Challenge>
		<Identifier xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:SubjectIdentifierByCompanyType">
			<ns2:Identifier>5250001090</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>
<Token>f+mZiW0yzkvKyM5+lnk4+tg1rXqgvwACgNPbOK1Z4/DUHhP843hf+zWL+Pt1yiz5X0Xlg8nxA6yw3q4+IFWnrLoz5XvjE8MPy+9bqMfWA9Gx0zQgUqGfAOMsH1T7eiLtVeyLPw0jlIQYNoZVtKWK5ZUvUZI+YfZlMnacz/ndivqgannt52XD2dFhzgpMejfKZJbKkGqQyNSDrg4Z0gFrjpaSUniD054yKKkeeL2+/aLhyR2EBQBzKqQypzdGqXdA9IZVxVpv3s85v30w8UCa+qjPHuPKth7/mtj1kYp8r2/q9yucz7b//HXkCWo2t/DBe5fm+YcQxA31WIaVXPI5/Q==</Token>
	</ns3:Context>
</ns3:InitSessionTokenRequest>

Token po zaszyfrowaniu ma 344 znaków długości.
screenshot-20230814181918.png

I otrzymuję taki Response:

{
    "exception": {
        "serviceCtx": "default",
        "serviceCode": "20230814-EX-D8DA755E3E-8CBDAA4305-A2",
        "serviceName": "online.session.session.token.init",
        "timestamp": "2023-08-14T16:20:21.004Z",
        "referenceNumber": "20230814-SE-BBDDF2F4B6-81194C12AE-EB",
        "exceptionDetailList": [
            {
                "exceptionCode": 20005,
                "exceptionDescription": "Nieprawidłowo zaszyfrowana treść."
            }
        ]
    }
}

Czy jest jakaś dobra dusza, która jest mi wstanie podpowiedzieć błąd?

0

Witam, prosiłbym o małą pomoc z tym pytaniem. Czy ktoś się orientuje, czy data podana w numerze KSeF faktury zawsze będzie zgodna z Datą Akceptacji Dokumentu widniejącą w UPO?

0

mam problem z Session/Send/Invoice

generuje fakturę w systemie https://ksef-test.mf.gov.pl/web/ pobieram do xml moge ja bez problemu wczytac jako xml zakładam ze struktura jest ok.
Niestety przy wysylce Session/Send/Invoice mam zwrotkę Dokument nie jest zgodny ze schemą (json)
Faktura ma KodFormularza kodSystemowy="FA (2)" w initSession tez mam ns2:SystemCodeFA (2)</ns2:SystemCode>

Może ktoś ma jakieś sugestie?

// $token to token sesyjny
$fr='<?xml version="1.0" encoding="utf-8"?><Faktura xmlns:xsi="http://ww .......';

$frCount= strlen($fr);
$frHash = base64_encode( hash("sha256", $fr));
$fr64 = base64_encode($fr);

$endpoint = 'https://ksef-test.mf.gov.pl/api/online/Invoice/Send';

$data = '{
    "invoiceHash": {
        "hashSHA": {
            "algorithm": "SHA-256",
            "encoding": "Base64",
            "value": "'.$frHash.'"
        },
        "fileSize": '.$frCount.'
    },
    "invoicePayload": {
        "type": "plain",
        "invoiceBody": "'.$fr64.'"
	}
}';

$headers = array(
    'accept: application/json',
    'SessionToken: '.$token,
    'Content-Type: application/json'
);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $endpoint);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);

0
pablo81 napisał(a):

mam problem z Session/Send/Invoice
(...)
Mógłbyś wkleić xml faktury jaki u Ciebie przechodzi może przy wysylce przez Send/Invoice jest inny walidator.

Cała komunikacja:
screenshot-20230816093632.png
W załączniku poniżej w formie tekstowej:
8_Full.txt

0
kilerfcb napisał(a):

Może ktoś na to rzucić okiem? Wyzwanie + inittoken request

$body = @{
'contextIdentifier' = @{
'type' = 'onip'
'identifier' = $nip

}
}

$bodyJSON = $body | ConvertTo-Json

$authchallengeresponse = Invoke-WebRequest -Uri 'https://ksef-test.mf.gov.pl/api/online/Session/AuthorisationChallenge' -Body $bodyJSON -ContentType 'application/json' -UseBasicParsing -Method Post

$response = $authchallengeresponse.Content | ConvertFrom-JSON

$dateString = $response.timestamp
$timestamp = [DateTime]::ParseExact($dateString, "yyyy-MM-ddTHHss.fffZ", $null)
$milliseconds = [math]::Round(($timestamp - [DateTime]"1970-01-01T0000Z").TotalMilliseconds)

$toencrypt = $apitoken+'|'+$milliseconds

Wczytanie zawrtosci klucza

$publicKeyPath = 'C:\publicKey.pem'
$publicKeyPEM = Get-Content -Path $publicKeyPath -Raw

Import biblioteki BouncyCastle

Add-Type -Path 'C:\bouncycastle.1.8.9\lib\BouncyCastle.Crypto.dll'

Zaladowanie PEM klucza

$keyReader = [IO.StringReader]::new($publicKeyPEM)
$pemReader = [Org.BouncyCastle.OpenSsl.PemReader]::new($keyReader)
$keyObject = $pemReader.ReadObject()

PEM to RSA

$rsaKeyParams = [Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters] $keyObject

Create an RSA object and set its parameters

$rsa = New-Object System.Security.Cryptography.RSACryptoServiceProvider
$rsa.ImportParameters((New-Object System.Security.Cryptography.RSAParameters -Property @{
Modulus = $rsaKeyParams.Modulus.ToByteArrayUnsigned()
Exponent = $rsaKeyParams.Exponent.ToByteArrayUnsigned()
}))

Convert the string to bytes (utf-8)

$dataToEncrypt = [System.Text.Encoding]::UTF8.GetBytes($toencrypt)

Encrypt the data using the RSA public key

$encryptedData = $rsa.Encrypt($dataToEncrypt, $true)

Convert the encrypted bytes to base64 (for display or transmission)

$encryptedBase64 = [Convert]::ToBase64String($encryptedData)

XML to inittoken request

$fileContents = '<?xml version="1.0" encoding="UTF-8"?>
<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>'+$response.challenge+'</Challenge>
<Identifier xsi:type="ns2:SubjectIdentifierByCompanyType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
ns2:Identifier'+$nip+'</ns2:Identifier>
</Identifier>
<DocumentType>
ns2:ServiceKSeF</ns2:Service>
ns2:FormCode
ns2:SystemCodeFA (1)</ns2:SystemCode>
ns2:SchemaVersion1-0E</ns2:SchemaVersion>
ns2:TargetNamespacehttp://crd.gov.pl/wzor/2021/11/29/11089/</ns2:TargetNamespace>
ns2:ValueFA</ns2:Value>
</ns2:FormCode>
</DocumentType>
<Token>'+$encryptedBase64+'</Token>
</ns3:Context>
</ns3:InitSessionTokenRequest>';

$fileEncoded = [System.Text.Encoding]::UTF8.GetBytes($fileContents)
$fileEncodedbase64Encoded = [Convert]::ToBase64String($fileEncoded)

URL docelowe

$targetUrl = "https://ksef-test.mf.gov.pl/api/online/Session/InitToken"

Utworzenie żądania POST za pomocą Invoke-RestMethod

$response1 = Invoke-RestMethod -Uri $targetUrl -Method 'POST' -Headers @{
"accept" = "application/json"
"Content-Type" = "application/octet-stream"
} -Body $fileContents -ContentType "application/octet-stream"

Wyświetlenie odpowiedzi

$response1

Rezultat: Invoke-RestMethod : {"exception":{"serviceCtx":"srvTEMFB","serviceCode":"20230814-EX-2C86D490D2-36B6F033FA-05","serviceName":"online.session.session.token.init","timestamp":"2023-08-14T0800.353Z","referenceNumber":"20230814-SE-02DEE33560-5403FCDA77-95","exceptionDetailList":[{"excep
tionCode":20005,"exceptionDescription":"Nieprawidłowo zaszyfrowana treść."}]}}

Nie wiem teraz czy chodzi o źle zaszyfrowany token czy o content xml. Jak przekazuje content xml zakodowany w base64 to wraca poprzedi błąd czyli "niezgodna schema xml"...

Podejrzewam u siebie problem ze znacznikiem czaosowym w milisekundach.

Czy dla timestamp 2023-08-16T0726.733Z wartość w ms to: 1692174806733???

1

„1 września 2023 r. zacznie obowiązywać druga wersja struktury e-Faktury, która będzie niezmienna aż do okresu wdrożenia docelowego rozwiązania...” – wyjaśniło Ministerstwo Finansów (https://www.msn.com/pl-pl/finanse/najpopularniejsze-artykuly/mf-od-1-wrze%C5%9Bnia-w-ksef-zacznie-obowi%C4%85zywa%C4%87-nowa-struktura-e-faktury/ar-AA1fifPE) - w kontekście uwag po upgradzie testowego KSeF to wdrożenie schemy FA(2) na produkcji może być wyzwaniem, szczególnie że MF zapowiadało, że na produkcyjnym KSeF schema FA(1) zostanie zastąpiona schemą FA(2) (tzn. że nie będzie równoległej obsługi dwóch schem).

0

Czy przy pobieraniu faktury https://ksef-test.mf.gov.pl/api/online/Invoice/Get/4980254880-20230816-4646745D786F-45 w odpowiedzi macie xml z "krzakami" zamiast polskimi znakami?

$targetUrl = "https://ksef-test.mf.gov.pl/api/online/Invoice/Get/4980254880-20230816-4646745D786F-45"
$response = Invoke-RestMethod -Uri $targetUrl -Method 'GET' -Headers @{
"SessionToken" = $sessiontoken
}

Mimo, że próbuję zapisać odpowiedź do pliku i wczytać ją z kododaniem utf8 to nadal mam krzaki

$response | out-file C:\invoice.xml

[xml]$xml_invoice = get-content C:\invoice.xml -Encoding "utf8"

0

Cześć,
Próbuje zaimplementować KSeF u siebie w firmie i natrafiłem na problem w samej platformie. Z tego co widzę użytkownik który został zgłoszony do Urzędu, ma możliwość utworzenia tokenu tylko do "zarządzania uprawnieniami" W jaki sposób wygenerować token do wysyłania faktur, odbierania itd? screenshot-20230817092651.png

0

Cześć, czy też macie problem z wyszukiwaniem faktur? Serwer nie odpowiada. Przykład w CURLu:

curl -X 'POST' \
  'https://ksef-test.mf.gov.pl/api/online/Query/Invoice/Sync?PageSize=10&PageOffset=0' \
  -H 'accept: application/json' \
  -H 'SessionToken: 6f73d395e00545b80cd1c7432cd42993f8e13acb35948ab6143a659248a6c063' \
  -H 'Content-Type: application/vnd.v2+json' \
  -d '{"queryCriteria":{"type":"incremental","subjectType":"subject2","acquisitionTimestampThresholdFrom":"2023-07-05T22:00:00Z","acquisitionTimestampThresholdTo":"2023-07-06T22:00:00Z"}}'
0

Uprawnienia do UPO

W uprawnieniach jest aktualnie coś takiego jak "Osoba będzie uprawniona do przeglądu historii sesji (generowanie UPO)?". Na czym to "generowanie" ma polegać? Jak tego nie będzie, to wysłanie faktury nie utworzy UPO czy jak? Bo przecież UPO pobiera się bez logowania z anonimowego.

0

Gdzie są sample body z requestów? Natknąłem się gdzieś wcześniej na nie i nie zapisałem sobie i teraz szukam...
screenshot-20230817115342.png

0

Czy mógłbym prosić o podpowiedź jak sprawdzić jakie uprawnienia przypisał właściciel konta do tokenu? Biuro rachunkowe otrzymuje tokeny z firm którym prowadzi księgowość. Przed zapisaniem tokenu do bazy chciałbym sprawdzić, czy token jest uprawniony do pobierania faktur? Oczywiście gdy wołam Session/InitToken dostaję exception z brakiem autoryzacji jeśli token jest niepoprawny, albo z innej firmy, ale to trochę za mało no i opis błędu nie niesie żadnej informacji.

0 użytkowników online, w tym zalogowanych: 0, gości: 0