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