Delphi DLL
Delphi DLL
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 Delphi DLL Downloads
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Http, HttpResponse, StringBuilder, JsonObject, Crypt2, BinData;
...
procedure TForm1.Button1Click(Sender: TObject);
var
success: Boolean;
jsonAuth: HCkJsonObject;
jsonData: HCkJsonObject;
jsonRequestBody: HCkJsonObject;
crypt: HCkCrypt2;
http: HCkHttp;
resp: HCkHttpResponse;
respStatusCode: Integer;
json: HCkJsonObject;
status: Integer;
sbError: HCkStringBuilder;
bdData: HCkBinData;
jsonBill: HCkJsonObject;
ewayBillNo: Integer;
ewayBillDate: PWideChar;
validUpto: PWideChar;
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 := CkJsonObject_Create();
success := CkJsonObject_LoadFile(jsonAuth,'qa_data/tokens/ewayAuth.json');
if (success = False) then
begin
Memo1.Lines.Add(CkJsonObject__lastErrorText(jsonAuth));
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 := CkJsonObject_Create();
CkJsonObject_UpdateString(jsonData,'supplyType','O');
CkJsonObject_UpdateString(jsonData,'subSupplyType','1');
CkJsonObject_UpdateString(jsonData,'docType','INV');
CkJsonObject_UpdateString(jsonData,'docNo','AW1234-2');
CkJsonObject_UpdateString(jsonData,'docDate','05/04/2018');
CkJsonObject_UpdateString(jsonData,'fromGstin','09ABDC24212B1FK');
CkJsonObject_UpdateString(jsonData,'fromTrdName','willy');
CkJsonObject_UpdateString(jsonData,'fromAddr1','3RD CROSS NO 200 19 A');
CkJsonObject_UpdateString(jsonData,'fromAddr2','GROUND FLOOR OZZY ROAD');
CkJsonObject_UpdateString(jsonData,'fromPlace','BUSY TOWN');
CkJsonObject_UpdateNumber(jsonData,'fromPincode','640033');
CkJsonObject_UpdateNumber(jsonData,'actFromStateCode','05');
CkJsonObject_UpdateNumber(jsonData,'fromStateCode','05');
CkJsonObject_UpdateString(jsonData,'toGstin','01AAAASCC10BBBB');
CkJsonObject_UpdateString(jsonData,'toTrdName','mthustra');
CkJsonObject_UpdateString(jsonData,'toAddr1','Shrek Ogre');
CkJsonObject_UpdateString(jsonData,'toAddr2','Basadronsil');
CkJsonObject_UpdateString(jsonData,'toPlace','Grifl Blagar');
CkJsonObject_UpdateNumber(jsonData,'toPincode','699988');
CkJsonObject_UpdateNumber(jsonData,'actToStateCode','29');
CkJsonObject_UpdateNumber(jsonData,'toStateCode','02');
CkJsonObject_UpdateNumber(jsonData,'totalValue','5609889');
CkJsonObject_UpdateNumber(jsonData,'cgstValue','0');
CkJsonObject_UpdateNumber(jsonData,'sgstValue','0');
CkJsonObject_UpdateNumber(jsonData,'igstValue','168296.67');
CkJsonObject_UpdateNumber(jsonData,'cessValue','224395.56');
CkJsonObject_UpdateString(jsonData,'transporterId','09ABDC24212B1FK');
CkJsonObject_UpdateString(jsonData,'transporterName','');
CkJsonObject_UpdateString(jsonData,'transDocNo','12332');
CkJsonObject_UpdateNumber(jsonData,'transMode','1');
CkJsonObject_UpdateString(jsonData,'transDistance','656');
CkJsonObject_UpdateString(jsonData,'transDocDate','10/04/2018');
CkJsonObject_UpdateString(jsonData,'vehicleNo','PBN4567');
CkJsonObject_UpdateString(jsonData,'vehicleType','R');
CkJsonObject_putI(jsonData,0);
CkJsonObject_UpdateString(jsonData,'itemList[i].productName','Wheat');
CkJsonObject_UpdateString(jsonData,'itemList[i].productDesc','Wheat');
CkJsonObject_UpdateNumber(jsonData,'itemList[i].hsnCode','1001');
CkJsonObject_UpdateNumber(jsonData,'itemList[i].quantity','4');
CkJsonObject_UpdateString(jsonData,'itemList[i].qtyUnit','BOX');
CkJsonObject_UpdateNumber(jsonData,'itemList[i].cgstRate','0');
CkJsonObject_UpdateNumber(jsonData,'itemList[i].sgstRate','0');
CkJsonObject_UpdateNumber(jsonData,'itemList[i].igstRate','3');
CkJsonObject_UpdateNumber(jsonData,'itemList[i].cessRate','4');
CkJsonObject_UpdateNumber(jsonData,'itemList[i].cessAdvol','0');
CkJsonObject_UpdateNumber(jsonData,'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 := CkJsonObject_Create();
CkJsonObject_UpdateString(jsonRequestBody,'action','GENEWAYBILL');
// Setup the encryptor using the decryptedSek from the jsonAuth
crypt := CkCrypt2_Create();
CkCrypt2_putCryptAlgorithm(crypt,'aes');
CkCrypt2_putCipherMode(crypt,'ecb');
CkCrypt2_putKeyLength(crypt,256);
CkCrypt2_SetEncodedKey(crypt,CkJsonObject__stringOf(jsonAuth,'decryptedSek'),'base64');
CkCrypt2_putEncodingMode(crypt,'base64');
// Encrypt the jsonData and add it to our JSON request body
CkJsonObject_UpdateString(jsonRequestBody,'data',CkCrypt2__encryptStringENC(crypt,CkJsonObject__emit(jsonData)));
http := CkHttp_Create();
// Add the authtoken to the request header.
// Be careful to be precise with uppercase/lowercase ("authtoken" vs "authToken")
CkHttp_SetRequestHeader(http,'authtoken',CkJsonObject__stringOf(jsonAuth,'authToken'));
CkHttp_SetRequestHeader(http,'Gstin','09ABDC24212B1FK');
CkHttp_putAccept(http,'application/json');
// POST the request to generate an e-way bill:
resp := CkHttpResponse_Create();
success := CkHttp_HttpJson(http,'POST','http://ewb.wepgst.com/api/EWayBill',jsonRequestBody,'application/json',resp);
if (success = False) then
begin
Memo1.Lines.Add(CkHttp__lastErrorText(http));
Exit;
end;
respStatusCode := CkHttpResponse_getStatusCode(resp);
Memo1.Lines.Add('response status code =' + IntToStr(respStatusCode));
Memo1.Lines.Add('response body:');
Memo1.Lines.Add(CkHttpResponse__bodyStr(resp));
if (respStatusCode <> 200) then
begin
Memo1.Lines.Add('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 := CkJsonObject_Create();
CkJsonObject_Load(json,CkHttpResponse__bodyStr(resp));
status := CkJsonObject_IntOf(json,'status');
Memo1.Lines.Add('status = ' + IntToStr(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 := CkStringBuilder_Create();
CkJsonObject_StringOfSb(json,'error',sbError);
CkStringBuilder_Decode(sbError,'base64','utf-8');
Memo1.Lines.Add('error: ' + CkStringBuilder__getAsString(sbError));
Exit;
end;
CkJsonObject_putEmitCompact(json,False);
Memo1.Lines.Add('JSON response:');
Memo1.Lines.Add(CkJsonObject__emit(json));
bdData := CkBinData_Create();
CkBinData_AppendEncoded(bdData,CkJsonObject__stringOf(json,'data'),'base64');
CkCrypt2_DecryptBd(crypt,bdData);
// Decrypts to
// {"ewayBillNo":331001121234,"ewayBillDate":"24/05/2018 04:38:00 PM","validUpto":"31/05/2018 11:59:00 PM"}
jsonBill := CkJsonObject_Create();
CkJsonObject_Load(jsonBill,CkBinData__getString(bdData,'utf-8'));
ewayBillNo := CkJsonObject_IntOf(jsonBill,'ewayBillNo');
Memo1.Lines.Add('ewayBillNo = ' + IntToStr(ewayBillNo));
ewayBillDate := CkJsonObject__stringOf(jsonBill,'ewayBillDate');
Memo1.Lines.Add('ewayBillDate = ' + ewayBillDate);
validUpto := CkJsonObject__stringOf(jsonBill,'validUpto');
Memo1.Lines.Add('validUpto = ' + validUpto);
// Sample output:
// ewayBillNo = 331001121234
// ewayBillDate = 24/05/2018 04:55:00 PM
// validUpto = 31/05/2018 11:59:00 PM
CkJsonObject_Dispose(jsonAuth);
CkJsonObject_Dispose(jsonData);
CkJsonObject_Dispose(jsonRequestBody);
CkCrypt2_Dispose(crypt);
CkHttp_Dispose(http);
CkHttpResponse_Dispose(resp);
CkJsonObject_Dispose(json);
CkStringBuilder_Dispose(sbError);
CkBinData_Dispose(bdData);
CkJsonObject_Dispose(jsonBill);
end;