Sample code for 30+ languages & platforms
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

Unicode C
#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);

    }