Tcl
Tcl
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 Tcl Downloads
load ./chilkat.dll
set success 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
set jsonAuth [new_CkJsonObject]
set success [CkJsonObject_LoadFile $jsonAuth "qa_data/tokens/ewayAuth.json"]
if {$success == 0} then {
puts [CkJsonObject_lastErrorText $jsonAuth]
delete_CkJsonObject $jsonAuth
exit
}
# 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
set jsonData [new_CkJsonObject]
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_put_I $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..
set jsonRequestBody [new_CkJsonObject]
CkJsonObject_UpdateString $jsonRequestBody "action" "GENEWAYBILL"
# Setup the encryptor using the decryptedSek from the jsonAuth
set crypt [new_CkCrypt2]
CkCrypt2_put_CryptAlgorithm $crypt "aes"
CkCrypt2_put_CipherMode $crypt "ecb"
CkCrypt2_put_KeyLength $crypt 256
CkCrypt2_SetEncodedKey $crypt [CkJsonObject_stringOf $jsonAuth "decryptedSek"] "base64"
CkCrypt2_put_EncodingMode $crypt "base64"
# Encrypt the jsonData and add it to our JSON request body
CkJsonObject_UpdateString $jsonRequestBody "data" [CkCrypt2_encryptStringENC $crypt [CkJsonObject_emit $jsonData]]
set http [new_CkHttp]
# 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_put_Accept $http "application/json"
# POST the request to generate an e-way bill:
set resp [new_CkHttpResponse]
set success [CkHttp_HttpJson $http "POST" "http://ewb.wepgst.com/api/EWayBill" $jsonRequestBody "application/json" $resp]
if {$success == 0} then {
puts [CkHttp_lastErrorText $http]
delete_CkJsonObject $jsonAuth
delete_CkJsonObject $jsonData
delete_CkJsonObject $jsonRequestBody
delete_CkCrypt2 $crypt
delete_CkHttp $http
delete_CkHttpResponse $resp
exit
}
set respStatusCode [CkHttpResponse_get_StatusCode $resp]
puts "response status code =$respStatusCode"
puts "response body:"
puts [CkHttpResponse_bodyStr $resp]
if {$respStatusCode != 200} then {
puts "Failed in some unknown way."
delete_CkJsonObject $jsonAuth
delete_CkJsonObject $jsonData
delete_CkJsonObject $jsonRequestBody
delete_CkCrypt2 $crypt
delete_CkHttp $http
delete_CkHttpResponse $resp
exit
}
# 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.
set json [new_CkJsonObject]
CkJsonObject_Load $json [CkHttpResponse_bodyStr $resp]
set status [CkJsonObject_IntOf $json "status"]
puts "status = $status"
if {$status != 1} then {
# Failed. Base64 decode the error
# {"status":"0","error":"eyJlcnJvckNvZGVzIjoiMTA4In0="}
# For an invalid password, the error is: {"errorCodes":"108"}
set sbError [new_CkStringBuilder]
CkJsonObject_StringOfSb $json "error" $sbError
CkStringBuilder_Decode $sbError "base64" "utf-8"
puts "error: [CkStringBuilder_getAsString $sbError]"
delete_CkJsonObject $jsonAuth
delete_CkJsonObject $jsonData
delete_CkJsonObject $jsonRequestBody
delete_CkCrypt2 $crypt
delete_CkHttp $http
delete_CkHttpResponse $resp
delete_CkJsonObject $json
delete_CkStringBuilder $sbError
exit
}
CkJsonObject_put_EmitCompact $json 0
puts "JSON response:"
puts [CkJsonObject_emit $json]
set bdData [new_CkBinData]
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"}
set jsonBill [new_CkJsonObject]
CkJsonObject_Load $jsonBill [CkBinData_getString $bdData "utf-8"]
set ewayBillNo [CkJsonObject_IntOf $jsonBill "ewayBillNo"]
puts "ewayBillNo = $ewayBillNo"
set ewayBillDate [CkJsonObject_stringOf $jsonBill "ewayBillDate"]
puts "ewayBillDate = $ewayBillDate"
set validUpto [CkJsonObject_stringOf $jsonBill "validUpto"]
puts "validUpto = $validUpto"
# Sample output:
# ewayBillNo = 331001121234
# ewayBillDate = 24/05/2018 04:55:00 PM
# validUpto = 31/05/2018 11:59:00 PM
delete_CkJsonObject $jsonAuth
delete_CkJsonObject $jsonData
delete_CkJsonObject $jsonRequestBody
delete_CkCrypt2 $crypt
delete_CkHttp $http
delete_CkHttpResponse $resp
delete_CkJsonObject $json
delete_CkStringBuilder $sbError
delete_CkBinData $bdData
delete_CkJsonObject $jsonBill