C++
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 C++ Downloads
#include <CkJsonObject.h>
#include <CkCrypt2.h>
#include <CkHttp.h>
#include <CkHttpResponse.h>
#include <CkStringBuilder.h>
#include <CkBinData.h>
void ChilkatSample(void)
{
bool 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
CkJsonObject jsonAuth;
success = jsonAuth.LoadFile("qa_data/tokens/ewayAuth.json");
if (success == false) {
std::cout << jsonAuth.lastErrorText() << "\r\n";
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
CkJsonObject jsonData;
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.put_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..
CkJsonObject jsonRequestBody;
jsonRequestBody.UpdateString("action","GENEWAYBILL");
// Setup the encryptor using the decryptedSek from the jsonAuth
CkCrypt2 crypt;
crypt.put_CryptAlgorithm("aes");
crypt.put_CipherMode("ecb");
crypt.put_KeyLength(256);
crypt.SetEncodedKey(jsonAuth.stringOf("decryptedSek"),"base64");
crypt.put_EncodingMode("base64");
// Encrypt the jsonData and add it to our JSON request body
jsonRequestBody.UpdateString("data",crypt.encryptStringENC(jsonData.emit()));
CkHttp http;
// 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.put_Accept("application/json");
// POST the request to generate an e-way bill:
CkHttpResponse resp;
success = http.HttpJson("POST","http://ewb.wepgst.com/api/EWayBill",jsonRequestBody,"application/json",resp);
if (success == false) {
std::cout << http.lastErrorText() << "\r\n";
return;
}
int respStatusCode = resp.get_StatusCode();
std::cout << "response status code =" << respStatusCode << "\r\n";
std::cout << "response body:" << "\r\n";
std::cout << resp.bodyStr() << "\r\n";
if (respStatusCode != 200) {
std::cout << "Failed in some unknown way." << "\r\n";
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.
CkJsonObject json;
json.Load(resp.bodyStr());
int status = json.IntOf("status");
std::cout << "status = " << status << "\r\n";
if (status != 1) {
// Failed. Base64 decode the error
// {"status":"0","error":"eyJlcnJvckNvZGVzIjoiMTA4In0="}
// For an invalid password, the error is: {"errorCodes":"108"}
CkStringBuilder sbError;
json.StringOfSb("error",sbError);
sbError.Decode("base64","utf-8");
std::cout << "error: " << sbError.getAsString() << "\r\n";
return;
}
json.put_EmitCompact(false);
std::cout << "JSON response:" << "\r\n";
std::cout << json.emit() << "\r\n";
CkBinData bdData;
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"}
CkJsonObject jsonBill;
jsonBill.Load(bdData.getString("utf-8"));
int ewayBillNo = jsonBill.IntOf("ewayBillNo");
std::cout << "ewayBillNo = " << ewayBillNo << "\r\n";
const char *ewayBillDate = jsonBill.stringOf("ewayBillDate");
std::cout << "ewayBillDate = " << ewayBillDate << "\r\n";
const char *validUpto = jsonBill.stringOf("validUpto");
std::cout << "validUpto = " << validUpto << "\r\n";
// Sample output:
// ewayBillNo = 331001121234
// ewayBillDate = 24/05/2018 04:55:00 PM
// validUpto = 31/05/2018 11:59:00 PM
}