Sample code for 30+ languages & platforms
Delphi DLL

Hungary NAV Query Taxpayer

See more Hungary NAV Invoicing Examples

Demonstrates the queryTaxpayer request for the Hungarian NAV Online Invoicing System REST API v2.0.

Chilkat Delphi DLL Downloads

Delphi DLL
uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Http, CkDateTime, Prng, HttpResponse, StringBuilder, Xml, Crypt2;

...

procedure TForm1.Button1Click(Sender: TObject);
var
success: Boolean;
crypt: HCkCrypt2;
dtNow: HCkDateTime;
myPassword: PWideChar;
passwordHash: PWideChar;
prng: HCkPrng;
sbRequestId: HCkStringBuilder;
signatureKey: PWideChar;
sbFinalHashBase: HCkStringBuilder;
numReplaced: Integer;
requestSignature: PWideChar;
xml: HCkXml;
http: HCkHttp;
endpoint: PWideChar;
resp: HCkHttpResponse;
respXml: HCkXml;
QueryTaxpayerResponse_xmlns: PWideChar;
QueryTaxpayerResponse_xmlns_ns2: PWideChar;
requestId: PWideChar;
timestamp: PWideChar;
requestVersion: PWideChar;
headerVersion: PWideChar;
funcCode: PWideChar;
softwareId: PWideChar;
softwareName: PWideChar;
softwareOperation: PWideChar;
softwareMainVersion: PWideChar;
softwareDevName: PWideChar;
softwareDevContact: PWideChar;
softwareDevCountryCode: PWideChar;
softwareDevTaxNumber: PWideChar;
infoDate: PWideChar;
taxpayerValidity: PWideChar;
taxpayerName: PWideChar;
ns2_taxpayerId: Integer;
ns2_vatCode: Integer;
taxpayerAddressType: PWideChar;
ns2_countryCode: PWideChar;
ns2_postalCode: Integer;
ns2_city: PWideChar;
ns2_streetName: PWideChar;
ns2_publicPlaceCategory: PWideChar;
ns2_number: Integer;

begin
success := False;

// This example assumes the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.

// Build the following XML:

// <?xml version="1.0" encoding="UTF-8"?>
// <QueryTaxpayerRequest xmlns="http://schemas.nav.gov.hu/OSA/2.0/api">
// 	<header>
// 		<requestId>RID215118906689</requestId>
// 		<timestamp>2019-09-11T11:11:08.579Z</timestamp>
// 		<requestVersion>2.0</requestVersion>
// 		<headerVersion>1.0</headerVersion>
// 	</header>
// 	<user>
// 		<login>lwilsmn0uqdxe6u</login>
// 		<passwordHash>2F43840A882CFDB7DB0FEC07D419D030D864B47B6B541DC280EF81B937B7A176E33C052B0D26638CC18A7A2C08D8D311733078A774BF43F6CA57FE8CD74DC28E</passwordHash>
// 		<taxNumber>11111111</taxNumber>
// 		<requestSignature>C5ADE8A2231C509D2887E6C2C4406CC5F72CA25B070AD3E94FADFA3F91A8A3667AF882DEDC7D67E9086E3D34A95886E929ACD8C924CD1E8357C89BEF43BA9126</requestSignature>
// 	</user>
// 	<software>
// 		<softwareId>123456789123456789</softwareId>
// 		<softwareName>string</softwareName>
// 		<softwareOperation>LOCAL_SOFTWARE</softwareOperation>
// 		<softwareMainVersion>string</softwareMainVersion>
// 		<softwareDevName>string</softwareDevName>
// 		<softwareDevContact>string</softwareDevContact>
// 		<softwareDevCountryCode>HU</softwareDevCountryCode>
// 		<softwareDevTaxNumber>string</softwareDevTaxNumber>
// 	</software>
// 	<taxNumber>22222222</taxNumber>
// </QueryTaxpayerRequest>

crypt := CkCrypt2_Create();

dtNow := CkDateTime_Create();
CkDateTime_SetFromCurrentSystemTime(dtNow);
Memo1.Lines.Add(CkDateTime__getAsTimestamp(dtNow,False));

// The hash algorithm for the password is SHA512 (not SHA3-512).
CkCrypt2_putHashAlgorithm(crypt,'sha512');
CkCrypt2_putEncodingMode(crypt,'hex');
myPassword := 'my-password';
passwordHash := CkCrypt2__hashStringENC(crypt,myPassword);

// Generate a random request ID like "RID215118906689"
prng := CkPrng_Create();
sbRequestId := CkStringBuilder_Create();
CkStringBuilder_Append(sbRequestId,'RID');
CkStringBuilder_Append(sbRequestId,CkPrng__randomString(prng,12,True,False,False));
Memo1.Lines.Add('generated requestId = ' + CkStringBuilder__getAsString(sbRequestId));

// Calculate the requestSignature
CkCrypt2_putHashAlgorithm(crypt,'sha3-512');
signatureKey := 'ce-8f5e-215119fa7dd621DLMRHRLH2S';

sbFinalHashBase := CkStringBuilder_Create();

// First append the timestamp because we are going to remove certain chars/parts.
CkStringBuilder_Append(sbFinalHashBase,CkDateTime__getAsTimestamp(dtNow,False));
numReplaced := CkStringBuilder_Replace(sbFinalHashBase,'Z','');
numReplaced := CkStringBuilder_Replace(sbFinalHashBase,'-','');
numReplaced := CkStringBuilder_Replace(sbFinalHashBase,':','');
numReplaced := CkStringBuilder_Replace(sbFinalHashBase,'T','');

// Prepend the requestId and append the signatureKey
CkStringBuilder_Prepend(sbFinalHashBase,CkStringBuilder__getAsString(sbRequestId));
CkStringBuilder_Append(sbFinalHashBase,signatureKey);

requestSignature := CkCrypt2__hashStringENC(crypt,CkStringBuilder__getAsString(sbFinalHashBase));

xml := CkXml_Create();
CkXml_putTag(xml,'QueryTaxpayerRequest');
CkXml_AddAttribute(xml,'xmlns','http://schemas.nav.gov.hu/OSA/2.0/api');
CkXml_UpdateChildContent(xml,'header|requestId',CkStringBuilder__getAsString(sbRequestId));
CkXml_UpdateChildContent(xml,'header|timestamp',CkDateTime__getAsTimestamp(dtNow,False));
CkXml_UpdateChildContent(xml,'header|requestVersion','2.0');
CkXml_UpdateChildContent(xml,'header|headerVersion','1.0');
CkXml_UpdateChildContent(xml,'user|login','lwilsmn0uqdxe6u');
CkXml_UpdateChildContent(xml,'user|passwordHash',passwordHash);
CkXml_UpdateChildContent(xml,'user|taxNumber','11111111');
CkXml_UpdateChildContent(xml,'user|requestSignature',requestSignature);
CkXml_UpdateChildContent(xml,'software|softwareId','123456789123456789');
CkXml_UpdateChildContent(xml,'software|softwareName','string');
CkXml_UpdateChildContent(xml,'software|softwareOperation','LOCAL_SOFTWARE');
CkXml_UpdateChildContent(xml,'software|softwareMainVersion','string');
CkXml_UpdateChildContent(xml,'software|softwareDevName','string');
CkXml_UpdateChildContent(xml,'software|softwareDevContact','string');
CkXml_UpdateChildContent(xml,'software|softwareDevCountryCode','HU');
CkXml_UpdateChildContent(xml,'software|softwareDevTaxNumber','string');
CkXml_UpdateChildContent(xml,'taxNumber','22222222');

// POST the XML to https://api-test.onlineszamla.nav.gov.hu/invoiceService/v2/queryTaxpayer
http := CkHttp_Create();
CkHttp_putAccept(http,'application/xml');
endpoint := 'https://api-test.onlineszamla.nav.gov.hu/invoiceService/v2/queryTaxpayer';
resp := CkHttpResponse_Create();
success := CkHttp_HttpStr(http,'POST',endpoint,CkXml__getXml(xml),'utf-8','application/xml',resp);
if (success = False) then
  begin
    Memo1.Lines.Add(CkHttp__lastErrorText(http));
    Exit;
  end;

Memo1.Lines.Add('Response status code = ' + IntToStr(CkHttpResponse_getStatusCode(resp)));

respXml := CkXml_Create();
CkXml_LoadXml(respXml,CkHttpResponse__bodyStr(resp));
Memo1.Lines.Add('Response body:');
Memo1.Lines.Add(CkXml__getXml(respXml));

// The result looks like this:

// <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
// <QueryTaxpayerResponse xmlns="http://schemas.nav.gov.hu/OSA/2.0/api" xmlns:ns2="http://schemas.nav.gov.hu/OSA/2.0/data">
//     <header>
//         <requestId>RID847153193061</requestId>
//         <timestamp>2020-03-24T16:00:34Z</timestamp>
//         <requestVersion>2.0</requestVersion>
//         <headerVersion>1.0</headerVersion>
//     </header>
//     <result>
//         <funcCode>OK</funcCode>
//     </result>
//     <software>
//         <softwareId>123456789123456789</softwareId>
//         <softwareName>string</softwareName>
//         <softwareOperation>LOCAL_SOFTWARE</softwareOperation>
//         <softwareMainVersion>string</softwareMainVersion>
//         <softwareDevName>string</softwareDevName>
//         <softwareDevContact>string</softwareDevContact>
//         <softwareDevCountryCode>HU</softwareDevCountryCode>
//         <softwareDevTaxNumber>string</softwareDevTaxNumber>
//     </software>
//     <infoDate>1993-01-01T00:00:00.000+01:00</infoDate>
//     <taxpayerValidity>true</taxpayerValidity>
//     <taxpayerData>
//         <taxpayerName>some taxpayer name</taxpayerName>
//         <taxNumberDetail>
//             <ns2:taxpayerId>22222222</ns2:taxpayerId>
//             <ns2:vatCode>2</ns2:vatCode>
//         </taxNumberDetail>
//         <taxpayerAddressList>
//             <taxpayerAddressItem>
//                 <taxpayerAddressType>HQ</taxpayerAddressType>
//                 <taxpayerAddress>
//                     <ns2:countryCode>HU</ns2:countryCode>
//                     <ns2:postalCode>1121</ns2:postalCode>
//                     <ns2:city>BUDAPEST 12</ns2:city>
//                     <ns2:streetName>ABCD</ns2:streetName>
//                     <ns2:publicPlaceCategory>UTCA</ns2:publicPlaceCategory>
//                     <ns2:number>20</ns2:number>
//                 </taxpayerAddress>
//             </taxpayerAddressItem>
//         </taxpayerAddressList>
//     </taxpayerData>
// </QueryTaxpayerResponse>

// Use this online tool to generate parsing code from sample XML: 
// Generate Parsing Code from XML

QueryTaxpayerResponse_xmlns := CkXml__getAttrValue(respXml,'xmlns');
QueryTaxpayerResponse_xmlns_ns2 := CkXml__getAttrValue(respXml,'xmlns:ns2');
requestId := CkXml__getChildContent(respXml,'header|requestId');
timestamp := CkXml__getChildContent(respXml,'header|timestamp');
requestVersion := CkXml__getChildContent(respXml,'header|requestVersion');
headerVersion := CkXml__getChildContent(respXml,'header|headerVersion');
funcCode := CkXml__getChildContent(respXml,'result|funcCode');
softwareId := CkXml__getChildContent(respXml,'software|softwareId');
softwareName := CkXml__getChildContent(respXml,'software|softwareName');
softwareOperation := CkXml__getChildContent(respXml,'software|softwareOperation');
softwareMainVersion := CkXml__getChildContent(respXml,'software|softwareMainVersion');
softwareDevName := CkXml__getChildContent(respXml,'software|softwareDevName');
softwareDevContact := CkXml__getChildContent(respXml,'software|softwareDevContact');
softwareDevCountryCode := CkXml__getChildContent(respXml,'software|softwareDevCountryCode');
softwareDevTaxNumber := CkXml__getChildContent(respXml,'software|softwareDevTaxNumber');
infoDate := CkXml__getChildContent(respXml,'infoDate');
taxpayerValidity := CkXml__getChildContent(respXml,'taxpayerValidity');
taxpayerName := CkXml__getChildContent(respXml,'taxpayerData|taxpayerName');
ns2_taxpayerId := CkXml_GetChildIntValue(respXml,'taxpayerData|taxNumberDetail|ns2:taxpayerId');
ns2_vatCode := CkXml_GetChildIntValue(respXml,'taxpayerData|taxNumberDetail|ns2:vatCode');
taxpayerAddressType := CkXml__getChildContent(respXml,'taxpayerData|taxpayerAddressList|taxpayerAddressItem|taxpayerAddressType');
ns2_countryCode := CkXml__getChildContent(respXml,'taxpayerData|taxpayerAddressList|taxpayerAddressItem|taxpayerAddress|ns2:countryCode');
ns2_postalCode := CkXml_GetChildIntValue(respXml,'taxpayerData|taxpayerAddressList|taxpayerAddressItem|taxpayerAddress|ns2:postalCode');
ns2_city := CkXml__getChildContent(respXml,'taxpayerData|taxpayerAddressList|taxpayerAddressItem|taxpayerAddress|ns2:city');
ns2_streetName := CkXml__getChildContent(respXml,'taxpayerData|taxpayerAddressList|taxpayerAddressItem|taxpayerAddress|ns2:streetName');
ns2_publicPlaceCategory := CkXml__getChildContent(respXml,'taxpayerData|taxpayerAddressList|taxpayerAddressItem|taxpayerAddress|ns2:publicPlaceCategory');
ns2_number := CkXml_GetChildIntValue(respXml,'taxpayerData|taxpayerAddressList|taxpayerAddressItem|taxpayerAddress|ns2:number');

CkCrypt2_Dispose(crypt);
CkDateTime_Dispose(dtNow);
CkPrng_Dispose(prng);
CkStringBuilder_Dispose(sbRequestId);
CkStringBuilder_Dispose(sbFinalHashBase);
CkXml_Dispose(xml);
CkHttp_Dispose(http);
CkHttpResponse_Dispose(resp);
CkXml_Dispose(respXml);

end;