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

Hungary NAV Token Exchange

See more Hungary NAV Invoicing Examples

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

Chilkat PowerBuilder Downloads

PowerBuilder
integer li_rc
integer li_Success
oleobject loo_Crypt
oleobject loo_DtNow
string ls_MyPassword
string ls_PasswordHash
oleobject loo_Prng
oleobject loo_SbRequestId
string ls_SignatureKey
oleobject loo_SbFinalHashBase
integer li_NumReplaced
string ls_RequestSignature
oleobject loo_Xml
oleobject loo_Http
string ls_Endpoint
oleobject loo_Resp
oleobject loo_RespXml
string ls_TokenExchangeResponse_xmlns
string ls_TokenExchangeResponse_xmlns_ns2
string ls_RequestId
string ls_Timestamp
string ls_RequestVersion
string ls_HeaderVersion
string ls_FuncCode
string ls_SoftwareId
string ls_SoftwareName
string ls_SoftwareOperation
string ls_SoftwareMainVersion
string ls_SoftwareDevName
string ls_SoftwareDevContact
string ls_SoftwareDevCountryCode
string ls_SoftwareDevTaxNumber
string ls_EncodedExchangeToken
string ls_TokenValidityFrom
string ls_TokenValidityTo

li_Success = 0

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

//  Build the following XML:

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

//  <?xml version="1.0" encoding="UTF-8"?>
//  <TokenExchangeRequest xmlns="http://schemas.nav.gov.hu/OSA/2.0/api">
//  	<header>
//  		<requestId>RID896801578348</requestId>
//  		<timestamp>2019-09-11T10:55:31.440Z</timestamp>
//  		<requestVersion>2.0</requestVersion>
//  		<headerVersion>1.0</headerVersion>
//  	</header>
//  	<user>
//  		<login>lwilsmn0uqdxe6u</login>
//  		<passwordHash>2F43840A882CFDB7DB0FEC07D419D030D864B47B6B541DC280EF81B937B7A176E33C052B0D26638CC18A7A2C08D8D311733078A774BF43F6CA57FE8CD74DC28E</passwordHash>
//  		<taxNumber>11111111</taxNumber>
//  		<requestSignature>B4B5E0F197BFFD3DF69BCC98D3BE775F65FD5445EEF95C9D6B6C59425F2B81C4F6DA1FD563B0C7E7D98AF1E1725E5C63C2803B5D3A93D1C02ED354AC92F2CC94</requestSignature>
//  		<!--<signKey>ac-ac3a-7f661bff7d342N43CYX4U9FG</signKey>-->
//  	</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>
//  </TokenExchangeRequest>

loo_Crypt = create oleobject
li_rc = loo_Crypt.ConnectToNewObject("Chilkat.Crypt2")
if li_rc < 0 then
    destroy loo_Crypt
    MessageBox("Error","Connecting to COM object failed")
    return
end if

loo_DtNow = create oleobject
li_rc = loo_DtNow.ConnectToNewObject("Chilkat.CkDateTime")

loo_DtNow.SetFromCurrentSystemTime()
Write-Debug loo_DtNow.GetAsTimestamp(0)

//  The hash algorithm for the password is SHA512 (not SHA3-512).
loo_Crypt.HashAlgorithm = "sha512"
loo_Crypt.EncodingMode = "hex"
ls_MyPassword = "my-password"
ls_PasswordHash = loo_Crypt.HashStringENC(ls_MyPassword)

//  Generate a random request ID like "RID215118906689"
loo_Prng = create oleobject
li_rc = loo_Prng.ConnectToNewObject("Chilkat.Prng")

loo_SbRequestId = create oleobject
li_rc = loo_SbRequestId.ConnectToNewObject("Chilkat.StringBuilder")

loo_SbRequestId.Append("RID")
loo_SbRequestId.Append(loo_Prng.RandomString(12,1,0,0))
Write-Debug "generated requestId = " + loo_SbRequestId.GetAsString()

//  Calculate the requestSignature
loo_Crypt.HashAlgorithm = "sha3-512"
ls_SignatureKey = "ce-8f5e-215119fa7dd621DLMRHRLH2S"

loo_SbFinalHashBase = create oleobject
li_rc = loo_SbFinalHashBase.ConnectToNewObject("Chilkat.StringBuilder")

//  First append the timestamp because we are going to remove certain chars/parts.
loo_SbFinalHashBase.Append(loo_DtNow.GetAsTimestamp(0))
li_NumReplaced = loo_SbFinalHashBase.Replace("Z","")
li_NumReplaced = loo_SbFinalHashBase.Replace("-","")
li_NumReplaced = loo_SbFinalHashBase.Replace(":","")
li_NumReplaced = loo_SbFinalHashBase.Replace("T","")

//  Prepend the requestId and append the signatureKey
loo_SbFinalHashBase.Prepend(loo_SbRequestId.GetAsString())
loo_SbFinalHashBase.Append(ls_SignatureKey)

ls_RequestSignature = loo_Crypt.HashStringENC(loo_SbFinalHashBase.GetAsString())

loo_Xml = create oleobject
li_rc = loo_Xml.ConnectToNewObject("Chilkat.Xml")

loo_Xml.Tag = "TokenExchangeRequest"
loo_Xml.AddAttribute("xmlns","http://schemas.nav.gov.hu/OSA/2.0/api")
loo_Xml.UpdateChildContent("header|requestId",loo_SbRequestId.GetAsString())
loo_Xml.UpdateChildContent("header|timestamp",loo_DtNow.GetAsTimestamp(0))
loo_Xml.UpdateChildContent("header|requestVersion","2.0")
loo_Xml.UpdateChildContent("header|headerVersion","1.0")
loo_Xml.UpdateChildContent("user|login","lwilsmn0uqdxe6u")
loo_Xml.UpdateChildContent("user|passwordHash",ls_PasswordHash)
loo_Xml.UpdateChildContent("user|taxNumber","11111111")
loo_Xml.UpdateChildContent("user|requestSignature",ls_RequestSignature)
loo_Xml.UpdateChildContent("software|softwareId","123456789123456789")
loo_Xml.UpdateChildContent("software|softwareName","string")
loo_Xml.UpdateChildContent("software|softwareOperation","LOCAL_SOFTWARE")
loo_Xml.UpdateChildContent("software|softwareMainVersion","string")
loo_Xml.UpdateChildContent("software|softwareDevName","string")
loo_Xml.UpdateChildContent("software|softwareDevContact","string")
loo_Xml.UpdateChildContent("software|softwareDevCountryCode","HU")
loo_Xml.UpdateChildContent("software|softwareDevTaxNumber","string")

//  POST the XML to https://api-test.onlineszamla.nav.gov.hu/invoiceService/v2/tokenExchange
loo_Http = create oleobject
li_rc = loo_Http.ConnectToNewObject("Chilkat.Http")

loo_Http.Accept = "application/xml"
ls_Endpoint = "https://api-test.onlineszamla.nav.gov.hu/invoiceService/v2/tokenExchange"
loo_Resp = create oleobject
li_rc = loo_Resp.ConnectToNewObject("Chilkat.HttpResponse")

li_Success = loo_Http.HttpStr("POST",ls_Endpoint,loo_Xml.GetXml(),"utf-8","application/xml",loo_Resp)
if li_Success = 0 then
    Write-Debug loo_Http.LastErrorText
    destroy loo_Crypt
    destroy loo_DtNow
    destroy loo_Prng
    destroy loo_SbRequestId
    destroy loo_SbFinalHashBase
    destroy loo_Xml
    destroy loo_Http
    destroy loo_Resp
    return
end if

Write-Debug "Response status code = " + string(loo_Resp.StatusCode)

loo_RespXml = create oleobject
li_rc = loo_RespXml.ConnectToNewObject("Chilkat.Xml")

loo_RespXml.LoadXml(loo_Resp.BodyStr)
Write-Debug "Response body:"
Write-Debug loo_RespXml.GetXml()

//  Save our exchange token to a file to be used for subsequent requests.
loo_RespXml.SaveXml("qa_data/tokens/nav_exchange_token.xml")

//  The result looks like this:

//  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
//  <TokenExchangeResponse xmlns="http://schemas.nav.gov.hu/OSA/2.0/api" xmlns:ns2="http://schemas.nav.gov.hu/OSA/2.0/data">
//      <header>
//          <requestId>RID789246611489</requestId>
//          <timestamp>2020-03-25T14:14:36Z</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>
//      <encodedExchangeToken>2lR5v57Tl ... 9n4tIWCYgjKQ==</encodedExchangeToken>
//      <tokenValidityFrom>2020-03-25T15:14:36.987+01:00</tokenValidityFrom>
//      <tokenValidityTo>2020-03-25T15:19:36.987+01:00</tokenValidityTo>
//  </TokenExchangeResponse>

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

ls_TokenExchangeResponse_xmlns = loo_RespXml.GetAttrValue("xmlns")
ls_TokenExchangeResponse_xmlns_ns2 = loo_RespXml.GetAttrValue("xmlns:ns2")
ls_RequestId = loo_RespXml.GetChildContent("header|requestId")
ls_Timestamp = loo_RespXml.GetChildContent("header|timestamp")
ls_RequestVersion = loo_RespXml.GetChildContent("header|requestVersion")
ls_HeaderVersion = loo_RespXml.GetChildContent("header|headerVersion")
ls_FuncCode = loo_RespXml.GetChildContent("result|funcCode")
ls_SoftwareId = loo_RespXml.GetChildContent("software|softwareId")
ls_SoftwareName = loo_RespXml.GetChildContent("software|softwareName")
ls_SoftwareOperation = loo_RespXml.GetChildContent("software|softwareOperation")
ls_SoftwareMainVersion = loo_RespXml.GetChildContent("software|softwareMainVersion")
ls_SoftwareDevName = loo_RespXml.GetChildContent("software|softwareDevName")
ls_SoftwareDevContact = loo_RespXml.GetChildContent("software|softwareDevContact")
ls_SoftwareDevCountryCode = loo_RespXml.GetChildContent("software|softwareDevCountryCode")
ls_SoftwareDevTaxNumber = loo_RespXml.GetChildContent("software|softwareDevTaxNumber")
ls_EncodedExchangeToken = loo_RespXml.GetChildContent("encodedExchangeToken")
ls_TokenValidityFrom = loo_RespXml.GetChildContent("tokenValidityFrom")
ls_TokenValidityTo = loo_RespXml.GetChildContent("tokenValidityTo")


destroy loo_Crypt
destroy loo_DtNow
destroy loo_Prng
destroy loo_SbRequestId
destroy loo_SbFinalHashBase
destroy loo_Xml
destroy loo_Http
destroy loo_Resp
destroy loo_RespXml