Sample code for 30+ languages & platforms
Lianja Requires Chilkat v11.0.0+

Get E-way Bill System Access Token

See more HTTP Misc Examples

Sends a request to get an E-way bill system access token.

Chilkat Lianja Downloads

Lianja
llSuccess = .F.

//  This example requires the Chilkat API to have been previously unlocked.
//  See Global Unlock Sample for sample code.

//  First load the public key provided by the E-way bill System
loPubkey = createobject("CkPublicKey")
llSuccess = loPubkey.LoadFromFile("qa_data/pem/eway_publickey.pem")
if (llSuccess = .F.) then
    ? loPubkey.LastErrorText
    release loPubkey
    return
endif

//  Encrypt the password using the RSA public key provided by eway..
lcPassword = "my_wepgst_password"
loRsa = createobject("CkRsa")
loRsa.Charset = "utf-8"
loRsa.EncodingMode = "base64"

llSuccess = loRsa.UsePublicKey(loPubkey)
if (llSuccess = .F.) then
    ? loRsa.LastErrorText
    release loPubkey
    release loRsa
    return
endif

//  Returns the encrypted password as base64 (because the EncodingMode = "base64")
lcEncPassword = loRsa.EncryptStringENC(lcPassword,.F.)
if (loRsa.LastMethodSuccess = .F.) then
    ? loRsa.LastErrorText
    release loPubkey
    release loRsa
    return
endif

//  Generate a random app_key.  This should be 32 bytes (us-ascii chars)
//  We need 32 bytes because we'll be doing 256-bit AES ECB encryption, and 32 bytes = 256 bits.
loPrng = createobject("CkPrng")
//  Generate a random string containing some numbers, uppercase, and lowercase.
lcApp_key = loPrng.RandomString(32,.T.,.T.,.T.)

? "app_key = " + lcApp_key

//  RSA encrypt the app_key.
lcEncAppKey = loRsa.EncryptStringENC(lcApp_key,.F.)
if (loRsa.LastMethodSuccess = .F.) then
    ? loRsa.LastErrorText
    release loPubkey
    release loRsa
    release loPrng
    return
endif

//  Prepare the JSON body for the HTTP POST that gets the access token.
loJsonBody = createobject("CkJsonObject")
loJsonBody.UpdateString("action","ACCESSTOKEN")
//  Use your username instead of "09ABDC24212B1FK".
loJsonBody.UpdateString("username","09ABDC24212B1FK")
loJsonBody.UpdateString("password",lcEncPassword)
loJsonBody.UpdateString("app_key",lcEncAppKey)

loHttp = createobject("CkHttp")

//  Add required headers.
//  Use your ewb-user-id instead of "03AEXPR16A9M010"
loHttp.SetRequestHeader("ewb-user-id","03AEXPR16A9M010")
//  The Gstin should be the same as the username in the jsonBody above.
loHttp.SetRequestHeader("Gstin","09ABDC24212B1FK")
loHttp.Accept = "application/json"

//  POST the JSON...
loResp = createobject("CkHttpResponse")
llSuccess = loHttp.HttpJson("POST","http://ewb.wepgst.com/api/Authenticate",loJsonBody,"application/json",loResp)
if (llSuccess = .F.) then
    ? loHttp.LastErrorText
    release loPubkey
    release loRsa
    release loPrng
    release loJsonBody
    release loHttp
    release loResp
    return
endif

lnRespStatusCode = loResp.StatusCode
? "response status code =" + str(lnRespStatusCode)
? "response body:"
? loResp.BodyStr

if (lnRespStatusCode <> 200) then
    ? "Failed in some unknown way."
    release loPubkey
    release loRsa
    release loPrng
    release loJsonBody
    release loHttp
    release loResp
    return
endif

//  When the response status code = 200, we'll have either
//  success response like this:
//   {"status":"1","authtoken":"...","sek":"..."}
//  
//  or a failed response like this:
//  
//  {"status":"0","error":"eyJlcnJvckNvZGVzIjoiMTA4In0="}

//  Load the response body into a JSON object.
loJson = createobject("CkJsonObject")
loJson.Load(loResp.BodyStr)

lnStatus = loJson.IntOf("status")
? "status = " + str(lnStatus)

if (lnStatus <> 1) then
    //  Failed.  Base64 decode the error
    //  {"status":"0","error":"eyJlcnJvckNvZGVzIjoiMTA4In0="}
    //  For an invalid password, the error is: {"errorCodes":"108"}
    loSbError = createobject("CkStringBuilder")
    loJson.StringOfSb("error",loSbError)
    loSbError.Decode("base64","utf-8")
    ? "error: " + loSbError.GetAsString()
    release loPubkey
    release loRsa
    release loPrng
    release loJsonBody
    release loHttp
    release loResp
    release loJson
    release loSbError
    return
endif

//  At this point, we know the request was entirely successful.
lcAuthToken = loJson.StringOf("authtoken")

//  Decrypt the sek key using our app_key.
loCrypt = createobject("CkCrypt2")
loCrypt.CryptAlgorithm = "aes"
loCrypt.CipherMode = "ecb"
loCrypt.KeyLength = 256
loCrypt.SetEncodedKey(lcApp_key,"us-ascii")
loCrypt.EncodingMode = "base64"

loBdSek = createobject("CkBinData")
loBdSek.AppendEncoded(loJson.StringOf("sek"),"base64")
loCrypt.DecryptBd(loBdSek)

//  bdSek now contains the decrypted symmetric encryption key...
//  We'll use it to encrypt the JSON payloads we send.

//  Let's persist our authtoken and decrypted sek (symmetric encryption key).
//  To send EWAY requests (such as to create an e-way bill), we'll just load 
//  and use these pre-obtained credentials.
loJsonEwayAuth = createobject("CkJsonObject")
loJsonEwayAuth.UpdateString("authToken",lcAuthToken)
loJsonEwayAuth.UpdateString("decryptedSek",loBdSek.GetEncoded("base64"))
loJsonEwayAuth.EmitCompact = .F.

loFac = createobject("CkFileAccess")
loFac.WriteEntireTextFile("qa_data/tokens/ewayAuth.json",loJsonEwayAuth.Emit(),"utf-8",.F.)

? "Saved:"
? loJsonEwayAuth.Emit()

//  Sample output:
//  {
//    "authToken": "IBTeFtxNfVurg71LTzZ2r0xK7",
//    "decryptedSek": "5g1TyTie7yoslU3DrbYATa7mWyPazlODE7cEh5Vy4Ho="
//  }


release loPubkey
release loRsa
release loPrng
release loJsonBody
release loHttp
release loResp
release loJson
release loSbError
release loCrypt
release loBdSek
release loJsonEwayAuth
release loFac