Sample code for 30+ languages & platforms
Visual FoxPro

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 Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loPubkey
LOCAL lcPassword
LOCAL loRsa
LOCAL lcEncPassword
LOCAL loPrng
LOCAL lcApp_key
LOCAL lcEncAppKey
LOCAL loJsonBody
LOCAL loHttp
LOCAL loResp
LOCAL lnRespStatusCode
LOCAL loJson
LOCAL lnStatus
LOCAL loSbError
LOCAL lcAuthToken
LOCAL loCrypt
LOCAL loBdSek
LOCAL loJsonEwayAuth
LOCAL loFac

lnSuccess = 0

* 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('Chilkat.PublicKey')
lnSuccess = loPubkey.LoadFromFile("qa_data/pem/eway_publickey.pem")
IF (lnSuccess = 0) THEN
    ? loPubkey.LastErrorText
    RELEASE loPubkey
    CANCEL
ENDIF

* Encrypt the password using the RSA public key provided by eway..
lcPassword = "my_wepgst_password"
loRsa = CreateObject('Chilkat.Rsa')
loRsa.Charset = "utf-8"
loRsa.EncodingMode = "base64"

lnSuccess = loRsa.UsePublicKey(loPubkey)
IF (lnSuccess = 0) THEN
    ? loRsa.LastErrorText
    RELEASE loPubkey
    RELEASE loRsa
    CANCEL
ENDIF

* Returns the encrypted password as base64 (because the EncodingMode = "base64")
lcEncPassword = loRsa.EncryptStringENC(lcPassword,0)
IF (loRsa.LastMethodSuccess = 0) THEN
    ? loRsa.LastErrorText
    RELEASE loPubkey
    RELEASE loRsa
    CANCEL
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('Chilkat.Prng')
* Generate a random string containing some numbers, uppercase, and lowercase.
lcApp_key = loPrng.RandomString(32,1,1,1)

? "app_key = " + lcApp_key

* RSA encrypt the app_key.
lcEncAppKey = loRsa.EncryptStringENC(lcApp_key,0)
IF (loRsa.LastMethodSuccess = 0) THEN
    ? loRsa.LastErrorText
    RELEASE loPubkey
    RELEASE loRsa
    RELEASE loPrng
    CANCEL
ENDIF

* Prepare the JSON body for the HTTP POST that gets the access token.
loJsonBody = CreateObject('Chilkat.JsonObject')
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('Chilkat.Http')

* 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('Chilkat.HttpResponse')
lnSuccess = loHttp.HttpJson("POST","http://ewb.wepgst.com/api/Authenticate",loJsonBody,"application/json",loResp)
IF (lnSuccess = 0) THEN
    ? loHttp.LastErrorText
    RELEASE loPubkey
    RELEASE loRsa
    RELEASE loPrng
    RELEASE loJsonBody
    RELEASE loHttp
    RELEASE loResp
    CANCEL
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
    CANCEL
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('Chilkat.JsonObject')
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('Chilkat.StringBuilder')
    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
    CANCEL
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('Chilkat.Crypt2')
loCrypt.CryptAlgorithm = "aes"
loCrypt.CipherMode = "ecb"
loCrypt.KeyLength = 256
loCrypt.SetEncodedKey(lcApp_key,"us-ascii")
loCrypt.EncodingMode = "base64"

loBdSek = CreateObject('Chilkat.BinData')
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('Chilkat.JsonObject')
loJsonEwayAuth.UpdateString("authToken",lcAuthToken)
loJsonEwayAuth.UpdateString("decryptedSek",loBdSek.GetEncoded("base64"))
loJsonEwayAuth.EmitCompact = 0

loFac = CreateObject('Chilkat.FileAccess')
loFac.WriteEntireTextFile("qa_data/tokens/ewayAuth.json",loJsonEwayAuth.Emit(),"utf-8",0)

? "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