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

Get E-way Bill System Access Token

See more HTTP Misc Examples

Sends a request to get an E-way bill system access token.

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.PublicKey,
  Chilkat.Prng,
  Chilkat.Crypt2,
  Chilkat.HttpResponse,
  Chilkat.Http,
  Chilkat.JsonObject,
  Chilkat.StringBuilder,
  Chilkat.FileAccess,
  Chilkat.Rsa,
  Chilkat.BinData;

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

procedure RunDemo;
var
  success: Boolean;
  pubkey: TPublicKey;
  password: string;
  rsa: TRsa;
  encPassword: string;
  prng: TPrng;
  app_key: string;
  encAppKey: string;
  jsonBody: TJsonObject;
  http: THttp;
  resp: THttpResponse;
  respStatusCode: Integer;
  json: TJsonObject;
  status: Integer;
  sbError: TStringBuilder;
  authToken: string;
  crypt: TCrypt2;
  bdSek: TBinData;
  jsonEwayAuth: TJsonObject;
  fac: TFileAccess;

begin
  success := False;

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

  //  First load the public key provided by the E-way bill System
  pubkey := TPublicKey.Create;
  success := pubkey.LoadFromFile('qa_data/pem/eway_publickey.pem');
  if (success = False) then
    begin
      WriteLn(pubkey.LastErrorText);
      Exit;
    end;

  //  Encrypt the password using the RSA public key provided by eway..
  password := 'my_wepgst_password';
  rsa := TRsa.Create;
  rsa.Charset := 'utf-8';
  rsa.EncodingMode := 'base64';

  success := rsa.UsePublicKey(pubkey);
  if (success = False) then
    begin
      WriteLn(rsa.LastErrorText);
      Exit;
    end;

  //  Returns the encrypted password as base64 (because the EncodingMode = "base64")
  encPassword := rsa.EncryptStringENC(password,False);
  if (rsa.LastMethodSuccess = False) then
    begin
      WriteLn(rsa.LastErrorText);
      Exit;
    end;

  //  Generate a random app_key.  This should be 32 bytes (us-ascii chars)
  //  We need 32 bytes because we'll be doing 256-bit AES ECB encryption, and 32 bytes = 256 bits.
  prng := TPrng.Create;
  //  Generate a random string containing some numbers, uppercase, and lowercase.
  app_key := prng.RandomString(32,True,True,True);

  WriteLn('app_key = ' + app_key);

  //  RSA encrypt the app_key.
  encAppKey := rsa.EncryptStringENC(app_key,False);
  if (rsa.LastMethodSuccess = False) then
    begin
      WriteLn(rsa.LastErrorText);
      Exit;
    end;

  //  Prepare the JSON body for the HTTP POST that gets the access token.
  jsonBody := TJsonObject.Create;
  jsonBody.UpdateString('action','ACCESSTOKEN');
  //  Use your username instead of "09ABDC24212B1FK".
  jsonBody.UpdateString('username','09ABDC24212B1FK');
  jsonBody.UpdateString('password',encPassword);
  jsonBody.UpdateString('app_key',encAppKey);

  http := THttp.Create;

  //  Add required headers.
  //  Use your ewb-user-id instead of "03AEXPR16A9M010"
  http.SetRequestHeader('ewb-user-id','03AEXPR16A9M010');
  //  The Gstin should be the same as the username in the jsonBody above.
  http.SetRequestHeader('Gstin','09ABDC24212B1FK');
  http.Accept := 'application/json';

  //  POST the JSON...
  resp := THttpResponse.Create;
  success := http.HttpJson('POST','http://ewb.wepgst.com/api/Authenticate',jsonBody,'application/json',resp);
  if (success = False) then
    begin
      WriteLn(http.LastErrorText);
      Exit;
    end;

  respStatusCode := resp.StatusCode;
  WriteLn('response status code =' + respStatusCode);
  WriteLn('response body:');
  WriteLn(resp.BodyStr);

  if (respStatusCode <> 200) then
    begin
      WriteLn('Failed in some unknown way.');
      Exit;
    end;

  //  When the response status code = 200, we'll have either
  //  success response like this:
  //   {"status":"1","authtoken":"...","sek":"..."}
  //  
  //  or a failed response like this:
  //  
  //  {"status":"0","error":"eyJlcnJvckNvZGVzIjoiMTA4In0="}

  //  Load the response body into a JSON object.
  json := TJsonObject.Create;
  json.Load(resp.BodyStr);

  status := json.IntOf('status');
  WriteLn('status = ' + status);

  if (status <> 1) then
    begin
      //  Failed.  Base64 decode the error
      //  {"status":"0","error":"eyJlcnJvckNvZGVzIjoiMTA4In0="}
      //  For an invalid password, the error is: {"errorCodes":"108"}
      sbError := TStringBuilder.Create;
      json.StringOfSb('error',sbError);
      sbError.Decode('base64','utf-8');
      WriteLn('error: ' + sbError.GetAsString());
      Exit;
    end;

  //  At this point, we know the request was entirely successful.
  authToken := json.StringOf('authtoken');

  //  Decrypt the sek key using our app_key.
  crypt := TCrypt2.Create;
  crypt.CryptAlgorithm := 'aes';
  crypt.CipherMode := 'ecb';
  crypt.KeyLength := 256;
  crypt.SetEncodedKey(app_key,'us-ascii');
  crypt.EncodingMode := 'base64';

  bdSek := TBinData.Create;
  bdSek.AppendEncoded(json.StringOf('sek'),'base64');
  crypt.DecryptBd(bdSek);

  //  bdSek now contains the decrypted symmetric encryption key...
  //  We'll use it to encrypt the JSON payloads we send.

  //  Let's persist our authtoken and decrypted sek (symmetric encryption key).
  //  To send EWAY requests (such as to create an e-way bill), we'll just load 
  //  and use these pre-obtained credentials.
  jsonEwayAuth := TJsonObject.Create;
  jsonEwayAuth.UpdateString('authToken',authToken);
  jsonEwayAuth.UpdateString('decryptedSek',bdSek.GetEncoded('base64'));
  jsonEwayAuth.EmitCompact := False;

  fac := TFileAccess.Create;
  fac.WriteEntireTextFile('qa_data/tokens/ewayAuth.json',jsonEwayAuth.Emit(),'utf-8',False);

  WriteLn('Saved:');
  WriteLn(jsonEwayAuth.Emit());

  //  Sample output:
  //  {
  //    "authToken": "IBTeFtxNfVurg71LTzZ2r0xK7",
  //    "decryptedSek": "5g1TyTie7yoslU3DrbYATa7mWyPazlODE7cEh5Vy4Ho="
  //  }


  pubkey.Free;
  rsa.Free;
  prng.Free;
  jsonBody.Free;
  http.Free;
  resp.Free;
  json.Free;
      sbError.Free;
  crypt.Free;
  bdSek.Free;
  jsonEwayAuth.Free;
  fac.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.