Sample code for 30+ languages & platforms
Delphi DLL Requires Chilkat v11.0.0+

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
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);