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

Generate an E-way Bill

See more HTTP Misc Examples

Demonstrates how to send an HTTP POST request to generate an e-way bill.

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.HttpResponse,
  Chilkat.StringBuilder,
  Chilkat.JsonObject,
  Chilkat.Crypt2,
  Chilkat.BinData;

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

procedure RunDemo;
var
  success: Boolean;
  jsonAuth: TJsonObject;
  jsonData: TJsonObject;
  jsonRequestBody: TJsonObject;
  crypt: TCrypt2;
  http: THttp;
  resp: THttpResponse;
  respStatusCode: Integer;
  json: TJsonObject;
  status: Integer;
  sbError: TStringBuilder;
  bdData: TBinData;
  jsonBill: TJsonObject;
  ewayBillNo: Integer;
  ewayBillDate: string;
  validUpto: string;

begin
  success := False;

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

  //  This example uses the previously obtained access token that was retrieved
  //  in this example:  Get EWAY Auth Token using Gstin, username, password, and app_key

  jsonAuth := TJsonObject.Create;
  success := jsonAuth.LoadFile('qa_data/tokens/ewayAuth.json');
  if (success = False) then
    begin
      WriteLn(jsonAuth.LastErrorText);
      Exit;
    end;

  //  The jsonAuth contains something like this:
  //  {
  //    "authToken": "IBTeFtxNfVurg71LTzZ2r0xK7",
  //    "decryptedSek": "5g1TyTie7yoslU3DrbYATa7mWyPazlODE7cEh5Vy4Ho="
  //  }

  //  Generate the JSON data for the e-way bill.
  //  The following code can be generated by pasting representative JSON into this online tool:
  //  Generate JSON Code
  jsonData := TJsonObject.Create;
  jsonData.UpdateString('supplyType','O');
  jsonData.UpdateString('subSupplyType','1');
  jsonData.UpdateString('docType','INV');
  jsonData.UpdateString('docNo','AW1234-2');
  jsonData.UpdateString('docDate','05/04/2018');
  jsonData.UpdateString('fromGstin','09ABDC24212B1FK');
  jsonData.UpdateString('fromTrdName','willy');
  jsonData.UpdateString('fromAddr1','3RD CROSS NO 200  19  A');
  jsonData.UpdateString('fromAddr2','GROUND FLOOR OZZY ROAD');
  jsonData.UpdateString('fromPlace','BUSY TOWN');
  jsonData.UpdateNumber('fromPincode','640033');
  jsonData.UpdateNumber('actFromStateCode','05');
  jsonData.UpdateNumber('fromStateCode','05');
  jsonData.UpdateString('toGstin','01AAAASCC10BBBB');
  jsonData.UpdateString('toTrdName','mthustra');
  jsonData.UpdateString('toAddr1','Shrek Ogre');
  jsonData.UpdateString('toAddr2','Basadronsil');
  jsonData.UpdateString('toPlace','Grifl Blagar');
  jsonData.UpdateNumber('toPincode','699988');
  jsonData.UpdateNumber('actToStateCode','29');
  jsonData.UpdateNumber('toStateCode','02');
  jsonData.UpdateNumber('totalValue','5609889');
  jsonData.UpdateNumber('cgstValue','0');
  jsonData.UpdateNumber('sgstValue','0');
  jsonData.UpdateNumber('igstValue','168296.67');
  jsonData.UpdateNumber('cessValue','224395.56');
  jsonData.UpdateString('transporterId','09ABDC24212B1FK');
  jsonData.UpdateString('transporterName','');
  jsonData.UpdateString('transDocNo','12332');
  jsonData.UpdateNumber('transMode','1');
  jsonData.UpdateString('transDistance','656');
  jsonData.UpdateString('transDocDate','10/04/2018');
  jsonData.UpdateString('vehicleNo','PBN4567');
  jsonData.UpdateString('vehicleType','R');
  jsonData.I := 0;
  jsonData.UpdateString('itemList[i].productName','Wheat');
  jsonData.UpdateString('itemList[i].productDesc','Wheat');
  jsonData.UpdateNumber('itemList[i].hsnCode','1001');
  jsonData.UpdateNumber('itemList[i].quantity','4');
  jsonData.UpdateString('itemList[i].qtyUnit','BOX');
  jsonData.UpdateNumber('itemList[i].cgstRate','0');
  jsonData.UpdateNumber('itemList[i].sgstRate','0');
  jsonData.UpdateNumber('itemList[i].igstRate','3');
  jsonData.UpdateNumber('itemList[i].cessRate','4');
  jsonData.UpdateNumber('itemList[i].cessAdvol','0');
  jsonData.UpdateNumber('itemList[i].taxableAmount','5609889');

  //  The body of the HTTP POST will contain JSON that looks like this:
  //  	{
  //  	"action":"GENEWAYBILL",
  //  	"data": " iJiJGXq ... oUZp/25Y "
  //  	}

  //  The "data" is the encrypted jsonData using our previously agreed-upon symmetric encryption key.
  //  Let's begin build the JSON request body..
  jsonRequestBody := TJsonObject.Create;
  jsonRequestBody.UpdateString('action','GENEWAYBILL');

  //  Setup the encryptor using the decryptedSek from the jsonAuth
  crypt := TCrypt2.Create;
  crypt.CryptAlgorithm := 'aes';
  crypt.CipherMode := 'ecb';
  crypt.KeyLength := 256;
  crypt.SetEncodedKey(jsonAuth.StringOf('decryptedSek'),'base64');
  crypt.EncodingMode := 'base64';

  //  Encrypt the jsonData and add it to our JSON request body
  jsonRequestBody.UpdateString('data',crypt.EncryptStringENC(jsonData.Emit()));

  http := THttp.Create;

  //  Add the authtoken to the request header.
  //  Be careful to be precise with uppercase/lowercase ("authtoken" vs "authToken")
  http.SetRequestHeader('authtoken',jsonAuth.StringOf('authToken'));
  http.SetRequestHeader('Gstin','09ABDC24212B1FK');
  http.Accept := 'application/json';

  //  POST the request to generate an e-way bill:
  resp := THttpResponse.Create;
  success := http.HttpJson('POST','http://ewb.wepgst.com/api/EWayBill',jsonRequestBody,'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","data":"..."}
  //  
  //  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;

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

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

  //  Decrypts to 
  //  {"ewayBillNo":331001121234,"ewayBillDate":"24/05/2018 04:38:00 PM","validUpto":"31/05/2018 11:59:00 PM"}

  jsonBill := TJsonObject.Create;
  jsonBill.Load(bdData.GetString('utf-8'));

  ewayBillNo := jsonBill.IntOf('ewayBillNo');
  WriteLn('ewayBillNo = ' + ewayBillNo);

  ewayBillDate := jsonBill.StringOf('ewayBillDate');
  WriteLn('ewayBillDate = ' + ewayBillDate);

  validUpto := jsonBill.StringOf('validUpto');
  WriteLn('validUpto = ' + validUpto);

  //  Sample output:

  //  ewayBillNo = 331001121234
  //  ewayBillDate = 24/05/2018 04:55:00 PM
  //  validUpto = 31/05/2018 11:59:00 PM


  jsonAuth.Free;
  jsonData.Free;
  jsonRequestBody.Free;
  crypt.Free;
  http.Free;
  resp.Free;
  json.Free;
      sbError.Free;
  bdData.Free;
  jsonBill.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.