Closed PongraczIstvan closed 1 year ago
Kedves @PongraczIstvan
Éppen válaszolni akartam de látom zártad az Issue-t. Mi volt a problémára a megoldás?
Kedves @renced42 !
Kedves @PongraczIstvan
Éppen válaszolni akartam de látom zártad az Issue-t. Mi volt a problémára a megoldás?
Sajnos még nem sikerült megoldani ezt a gondot, de eszembe jutott még egy két dolog, amit ki akartam próbálni.
Eddig a Delphi TRest osztályát használtam Api-k lekérdezéshez, de az sajnos nem támogatja - vagy eddig nem jöttem rá hogyan - a bineáris adatokat. Szóval a response üresen jött vissza, mert mindenáron kódolni akart :( Így néznem kellett valami "kütyüt", ami támogatja ezt a lekérdezést. Ezért kezdetem most használni Chilkat.dll-t. Ebben - első ránézésre minden megvan, ami kell ehhez a projecthez (és ki tudja mit hoz az eAFA ;) ). Természetesen mivel most használom először ezt a dll-t, így nincs tapasztalatom, hogy mennyire megbízható.
Ez minden gond nélkül kezeli a multipart válaszokat. A XML-t pontosan visszakapom, így az a feltevésem, hogy a bináris adatrészeket is pontosan megkapom.
Első körben chilkat zip tömörítőjét próbáltam használni, mintha egy zip file-t olvasnék fel, de akkor azt a hibát kapom, amit már először is leírtam. Ha a ZipEntry-be (ez a zip file-on belül egy file-nak fele meg ) próbálom beolvasni szintén hibát kapok :(
Második körben arra gondoltam, hogy kapott adatok kicsomagolásához, használom az online számla esetén már bevált módszert:
function Unzip(const zipped: string): string;
var
DecompressionStream: TDecompressionStream;
Compressed: TBytesStream;
Decompressed: TStringStream;
begin
// Compressed := TBytesStream.Create(DecodeBase64(AnsiString(zipped)));
Compressed :=
TBytesStream.Create(TNetEncoding.Base64.DecodeStringToBytes(AnsiString(zipped)));
// TNetEncoding.Base64.DecodeStringToBytes(n.ChildNodes['invoiceData'].Text
try
// window bits set to 15 + 16 for gzip
DecompressionStream := TDecompressionStream.Create(Compressed, 15 + 16);
try
Decompressed := TStringStream.Create('', TEncoding.UTF8);
try
Decompressed.LoadFromStream(DecompressionStream);
Result := Decompressed.DataString;
finally
Decompressed.Free;
end;
finally
DecompressionStream.Free;
end;
finally
Compressed.Free;
end;
end;
Természetesen annyi módosítással, hogy itt nem Base64-es adatokat kell feldolgozni:
function Unzip2(const zipped: HCKbyteData): string;
var
DecompressionStream: TDecompressionStream;
Compressed: TBytesStream;
Decompressed: TMemoryStream;
begin
Compressed := TbytesStream.create();
Compressed.writeData(CkByteData_getData(zipped),CkByteData_getSize(zipped));
//Compressed.Position:=0;
ShowMessage('átadott byte '+inttostr(Compressed.Size));
try
// window bits set to 15 + 16 for gzip
DecompressionStream := TDecompressionStream.Create(Compressed , 31);
Decompressed:=TMemoryStream.create();
Decompressed.LoadFromStream(DecompressionStream);
deCompressed.SaveTofile('c:\delphi_test\test.p7b');
decompressed.free;
finally
DecompressionStream.Free;
Compressed.Free;
end;
end;
Itt ugyan nem kapok hibát, de a DecompressionStream-ben csak 0-ák szerepelnek :(
Harmadik lépésben megpróbáltam írni egy teszt progit Nodejs-ben, a beépített zip könyvtárat használva:
const zlib = require('zlib');
const fs = require('fs');
const inputFile = fs.createReadStream('teszt2.zip');
const outputFile = fs.createWriteStream('teszt.p7b');
inputFile.pipe(zlib.createUnzip()).pipe(outputFile);
ekkor a következőt kaptam: errno: -3, code: 'Z_DATA_ERROR'
Ha a Nodejs-sel csinálok egy teszt, zippelt állományt azt vissza tudom olvasni. Igaz a windows ugyanazt a hibát dobja, de winrar szépen felolvassa és ki is csomagolja...
Az eredeti problémára visszatérve, az az érzésem, hogy nem kapom meg a teljes bináris kódot esetleg hibásan. Sajnos az XML-ban csak a file neve szerepel, sem egy crc kód, sem egy byte-hossz nincs ...
Szóval ennyi... itt tartok most ... :( Ha bármi ötleted van azt nagyon szépen megköszönöm!
Kedves @renced42 !
Hogy a lehetséges hibákat kiszűrjem letöltöttem a sample könyvtárból a queryCashRegisterFileDataResponse.data és a queryCashRegisterFileDataResponse2.data file-okat. Az ezekben található adatokat minden gond nélkül fel tudtam dolgozni. A generált zip file-okat mind a windows, mind a winrar szépen fel tudta olvasni, tudta kezelni.
Sajnos az általam lekért cég adatainál továbbra is fennáll a kezdeti hiba. :(
Kedves @renced42!
Én is a QueryCashRegisterFileDataResponse
feldolgozásán dolgozom.
------=_Part_10220_1432721102.1676293389926
Content-Type: application/octet-stream
Content-ID: <f85ddcd9-d08e-4026-926a-0a16c4a0698e@schemas.nav.gov.hu>
Content-Transfer-Encoding: binary
PKL>V)A87654321_12345678_20230130013620_531.p7b\x9dZm\x8c\Wy\xce\xda&4\xb7%\xad@\xa0\x8ed\xacU\xdb\xcc\xee\xf9\xfeX\xaeoz\xee\xf9\xf0\xaewwv\xbd3\xde\xc4[w\xb3;\x8e\x9d]\xe3\xdd8\x8e\x91&\xc4\xaa\xd2B%@rDK+
.....
\xd5\xb7/\xfe\xe9}\xe3o\xbes\xf5\xef^\xa5\x9f\xfb`\xb9\xf2\x83\xd7^\xff\xd1\xbf\xbe"|\xc3\xfd\xd9\xf8\xd2\xd4\xffPK=\xfb\x93\xe3\xf3K%PKL>V=\xfb\x93\xe3\xf3K%)A87654321_12345678_20230130013620_531.p7bPKWJ
------=_Part_10220_1432721102.1676293389926
A leírás alapján "A pénztárgép által beküldött naplóállomány GZIP által tömörített formában." azonban nekem a "PKL>
" kezdetű és "PKWJ
" végű tartalomra azt írja hogy nem zippelt tartalom.
Kedves renced42 és erikapapp!
Én is hasonló problémával küzdök. A választ a curl lementi egy fájlba, de nem sikerül helyesen kivágni belőle a zip állomány részét. Talán nem jól határozzuk meg az állomány elejét vagy a végét?
Köszönöm, Győző
Kedves @erikapapp @Gyozke @PongraczIstvan
A napló file-ok ZIP-elve vannak a legjobb tudomásom szerint. (Korábban a Speciben valóban GZIP szerepelt helytelenül, de ez javítva lett). A teszt rendszerben nem boldogultok?
Kedves @renced42 !
A sample-ben megadott response állományok formátuma nem egyezik meg a most visszakapott formátummal? (Mert akkor korán örültem a félsikernek, amit előzőleg írtam ;) )
Esetleg a teszt rendszerben más algoritmus dolgozik?
Én az élest használom ...
A gondom a response.xml-ből történő kivágással van. Melyik pozíciótol kezdődik és hol fejeződik be a zip állomány?
Én a hex editor neoval próbálkoztam, és azzal skerült az éles állományból kivágnom a zip fájlt, ami működik.
... és mi volt a titok? Nekem sajna még mindig nem megy:( A sample állománnyal tökéletes, a letöltött élessel nem.
A hex editor neoval kimásoltam a PK-val kezdődő részt egészen az elválasztó részt jelőlő kötőjelig. A kijelőlés a P-betűvel kezdődik, a vége pedig az első kötőjelet megelőző byte-ig tart. Ezt kimásolva az éles rendszerből kapott válaszból is helyes zip fájl képződik. Más kérdés ennek a kódolása...
Hol található specifikációt az AEE xml állományhoz?
https://net.jogtar.hu/jogszabaly?docid=a1300048.ngm 4. melléklet
... és igen! Sikerült levarázsolni nekem is a zip file-t. A MIME konverter viccelt meg, mert összevissza kódolta a bináris adatokat is :)
A p7b file-ok validálása sikerült valakinek? Nekem azt írja ki, hogy :
Cannot find the signing certificate
A p7b file-ok validálása sikerült valakinek? Azt nem fogod tudni validálni, mert nincs meg nálad az az infó.
Milyen infóra gondolsz? A digitális aláírásnak az a lényege, hogy tartalmazza a hash visszakódolásához szükséges public kódot. Ha ez nincs meg vagy a tanúsítvány kiállítója nem megbízható (azonosítható), akkor az nem aláírás, hisz pont a dolog lényege vész el! Úgy gondolom, hogy ezt a lekérdezést olyanok fogják használni, akik valamely' könyvelő szoftverbe akarják automatikusan betölteni az adatokat, de ha nem lehet hitelesnek elfogadni ...
A dokumentációban a következő módon szerepel a kapott file-ok formátuma:
"A P7B állományok tömörített formában kerülnek továbbításra, a naplóállományok méretétől függetlenül. A tömörítés ZIP formátumban történik."
A lekérdezett adatok - hexaeditorba betöltve - valóban ZIP állománynak tűnnek, de ha ezeket lementem file-ba, akkor megnyitáskor a következő hibát kapom (több programmal is kipróbáltam):
"Az archívum ismeretlen vagy sérült"
Programkódban - Chilkat dll-t használva - szintén sikertelen a megnyitás:
Mi lehet a gond?