Unicode C
Unicode C
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 Unicode C Downloads
#include <C_CkJsonObjectW.h>
#include <C_CkCrypt2W.h>
#include <C_CkHttpW.h>
#include <C_CkHttpResponseW.h>
#include <C_CkStringBuilderW.h>
#include <C_CkBinDataW.h>
void ChilkatSample(void)
{
BOOL success;
HCkJsonObjectW jsonAuth;
HCkJsonObjectW jsonData;
HCkJsonObjectW jsonRequestBody;
HCkCrypt2W crypt;
HCkHttpW http;
HCkHttpResponseW resp;
int respStatusCode;
HCkJsonObjectW json;
int status;
HCkStringBuilderW sbError;
HCkBinDataW bdData;
HCkJsonObjectW jsonBill;
int ewayBillNo;
const wchar_t *ewayBillDate;
const wchar_t *validUpto;
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 = CkJsonObjectW_Create();
success = CkJsonObjectW_LoadFile(jsonAuth,L"qa_data/tokens/ewayAuth.json");
if (success == FALSE) {
wprintf(L"%s\n",CkJsonObjectW_lastErrorText(jsonAuth));
CkJsonObjectW_Dispose(jsonAuth);
return;
}
// 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 = CkJsonObjectW_Create();
CkJsonObjectW_UpdateString(jsonData,L"supplyType",L"O");
CkJsonObjectW_UpdateString(jsonData,L"subSupplyType",L"1");
CkJsonObjectW_UpdateString(jsonData,L"docType",L"INV");
CkJsonObjectW_UpdateString(jsonData,L"docNo",L"AW1234-2");
CkJsonObjectW_UpdateString(jsonData,L"docDate",L"05/04/2018");
CkJsonObjectW_UpdateString(jsonData,L"fromGstin",L"09ABDC24212B1FK");
CkJsonObjectW_UpdateString(jsonData,L"fromTrdName",L"willy");
CkJsonObjectW_UpdateString(jsonData,L"fromAddr1",L"3RD CROSS NO 200 19 A");
CkJsonObjectW_UpdateString(jsonData,L"fromAddr2",L"GROUND FLOOR OZZY ROAD");
CkJsonObjectW_UpdateString(jsonData,L"fromPlace",L"BUSY TOWN");
CkJsonObjectW_UpdateNumber(jsonData,L"fromPincode",L"640033");
CkJsonObjectW_UpdateNumber(jsonData,L"actFromStateCode",L"05");
CkJsonObjectW_UpdateNumber(jsonData,L"fromStateCode",L"05");
CkJsonObjectW_UpdateString(jsonData,L"toGstin",L"01AAAASCC10BBBB");
CkJsonObjectW_UpdateString(jsonData,L"toTrdName",L"mthustra");
CkJsonObjectW_UpdateString(jsonData,L"toAddr1",L"Shrek Ogre");
CkJsonObjectW_UpdateString(jsonData,L"toAddr2",L"Basadronsil");
CkJsonObjectW_UpdateString(jsonData,L"toPlace",L"Grifl Blagar");
CkJsonObjectW_UpdateNumber(jsonData,L"toPincode",L"699988");
CkJsonObjectW_UpdateNumber(jsonData,L"actToStateCode",L"29");
CkJsonObjectW_UpdateNumber(jsonData,L"toStateCode",L"02");
CkJsonObjectW_UpdateNumber(jsonData,L"totalValue",L"5609889");
CkJsonObjectW_UpdateNumber(jsonData,L"cgstValue",L"0");
CkJsonObjectW_UpdateNumber(jsonData,L"sgstValue",L"0");
CkJsonObjectW_UpdateNumber(jsonData,L"igstValue",L"168296.67");
CkJsonObjectW_UpdateNumber(jsonData,L"cessValue",L"224395.56");
CkJsonObjectW_UpdateString(jsonData,L"transporterId",L"09ABDC24212B1FK");
CkJsonObjectW_UpdateString(jsonData,L"transporterName",L"");
CkJsonObjectW_UpdateString(jsonData,L"transDocNo",L"12332");
CkJsonObjectW_UpdateNumber(jsonData,L"transMode",L"1");
CkJsonObjectW_UpdateString(jsonData,L"transDistance",L"656");
CkJsonObjectW_UpdateString(jsonData,L"transDocDate",L"10/04/2018");
CkJsonObjectW_UpdateString(jsonData,L"vehicleNo",L"PBN4567");
CkJsonObjectW_UpdateString(jsonData,L"vehicleType",L"R");
CkJsonObjectW_putI(jsonData,0);
CkJsonObjectW_UpdateString(jsonData,L"itemList[i].productName",L"Wheat");
CkJsonObjectW_UpdateString(jsonData,L"itemList[i].productDesc",L"Wheat");
CkJsonObjectW_UpdateNumber(jsonData,L"itemList[i].hsnCode",L"1001");
CkJsonObjectW_UpdateNumber(jsonData,L"itemList[i].quantity",L"4");
CkJsonObjectW_UpdateString(jsonData,L"itemList[i].qtyUnit",L"BOX");
CkJsonObjectW_UpdateNumber(jsonData,L"itemList[i].cgstRate",L"0");
CkJsonObjectW_UpdateNumber(jsonData,L"itemList[i].sgstRate",L"0");
CkJsonObjectW_UpdateNumber(jsonData,L"itemList[i].igstRate",L"3");
CkJsonObjectW_UpdateNumber(jsonData,L"itemList[i].cessRate",L"4");
CkJsonObjectW_UpdateNumber(jsonData,L"itemList[i].cessAdvol",L"0");
CkJsonObjectW_UpdateNumber(jsonData,L"itemList[i].taxableAmount",L"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 = CkJsonObjectW_Create();
CkJsonObjectW_UpdateString(jsonRequestBody,L"action",L"GENEWAYBILL");
// Setup the encryptor using the decryptedSek from the jsonAuth
crypt = CkCrypt2W_Create();
CkCrypt2W_putCryptAlgorithm(crypt,L"aes");
CkCrypt2W_putCipherMode(crypt,L"ecb");
CkCrypt2W_putKeyLength(crypt,256);
CkCrypt2W_SetEncodedKey(crypt,CkJsonObjectW_stringOf(jsonAuth,L"decryptedSek"),L"base64");
CkCrypt2W_putEncodingMode(crypt,L"base64");
// Encrypt the jsonData and add it to our JSON request body
CkJsonObjectW_UpdateString(jsonRequestBody,L"data",CkCrypt2W_encryptStringENC(crypt,CkJsonObjectW_emit(jsonData)));
http = CkHttpW_Create();
// Add the authtoken to the request header.
// Be careful to be precise with uppercase/lowercase ("authtoken" vs "authToken")
CkHttpW_SetRequestHeader(http,L"authtoken",CkJsonObjectW_stringOf(jsonAuth,L"authToken"));
CkHttpW_SetRequestHeader(http,L"Gstin",L"09ABDC24212B1FK");
CkHttpW_putAccept(http,L"application/json");
// POST the request to generate an e-way bill:
resp = CkHttpResponseW_Create();
success = CkHttpW_HttpJson(http,L"POST",L"http://ewb.wepgst.com/api/EWayBill",jsonRequestBody,L"application/json",resp);
if (success == FALSE) {
wprintf(L"%s\n",CkHttpW_lastErrorText(http));
CkJsonObjectW_Dispose(jsonAuth);
CkJsonObjectW_Dispose(jsonData);
CkJsonObjectW_Dispose(jsonRequestBody);
CkCrypt2W_Dispose(crypt);
CkHttpW_Dispose(http);
CkHttpResponseW_Dispose(resp);
return;
}
respStatusCode = CkHttpResponseW_getStatusCode(resp);
wprintf(L"response status code =%d\n",respStatusCode);
wprintf(L"response body:\n");
wprintf(L"%s\n",CkHttpResponseW_bodyStr(resp));
if (respStatusCode != 200) {
wprintf(L"Failed in some unknown way.\n");
CkJsonObjectW_Dispose(jsonAuth);
CkJsonObjectW_Dispose(jsonData);
CkJsonObjectW_Dispose(jsonRequestBody);
CkCrypt2W_Dispose(crypt);
CkHttpW_Dispose(http);
CkHttpResponseW_Dispose(resp);
return;
}
// 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 = CkJsonObjectW_Create();
CkJsonObjectW_Load(json,CkHttpResponseW_bodyStr(resp));
status = CkJsonObjectW_IntOf(json,L"status");
wprintf(L"status = %d\n",status);
if (status != 1) {
// Failed. Base64 decode the error
// {"status":"0","error":"eyJlcnJvckNvZGVzIjoiMTA4In0="}
// For an invalid password, the error is: {"errorCodes":"108"}
sbError = CkStringBuilderW_Create();
CkJsonObjectW_StringOfSb(json,L"error",sbError);
CkStringBuilderW_Decode(sbError,L"base64",L"utf-8");
wprintf(L"error: %s\n",CkStringBuilderW_getAsString(sbError));
CkJsonObjectW_Dispose(jsonAuth);
CkJsonObjectW_Dispose(jsonData);
CkJsonObjectW_Dispose(jsonRequestBody);
CkCrypt2W_Dispose(crypt);
CkHttpW_Dispose(http);
CkHttpResponseW_Dispose(resp);
CkJsonObjectW_Dispose(json);
CkStringBuilderW_Dispose(sbError);
return;
}
CkJsonObjectW_putEmitCompact(json,FALSE);
wprintf(L"JSON response:\n");
wprintf(L"%s\n",CkJsonObjectW_emit(json));
bdData = CkBinDataW_Create();
CkBinDataW_AppendEncoded(bdData,CkJsonObjectW_stringOf(json,L"data"),L"base64");
CkCrypt2W_DecryptBd(crypt,bdData);
// Decrypts to
// {"ewayBillNo":331001121234,"ewayBillDate":"24/05/2018 04:38:00 PM","validUpto":"31/05/2018 11:59:00 PM"}
jsonBill = CkJsonObjectW_Create();
CkJsonObjectW_Load(jsonBill,CkBinDataW_getString(bdData,L"utf-8"));
ewayBillNo = CkJsonObjectW_IntOf(jsonBill,L"ewayBillNo");
wprintf(L"ewayBillNo = %d\n",ewayBillNo);
ewayBillDate = CkJsonObjectW_stringOf(jsonBill,L"ewayBillDate");
wprintf(L"ewayBillDate = %s\n",ewayBillDate);
validUpto = CkJsonObjectW_stringOf(jsonBill,L"validUpto");
wprintf(L"validUpto = %s\n",validUpto);
// Sample output:
// ewayBillNo = 331001121234
// ewayBillDate = 24/05/2018 04:55:00 PM
// validUpto = 31/05/2018 11:59:00 PM
CkJsonObjectW_Dispose(jsonAuth);
CkJsonObjectW_Dispose(jsonData);
CkJsonObjectW_Dispose(jsonRequestBody);
CkCrypt2W_Dispose(crypt);
CkHttpW_Dispose(http);
CkHttpResponseW_Dispose(resp);
CkJsonObjectW_Dispose(json);
CkStringBuilderW_Dispose(sbError);
CkBinDataW_Dispose(bdData);
CkJsonObjectW_Dispose(jsonBill);
}