Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

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 Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.Http,
  Chilkat.StringBuilder,
  Chilkat.HttpResponse,
  Chilkat.Pem,
  Chilkat.JsonObject;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  otp: string;
  pem: TPem;
  sbCsrBase64: TStringBuilder;
  numReplaced: Integer;
  csrBase64: string;
  json: TJsonObject;
  http: THttp;
  resp: THttpResponse;
  jsonResp: TJsonObject;

begin
  success := False;

  //  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 := '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 := TPem.Create;
  success := pem.LoadPemFile('c:/aaworkarea/zatca/onboarding/taxpayer.csr','');
  if (success = False) then
    begin
      WriteLn(pem.LastErrorText);
      Exit;
    end;

  //  Get the base64 from the CSR in a single line.
  sbCsrBase64 := TStringBuilder.Create;
  sbCsrBase64.Append(pem.GetEncodedItem('csr','','base64',0));
  numReplaced := sbCsrBase64.Replace(#13,'');
  numReplaced := sbCsrBase64.Replace(#10,'');
  csrBase64 := sbCsrBase64.GetAsString();
  WriteLn(csrBase64);

  json := TJsonObject.Create;
  json.EmitCompact := False;
  json.UpdateSb('csr',sbCsrBase64);

  http := THttp.Create;
  http.Accept := 'application/json';
  http.SetRequestHeader('OTP',otp);
  http.SetRequestHeader('Accept-Version','V2');
  resp := THttpResponse.Create;
  success := http.HttpJson('POST','https://gw-apic-gov.gazt.gov.sa/e-invoicing/core/compliance',json,'application/json',resp);
  if (success = False) then
    begin
      WriteLn(http.LastErrorText);
      Exit;
    end;

  if (resp.StatusCode <> 200) then
    begin
      WriteLn(resp.BodyStr);
      WriteLn('response status code = ' + resp.StatusCode);
      WriteLn('Failed');
      Exit;
    end;

  jsonResp := TJsonObject.Create;
  resp.GetBodyJson(jsonResp);

  jsonResp.EmitCompact := False;
  WriteLn('JSON response:');
  WriteLn(jsonResp.Emit());


  pem.Free;
  sbCsrBase64.Free;
  json.Free;
  http.Free;
  resp.Free;
  jsonResp.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.