Sample code for 30+ languages & platforms
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

PureBasic
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