PureBasic
PureBasic
ZATCA Onboarding Get Compliance CSID
See more ZATCA Examples
Demonstrates sending a POST to get a compliance CSID, which is two parts: A binary security token, and a secret.Chilkat PureBasic Downloads
IncludeFile "CkHttpResponse.pb"
IncludeFile "CkHttp.pb"
IncludeFile "CkStringBuilder.pb"
IncludeFile "CkJsonObject.pb"
IncludeFile "CkPem.pb"
Procedure ChilkatExample()
success.i = 0
; This example requires the Chilkat API to have been previously unlocked.
; See Global Unlock Sample for sample code.
; It is assumed you've already generated a CSR.
; Also, you'll need an OTP code, valid for 1 hour, which is generated online in the Fatoora portal. See
; https://zatca.gov.sa/ar/E-Invoicing/Introduction/Guidelines/Documents/E-invoicing%20Detailed%20Technical%20Guidelines.pdf
; Manually replace this with the OTP code you interactively obtained in a browser session from the Fatoora portal.
; The OTP code is valid for 1 hour.
otp.s = "123434"
; You should already have a CSR in a file containing something that looks like this:
; -----BEGIN CERTIFICATE REQUEST-----
; MIIB5DCCAYsCAQAwTDELMAkGA1UEBhMCU0ExFTATBgNVBAsMDFJpeWFkIEJyYW5j
; aDEQMA4GA1UECgwHQ29udG9zbzEUMBIGA1UEAwwLRUExMjM0NTY3ODkwVjAQBgcq
; hkjOPQIBBgUrgQQACgNCAAQI6op+6GQ4Gmn9oy0DpGxX0lFtUIvj+4Jtnp0VyEsH
; +ZO7lpgksbRC484R3fAsO0v+Ly24ZIUIOYEIAeJ1f6AooIHfMIHcBgkqhkiG9w0B
; CQ4xgc4wgcswIQYJKwYBBAGCNxQCBBQTElpBVENBLUNvZGUtU2lnbmluZzCBpQYD
; VR0RBIGdMIGapIGXMIGUMTswOQYDVQQEDDIxLVRTVHwyLVRTVHwzLWVkMjJmMWQ4
; LWU2YTItMTExOC05YjU4LWQ5YThmMTFlNDQ1ZjEfMB0GCgmSJomT8ixkAQEMDzMx
; MDEyMjM5MzUwMDAwMzENMAsGA1UEDAwEMTEwMDESMBAGA1UEGgwJTXlBZGRyZXNz
; MREwDwYDVQQPDAhJbmR1c3RyeTAKBggqhkjOPQQDAgNHADBEAiBurm6KdAeHfXzt
; h/jk8xSMBP4TAkkFrg+hWDhfI0/SuAIgJi8ectM7YwBIBCmf0tdFcVTU7GBbvjnK
; xValZCAO39M=
; -----END CERTIFICATE REQUEST-----
pem.i = CkPem::ckCreate()
If pem.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkPem::ckLoadPemFile(pem,"c:/aaworkarea/zatca/onboarding/taxpayer.csr","")
If success = 0
Debug CkPem::ckLastErrorText(pem)
CkPem::ckDispose(pem)
ProcedureReturn
EndIf
; Get the base64 from the CSR in a single line.
sbCsrBase64.i = CkStringBuilder::ckCreate()
If sbCsrBase64.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkStringBuilder::ckAppend(sbCsrBase64,CkPem::ckGetEncodedItem(pem,"csr","","base64",0))
numReplaced.i = CkStringBuilder::ckReplace(sbCsrBase64,Chr(13),"")
numReplaced = CkStringBuilder::ckReplace(sbCsrBase64,Chr(10),"")
csrBase64.s = CkStringBuilder::ckGetAsString(sbCsrBase64)
Debug csrBase64
json.i = CkJsonObject::ckCreate()
If json.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkJsonObject::setCkEmitCompact(json, 0)
CkJsonObject::ckUpdateSb(json,"csr",sbCsrBase64)
http.i = CkHttp::ckCreate()
If http.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkHttp::setCkAccept(http, "application/json")
CkHttp::ckSetRequestHeader(http,"OTP",otp)
CkHttp::ckSetRequestHeader(http,"Accept-Version","V2")
resp.i = CkHttpResponse::ckCreate()
If resp.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkHttp::ckHttpJson(http,"POST","https://gw-apic-gov.gazt.gov.sa/e-invoicing/core/compliance",json,"application/json",resp)
If success = 0
Debug CkHttp::ckLastErrorText(http)
CkPem::ckDispose(pem)
CkStringBuilder::ckDispose(sbCsrBase64)
CkJsonObject::ckDispose(json)
CkHttp::ckDispose(http)
CkHttpResponse::ckDispose(resp)
ProcedureReturn
EndIf
If CkHttpResponse::ckStatusCode(resp) <> 200
Debug CkHttpResponse::ckBodyStr(resp)
Debug "response status code = " + Str(CkHttpResponse::ckStatusCode(resp))
Debug "Failed"
CkPem::ckDispose(pem)
CkStringBuilder::ckDispose(sbCsrBase64)
CkJsonObject::ckDispose(json)
CkHttp::ckDispose(http)
CkHttpResponse::ckDispose(resp)
ProcedureReturn
EndIf
jsonResp.i = CkJsonObject::ckCreate()
If jsonResp.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkHttpResponse::ckGetBodyJson(resp,jsonResp)
CkJsonObject::setCkEmitCompact(jsonResp, 0)
Debug "JSON response:"
Debug CkJsonObject::ckEmit(jsonResp)
CkPem::ckDispose(pem)
CkStringBuilder::ckDispose(sbCsrBase64)
CkJsonObject::ckDispose(json)
CkHttp::ckDispose(http)
CkHttpResponse::ckDispose(resp)
CkJsonObject::ckDispose(jsonResp)
ProcedureReturn
EndProcedure