Sample code for 30+ languages & platforms
PureBasic

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 PureBasic Downloads

PureBasic
IncludeFile "CkJsonObject.pb"
IncludeFile "CkHttp.pb"
IncludeFile "CkCrypt2.pb"
IncludeFile "CkStringBuilder.pb"
IncludeFile "CkHttpResponse.pb"
IncludeFile "CkBinData.pb"

Procedure ChilkatExample()

    success.i = 0

    ; 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.i = CkJsonObject::ckCreate()
    If jsonAuth.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkJsonObject::ckLoadFile(jsonAuth,"qa_data/tokens/ewayAuth.json")
    If success = 0
        Debug CkJsonObject::ckLastErrorText(jsonAuth)
        CkJsonObject::ckDispose(jsonAuth)
        ProcedureReturn
    EndIf

    ; 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.i = CkJsonObject::ckCreate()
    If jsonData.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkJsonObject::ckUpdateString(jsonData,"supplyType","O")
    CkJsonObject::ckUpdateString(jsonData,"subSupplyType","1")
    CkJsonObject::ckUpdateString(jsonData,"docType","INV")
    CkJsonObject::ckUpdateString(jsonData,"docNo","AW1234-2")
    CkJsonObject::ckUpdateString(jsonData,"docDate","05/04/2018")
    CkJsonObject::ckUpdateString(jsonData,"fromGstin","09ABDC24212B1FK")
    CkJsonObject::ckUpdateString(jsonData,"fromTrdName","willy")
    CkJsonObject::ckUpdateString(jsonData,"fromAddr1","3RD CROSS NO 200  19  A")
    CkJsonObject::ckUpdateString(jsonData,"fromAddr2","GROUND FLOOR OZZY ROAD")
    CkJsonObject::ckUpdateString(jsonData,"fromPlace","BUSY TOWN")
    CkJsonObject::ckUpdateNumber(jsonData,"fromPincode","640033")
    CkJsonObject::ckUpdateNumber(jsonData,"actFromStateCode","05")
    CkJsonObject::ckUpdateNumber(jsonData,"fromStateCode","05")
    CkJsonObject::ckUpdateString(jsonData,"toGstin","01AAAASCC10BBBB")
    CkJsonObject::ckUpdateString(jsonData,"toTrdName","mthustra")
    CkJsonObject::ckUpdateString(jsonData,"toAddr1","Shrek Ogre")
    CkJsonObject::ckUpdateString(jsonData,"toAddr2","Basadronsil")
    CkJsonObject::ckUpdateString(jsonData,"toPlace","Grifl Blagar")
    CkJsonObject::ckUpdateNumber(jsonData,"toPincode","699988")
    CkJsonObject::ckUpdateNumber(jsonData,"actToStateCode","29")
    CkJsonObject::ckUpdateNumber(jsonData,"toStateCode","02")
    CkJsonObject::ckUpdateNumber(jsonData,"totalValue","5609889")
    CkJsonObject::ckUpdateNumber(jsonData,"cgstValue","0")
    CkJsonObject::ckUpdateNumber(jsonData,"sgstValue","0")
    CkJsonObject::ckUpdateNumber(jsonData,"igstValue","168296.67")
    CkJsonObject::ckUpdateNumber(jsonData,"cessValue","224395.56")
    CkJsonObject::ckUpdateString(jsonData,"transporterId","09ABDC24212B1FK")
    CkJsonObject::ckUpdateString(jsonData,"transporterName","")
    CkJsonObject::ckUpdateString(jsonData,"transDocNo","12332")
    CkJsonObject::ckUpdateNumber(jsonData,"transMode","1")
    CkJsonObject::ckUpdateString(jsonData,"transDistance","656")
    CkJsonObject::ckUpdateString(jsonData,"transDocDate","10/04/2018")
    CkJsonObject::ckUpdateString(jsonData,"vehicleNo","PBN4567")
    CkJsonObject::ckUpdateString(jsonData,"vehicleType","R")
    CkJsonObject::setCkI(jsonData, 0)
    CkJsonObject::ckUpdateString(jsonData,"itemList[i].productName","Wheat")
    CkJsonObject::ckUpdateString(jsonData,"itemList[i].productDesc","Wheat")
    CkJsonObject::ckUpdateNumber(jsonData,"itemList[i].hsnCode","1001")
    CkJsonObject::ckUpdateNumber(jsonData,"itemList[i].quantity","4")
    CkJsonObject::ckUpdateString(jsonData,"itemList[i].qtyUnit","BOX")
    CkJsonObject::ckUpdateNumber(jsonData,"itemList[i].cgstRate","0")
    CkJsonObject::ckUpdateNumber(jsonData,"itemList[i].sgstRate","0")
    CkJsonObject::ckUpdateNumber(jsonData,"itemList[i].igstRate","3")
    CkJsonObject::ckUpdateNumber(jsonData,"itemList[i].cessRate","4")
    CkJsonObject::ckUpdateNumber(jsonData,"itemList[i].cessAdvol","0")
    CkJsonObject::ckUpdateNumber(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.i = CkJsonObject::ckCreate()
    If jsonRequestBody.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkJsonObject::ckUpdateString(jsonRequestBody,"action","GENEWAYBILL")

    ; Setup the encryptor using the decryptedSek from the jsonAuth
    crypt.i = CkCrypt2::ckCreate()
    If crypt.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkCrypt2::setCkCryptAlgorithm(crypt, "aes")
    CkCrypt2::setCkCipherMode(crypt, "ecb")
    CkCrypt2::setCkKeyLength(crypt, 256)
    CkCrypt2::ckSetEncodedKey(crypt,CkJsonObject::ckStringOf(jsonAuth,"decryptedSek"),"base64")
    CkCrypt2::setCkEncodingMode(crypt, "base64")

    ; Encrypt the jsonData and add it to our JSON request body
    CkJsonObject::ckUpdateString(jsonRequestBody,"data",CkCrypt2::ckEncryptStringENC(crypt,CkJsonObject::ckEmit(jsonData)))

    http.i = CkHttp::ckCreate()
    If http.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; Add the authtoken to the request header.
    ; Be careful to be precise with uppercase/lowercase ("authtoken" vs "authToken")
    CkHttp::ckSetRequestHeader(http,"authtoken",CkJsonObject::ckStringOf(jsonAuth,"authToken"))
    CkHttp::ckSetRequestHeader(http,"Gstin","09ABDC24212B1FK")
    CkHttp::setCkAccept(http, "application/json")

    ; POST the request to generate an e-way bill:
    resp.i = CkHttpResponse::ckCreate()
    If resp.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkHttp::ckHttpJson(http,"POST","http://ewb.wepgst.com/api/EWayBill",jsonRequestBody,"application/json",resp)
    If success = 0
        Debug CkHttp::ckLastErrorText(http)
        CkJsonObject::ckDispose(jsonAuth)
        CkJsonObject::ckDispose(jsonData)
        CkJsonObject::ckDispose(jsonRequestBody)
        CkCrypt2::ckDispose(crypt)
        CkHttp::ckDispose(http)
        CkHttpResponse::ckDispose(resp)
        ProcedureReturn
    EndIf

    respStatusCode.i = CkHttpResponse::ckStatusCode(resp)
    Debug "response status code =" + Str(respStatusCode)
    Debug "response body:"
    Debug CkHttpResponse::ckBodyStr(resp)

    If respStatusCode <> 200
        Debug "Failed in some unknown way."
        CkJsonObject::ckDispose(jsonAuth)
        CkJsonObject::ckDispose(jsonData)
        CkJsonObject::ckDispose(jsonRequestBody)
        CkCrypt2::ckDispose(crypt)
        CkHttp::ckDispose(http)
        CkHttpResponse::ckDispose(resp)
        ProcedureReturn
    EndIf

    ; 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.i = CkJsonObject::ckCreate()
    If json.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkJsonObject::ckLoad(json,CkHttpResponse::ckBodyStr(resp))

    status.i = CkJsonObject::ckIntOf(json,"status")
    Debug "status = " + Str(status)

    If status <> 1
        ; Failed.  Base64 decode the error
        ; {"status":"0","error":"eyJlcnJvckNvZGVzIjoiMTA4In0="}
        ; For an invalid password, the error is: {"errorCodes":"108"}
        sbError.i = CkStringBuilder::ckCreate()
        If sbError.i = 0
            Debug "Failed to create object."
            ProcedureReturn
        EndIf

        CkJsonObject::ckStringOfSb(json,"error",sbError)
        CkStringBuilder::ckDecode(sbError,"base64","utf-8")
        Debug "error: " + CkStringBuilder::ckGetAsString(sbError)
        CkJsonObject::ckDispose(jsonAuth)
        CkJsonObject::ckDispose(jsonData)
        CkJsonObject::ckDispose(jsonRequestBody)
        CkCrypt2::ckDispose(crypt)
        CkHttp::ckDispose(http)
        CkHttpResponse::ckDispose(resp)
        CkJsonObject::ckDispose(json)
        CkStringBuilder::ckDispose(sbError)
        ProcedureReturn
    EndIf

    CkJsonObject::setCkEmitCompact(json, 0)
    Debug "JSON response:"
    Debug CkJsonObject::ckEmit(json)

    bdData.i = CkBinData::ckCreate()
    If bdData.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkBinData::ckAppendEncoded(bdData,CkJsonObject::ckStringOf(json,"data"),"base64")
    CkCrypt2::ckDecryptBd(crypt,bdData)

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

    jsonBill.i = CkJsonObject::ckCreate()
    If jsonBill.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkJsonObject::ckLoad(jsonBill,CkBinData::ckGetString(bdData,"utf-8"))

    ewayBillNo.i = CkJsonObject::ckIntOf(jsonBill,"ewayBillNo")
    Debug "ewayBillNo = " + Str(ewayBillNo)

    ewayBillDate.s = CkJsonObject::ckStringOf(jsonBill,"ewayBillDate")
    Debug "ewayBillDate = " + ewayBillDate

    validUpto.s = CkJsonObject::ckStringOf(jsonBill,"validUpto")
    Debug "validUpto = " + validUpto

    ; Sample output:

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


    CkJsonObject::ckDispose(jsonAuth)
    CkJsonObject::ckDispose(jsonData)
    CkJsonObject::ckDispose(jsonRequestBody)
    CkCrypt2::ckDispose(crypt)
    CkHttp::ckDispose(http)
    CkHttpResponse::ckDispose(resp)
    CkJsonObject::ckDispose(json)
    CkStringBuilder::ckDispose(sbError)
    CkBinData::ckDispose(bdData)
    CkJsonObject::ckDispose(jsonBill)


    ProcedureReturn
EndProcedure