PureBasic
PureBasic
ETrade Renew Access Token
See more ETrade Examples
Renews an ETrade OAuth access token.Chilkat PureBasic Downloads
IncludeFile "CkJsonObject.pb"
IncludeFile "CkHttp.pb"
IncludeFile "CkFileAccess.pb"
IncludeFile "CkHashtable.pb"
IncludeFile "CkStringBuilder.pb"
IncludeFile "CkHttpResponse.pb"
Procedure ChilkatExample()
success.i = 0
; This requires the Chilkat API to have been previously unlocked.
; See Global Unlock Sample for sample code.
http.i = CkHttp::ckCreate()
If http.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkHttp::setCkOAuth1(http, 1)
CkHttp::setCkOAuthVerifier(http, "")
CkHttp::setCkOAuthConsumerKey(http, "ETRADE_CONSUMER_KEY")
CkHttp::setCkOAuthConsumerSecret(http, "ETRADE_CONSUMER_SECRET")
; Load the access token previously obtained via the OAuth1 Authorization
jsonToken.i = CkJsonObject::ckCreate()
If jsonToken.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkJsonObject::ckLoadFile(jsonToken,"qa_data/tokens/etrade.json")
If success <> 1
Debug "Failed to load OAuth1 token"
CkHttp::ckDispose(http)
CkJsonObject::ckDispose(jsonToken)
ProcedureReturn
EndIf
CkHttp::setCkOAuthToken(http, CkJsonObject::ckStringOf(jsonToken,"oauth_token"))
CkHttp::setCkOAuthTokenSecret(http, CkJsonObject::ckStringOf(jsonToken,"oauth_token_secret"))
resp.i = CkHttpResponse::ckCreate()
If resp.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkHttp::ckHttpNoBody(http,"GET","https://api.etrade.com/oauth/renew_access_token",resp)
If success = 0
Debug CkHttp::ckLastErrorText(http)
CkHttp::ckDispose(http)
CkJsonObject::ckDispose(jsonToken)
CkHttpResponse::ckDispose(resp)
ProcedureReturn
EndIf
; Make sure a successful response was received.
If CkHttpResponse::ckStatusCode(resp) <> 200
Debug CkHttpResponse::ckStatusLine(resp)
Debug CkHttpResponse::ckHeader(resp)
Debug CkHttpResponse::ckBodyStr(resp)
CkHttp::ckDispose(http)
CkJsonObject::ckDispose(jsonToken)
CkHttpResponse::ckDispose(resp)
ProcedureReturn
EndIf
; If successful, the resp.BodyStr contains something like this:
; oauth_token=%3TiQRgQCRGPo7Xdk6G8QDSEzX0Jsy6sKNcULcDavAGgU%3D&oauth_token_secret=%7RrC9scEpzcwSEMy4vE7nodSzPLqfRINnTNY4voczyFM%3D
Debug CkHttpResponse::ckBodyStr(resp)
sbRespBody.i = CkStringBuilder::ckCreate()
If sbRespBody.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkHttpResponse::ckGetBodySb(resp,sbRespBody)
If CkStringBuilder::ckContentsEqual(sbRespBody,"Access Token has been renewed",0)
; The documentation at https://apisb.etrade.com/docs/api/authorization/renew_access_token.html
; indicates that the response should be as described above. However, the response received when
; trying to refresh a non-expired token was "Access Token has been renewed"
Debug "Keeping the same access token, but it's renewed..."
CkHttp::ckDispose(http)
CkJsonObject::ckDispose(jsonToken)
CkHttpResponse::ckDispose(resp)
CkStringBuilder::ckDispose(sbRespBody)
ProcedureReturn
EndIf
hashTab.i = CkHashtable::ckCreate()
If hashTab.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkHashtable::ckAddQueryParams(hashTab,CkHttpResponse::ckBodyStr(resp))
accessToken.s = CkHashtable::ckLookupStr(hashTab,"oauth_token")
accessTokenSecret.s = CkHashtable::ckLookupStr(hashTab,"oauth_token_secret")
; The access token + secret is what should be saved and used for
; subsequent REST API calls.
Debug "Access Token = " + accessToken
Debug "Access Token Secret = " + accessTokenSecret
; Save this access token for future calls.
; Just in case we need user_id and screen_name, save those also..
json.i = CkJsonObject::ckCreate()
If json.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkJsonObject::ckAppendString(json,"oauth_token",accessToken)
CkJsonObject::ckAppendString(json,"oauth_token_secret",accessTokenSecret)
fac.i = CkFileAccess::ckCreate()
If fac.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkFileAccess::ckWriteEntireTextFile(fac,"qa_data/tokens/etrade.json",CkJsonObject::ckEmit(json),"utf-8",0)
Debug "Success."
CkHttp::ckDispose(http)
CkJsonObject::ckDispose(jsonToken)
CkHttpResponse::ckDispose(resp)
CkStringBuilder::ckDispose(sbRespBody)
CkHashtable::ckDispose(hashTab)
CkJsonObject::ckDispose(json)
CkFileAccess::ckDispose(fac)
ProcedureReturn
EndProcedure