Krajowy system e-Faktur

0

Koledzy, powiedzcie mi, czy wy te XMLe generujecie po protu tekstem, czy przez Delphiowy XML Data Binding? Bo z tymi namespacami to jest jakaś porażka.

A druga rzecz - ten ich klucz PEM... SecureBlackbox w ogóle tego formatu nie odczytuje (nie czyta tych z nagłówkiem ------BEGIN PUBLIC KEY-----). O dziwo, przy eDeklaracjach jest format umożliwiający przeprowadzenie szyfrowania (-----BEGIN CERTIFICATE-----)

1

@Stl86: Ja sobie chwalę pakiet z ElDos - cieżko się obyć bez niego przy tych rządowych systemach. Podpisywanie wygląda tak:

function SignXML(const aXMLStream: TStringStream): Boolean;
var
	Signer: TElXMLSigner;
	ElXMLDoc: TElXMLDOMDocument;
	Refs: TElXMLReferenceList;
	Ref: TElXMLReference;
	X509KeyData: TElXMLKeyInfoX509Data;
	//XMLObject: TElXMLObject;
	XAdESSigner: TElXAdESSigner;
	CertStorage: TElMemoryCertStorage;
	SigNode: TElXMLDOMNode;
begin
	Result := False;

	Signer := TElXMLSigner.Create(nil);
	ElXMLDoc := TElXMLDOMDocument.Create;
	Refs := TElXMLReferenceList.Create;
	Ref := TElXMLReference.Create;
	X509KeyData := TElXMLKeyInfoX509Data.Create(False);
	//XMLObject := TElXMLObject.Create;
	XAdESSigner := TElXAdESSigner.Create(nil);
	CertStorage := TElMemoryCertStorage.Create(nil);

	try
		aXMLStream.Seek(0, soFromBeginning);
		ElXMLDoc.LoadFromStream(aXMLStream);

		Ref.URINode := ElXMLDoc.DocumentElement;
		Ref.URI := ''{Ref.URINode.LocalName};
		Ref.DigestMethod := xdmSHA256;//xdmSHA1;
		Ref.TransformChain.Add(TElXMLEnvelopedSignatureTransform.Create);
		Refs.Add(Ref);

		CertStorage.Add(fCert, False);

		X509KeyData.Certificate := fCert;
		X509KeyData.IncludeKeyValue := False;

		XAdESSigner.XAdESVersion := XAdES_v1_3_2;
		XAdESSigner.SigningCertificates := CertStorage;


		Signer.SignatureType := xstEnveloped;
		Signer.SignatureMethodType := xmtSig;
		Signer.SignatureCompliance := xscDSIG;

		Signer.CanonicalizationMethod := xcmCanon;
		Signer.SignatureMethod  := xsmRSA_SHA256;
		//Signer.MACMethod := xmmHMAC_SHA1;

		Signer.KeyName    :='';
		Signer.IncludeKey := True;
		//Signer.OnFormatElement := Self.XMLSignerFormatElement;
		Signer.KeyData := X509KeyData;
		Signer.XAdESProcessor := XAdESSigner;
		Signer.References := Refs;

		try
			XAdESSigner.Generate;
			XAdESSigner.QualifyingProperties.SignedProperties.SignedSignatureProperties.SignaturePolicyIdentifier.SignaturePolicyImplied := False;

			XAdESSigner.QualifyingProperties.XAdESPrefix := 'xades';
			XAdESSigner.QualifyingProperties.Target := '#Signature-0';

			Signer.UpdateReferencesDigest;

			Signer.GenerateSignature;

			SigNode := ElXMLDoc.DocumentElement;
			Signer.Save(SigNode);

			aXMLStream.Clear;
			ElXMLDoc.SaveToStream(aXMLStream);

			Result := True;
		except
			raise;
		end;
	finally
		Signer.Free;
		ElXMLDoc.Free;
		Refs.Free;
		X509KeyData.Free;
		XAdESSigner.Free;
		CertStorage.Free;
	end;
end;

PS. fCert: TElX509Certificate pobierany np. z TElWinCertStorage

0

Cześć
Ostanio, przy wyzwaniu autoryzacyjny zaczął mi wyskakiwać błąd:

{
   "exception":{
      "serviceCtx":"srvTEMFC",
      "serviceCode":"20220209-EX-8E3C88B256-59E29BCCA2-33",
      "serviceName":"online.session.authorisation.challenge",
      "timestamp":"2022-02-09T21:42:07.252Z",
      "referenceNumber":null,
      "exceptionDetailList":[
         {
            "exceptionCode":21003,
            "exceptionDescription":"Limit żądań osiągnięty."
         }
      ]
   }
}

Spotkaliście się z tym? Wprowadzili limit sesji na NIP? Jak zwykle w dokumentacji nic nie widzę na ten temat. Na produkcji też będzie jakiś limit? W sumie pewnie powinien być tylko jaki ustalili? Czy to jest jedna czy dziesięć czy sto niezamkniętych sesji..

0

Od 2 dni mam [{"exceptionCode":21233,"exceptionDescription":"Faktura o podanym identyfikatorze nie istnieje."} po wysłaniu faktury i odebraniu elementReferenceNumber.
Wywołanie
.../api/online/Invoice/Status/20220209-EE-8F249D917C-451FE557A1-48
O co chodzi?

0

Hej,
Jak rozumiecie ten zapis:
Zamówienie w fakturach korygujących faktury zaliczkowe prezentowane są w sposób uniwersalny poprzez stornowanie wierszy i podawanie poprawnej wartości pozycji w kolejnym wierszu. Dopuszczalny jest także alternatywny sposób korekty poprzez prezentacje jednym zapisem przez różnicę.
Macie jakiś przykład XML-a dla alternatywnego sposobu?

0

Co jeszcze nie tak jest? Robię Challenga, dostaję czas i kod. Wpisuje do InitSigned, podpisuję, dostaję token. Wpisuję do InitToken wraz z Challangem i identyfikatorem i... sekcją Encryption? Bo w przykładach jest, na Webdinarze nie ma, dokumentacja nic nie mówi... Niemniej, jakbym nie zrobił, to dostaję "Nieprawidłowe wyzwanie autoryzacyjne". Oczywiście Token to zaszyfrowana wartość z token|czas_challanga_w_ms.
Coś z tym szyfrowanym tokenem nie tak? O co może chodzić?
(W załączniku pełne żądania od początku)
KSeF.zip
A swoją drogą to grubo pojechali z tymi limitami na testach... Ile to w ciągu godziny wychodzi? 10 sesji? Jak tu cokolwiek pisać i testować?!

0

Dzień dobry, być może będzie to trywialne pytanie, ale w jaki sposób należy przetworzyć fakturę, żeby można było ją wysłać? Z pliku .xsd mam klasy dotyczące faktury - super, taką fakturę mogę zserializować i chciałbym ją wysłać do api, ale nie wiem jak ją umieścić. Do api posiadam klasy wygenerowane swaggerem, ale w klasie SendInvoiceRequest nie znajduję miejsca na dodanie Faktury, są jedynie parametry typu InvoicePayloadType, HashSHAType, fileSize itd.
W jaki sposób mogę przejść z obiektu typu Faktura na gotowy obiekt do wysłania do api? Wprawdzie piszę w C#, ale jeśli by ktoś przedstawił koncept w dowolnym innym języku to powinno być to wystarczająco pomocne

0

Utworzyłem token z przyznanymi rolami: (Token bez ról faktur (odczyt/zapis) nie może zainicjować sesji?)

{
	"generateToken": {
		"description": "token_to_grant_acess",
		"credentialsRoleList": [{
				"roleType": "credentials_read",
				"roleDescription": "read others credentials"
			},
			{
				"roleType": "credentials_manage",
				"roleDescription": "read others credentials"
			},
			{
				"roleType": "invoice_write",
				"roleDescription": "write invoices"
			}
		]
	}
}

Na podstawie dokumentacji z tymi rolami poświadczeń będę mógł przyznać dostęp do numeru NIP, a z wystawcą faktury mogę przyznać rolę samofakturowania. Ale kiedy próbuję przyznać dostęp przy otwartej sesji tokena, otrzymuję:

{
  "exception": {
    "serviceCtx": "srvTEMFB",
    "serviceCode": "20220211-EX-D8FBCB8C33-08E3BE30FE-6A",
    "serviceName": "online.credentials.credentials.grant",
    "timestamp": "2022-02-11T15:58:16.392Z",
    "referenceNumber": null,
    "exceptionDetailList": [
      {
        "exceptionCode": 21101,
        "exceptionDescription": "Brak autoryzacji."
      }
    ]
  }
}

Gdy próbuję przyznać dostęp właścicielowi tokena, nie ma problemu z autoryzacją. Którego kroku mi brakuje? Token nie może przyznać dostępu do numeru NIP w celu samodzielnego rozliczania? Tylko właściciel tokena może przyznać ten dostęp?

0

Jak rozwiązaliście problem uniknięcia wysyłki duplikatów? Tzn taki scenariusz:

  • wysyłka faktury
  • połączenie zerwane - nie dostajecie odpowiedzi - czyli nie wiadomo czy faktura została wrzucona czy nie, nie mamy numeru ksef

Olewacie temat i wrzucacie ponownie, czy sprawdzacie statusem sesji czy poszła?
Jak to w ogóle wygląda od strony prawnej? KSEF wyłapuje duplikaty? Czy każda taka faktura nabiera mocy prawnej i jeśli wrzucimy ponownie trzeba wysyłać korektę?

0

Przy wysyłaniu faktury niezaszyfrowanej dostaję błąd o kodzie: 21209, "Sprzeczny typ żądania wysyłki faktury.", spotkał się ktoś z czymś takim?
Body które wysyłam:

{
    "invoiceHash": {
        "fileSize": 1946,
        "hashSHA": {
            "algorithm": "SHA-256",
            "encoding": "Base64",
            "value": "u5KvSwv6bwGrZ4KihQ7507Z3Yp786pR1ESdBkGdEDlE="
        }
    },
    "invoicePayload": {
        "invoiceBody": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxGYWt0dXJhIHhtbG5zOmV0ZD0iaHR0cDovL2NyZC5nb3YucGwveG1sL3NjaGVtYXR5L2R6aWVkemlub3dlL21mLzIwMjEvMDYvMDkvZUQvRGVmaW5pY2plVHlweS8iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zPSJodHRwOi8vY3JkLmdvdi5wbC93em9yLzIwMjEvMTEvMjkvMTEwODkvIj4NCgk8TmFnbG93ZWs+DQoJCTxLb2RGb3JtdWxhcnphIGtvZFN5c3RlbW93eT0iRkEgKDEpIiB3ZXJzamFTY2hlbXk9IjEtMEUiPkZBPC9Lb2RGb3JtdWxhcnphPg0KCQk8V2FyaWFudEZvcm11bGFyemE+MTwvV2FyaWFudEZvcm11bGFyemE+DQoJCTxEYXRhV3l0d29yemVuaWFGYT4yMDIyLTAyLTE0VDExOjAzOjE4LjY0MjYwNDBaPC9EYXRhV3l0d29yemVuaWFGYT4NCgkJPFN5c3RlbUluZm8+U2FtcGxvZmFrdHVyPC9TeXN0ZW1JbmZvPg0KCTwvTmFnbG93ZWs+DQoJPFBvZG1pb3QxPg0KCQk8RGFuZUlkZW50eWZpa2FjeWpuZT4NCgkJCTxOSVA+NTc3MTY4OTA2MDwvTklQPg0KCQkJPFBlbG5hTmF6d2E+QUJDIEFHRCBzcC4geiBvLiBvLjwvUGVsbmFOYXp3YT4NCgkJPC9EYW5lSWRlbnR5ZmlrYWN5am5lPg0KCQk8QWRyZXM+DQoJCSAgIAk8QWRyZXNQb2w+DQoJCQkJPEtvZEtyYWp1PlBMPC9Lb2RLcmFqdT4NCgkJCQk8VWxpY2E+S3dpYXRvd2E8L1VsaWNhPg0KCQkJCTxOckRvbXU+MTwvTnJEb211Pg0KCQkJCTxOckxva2FsdT4yPC9Ockxva2FsdT4NCgkJCQk8TWllanNjb3dvc2M+V2Fyc3phd2E8L01pZWpzY293b3NjPg0KCQkJCTxLb2RQb2N6dG93eT4wMC0wMDE8L0tvZFBvY3p0b3d5Pg0KCQkJPC9BZHJlc1BvbD4NCgkJPC9BZHJlcz4NCgkJPEVtYWlsPmFiY0BhYmMucGw8L0VtYWlsPg0KCQk8VGVsZWZvbj42Njc0NDQ1NTU8L1RlbGVmb24+CQkNCgk8L1BvZG1pb3QxPg0KCTxQb2RtaW90Mj4NCgkJPERhbmVJZGVudHlmaWthY3lqbmU+DQoJCQk8TklQPjQ0NDk5NTU4ODg8L05JUD4NCgkJPC9EYW5lSWRlbnR5ZmlrYWN5am5lPg0KCTwvUG9kbWlvdDI+DQoJPEZhPg0KCQk8S29kV2FsdXR5PlBMTjwvS29kV2FsdXR5Pg0KCQk8UF8xPjIwMjItMDItMTU8L1BfMT4NCgkJPFBfMj5GVjIwMjIvMDIvMTUwPC9QXzI+DQoJCTxQXzY+MjAyMi0wMS0wMzwvUF82Pg0KCQk8UF8xNT40NTA8L1BfMTU+DQoJCTxBZG5vdGFjamU+DQoJCQk8UF8xNj4yPC9QXzE2Pg0KCQkJPFBfMTc+MjwvUF8xNz4NCgkJCTxQXzE4PjI8L1BfMTg+DQoJCQk8UF8xOEE+MjwvUF8xOEE+DQoJCQk8UF8xOT4yPC9QXzE5Pg0KCQkJPFBfMjI+MjwvUF8yMj4NCgkJCTxQXzIzPjI8L1BfMjM+DQoJCQk8UF9QTWFyenk+MjwvUF9QTWFyenk+DQoJCTwvQWRub3RhY2plPg0KCQk8Um9kemFqRmFrdHVyeT5VUFI8L1JvZHphakZha3R1cnk+DQoJCTxGYVdpZXJzemU+DQoJCQk8TGljemJhV2llcnN6eUZha3R1cnk+MTwvTGljemJhV2llcnN6eUZha3R1cnk+DQoJCQk8V2FydG9zY1dpZXJzenlGYWt0dXJ5MT4wPC9XYXJ0b3NjV2llcnN6eUZha3R1cnkxPg0KCQkJPEZhV2llcnN6Pg0KCQkJCTxOcldpZXJzemFGYT4xPC9OcldpZXJzemFGYT4NCgkJCQk8UF83PndpZXJ0YXJrYSBXaWVydGV4IG1rNTwvUF83Pg0KCQkJCTxQXzEyPjIzPC9QXzEyPg0KCQkJPC9GYVdpZXJzej4NCgkJPC9GYVdpZXJzemU+DQoJPC9GYT4NCgk8U3RvcGthPg0KCQk8SW5mb3JtYWNqZT4NCgkJCTxTdG9wa2FGYWt0dXJ5PkthcGlhxYIgemFrxYJhZG93eSA1IDAwMCAwMDA8L1N0b3BrYUZha3R1cnk+DQoJCTwvSW5mb3JtYWNqZT4NCgkJPFJlamVzdHJ5Pg0KCQkJPEtSUz4wMDAwMDk5OTk5PC9LUlM+DQoJCQk8UkVHT04+OTk5OTk5OTk5PC9SRUdPTj4NCgkJCTxCRE8+MDAwMDk5OTk5PC9CRE8+DQoJCTwvUmVqZXN0cnk+DQoJPC9TdG9wa2E+DQo8L0Zha3R1cmE+DQo=",
        "type": "plain"
    }
}

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