最近在忙與淘寶做對接的工作,總體感覺淘寶的api文檔做的還不錯,不僅有沙箱測試環境,而且對於每一個api都可以通過api測試工具生成想要的代碼,你完全可以先在測試工具中測試之后再進行代碼的編寫,這樣就減少了我們不停修改代碼的次數;但是有一點淘寶的文檔上沒有說明,sessionkey(有的地方也稱是accessToken)的有效期比較短,如果沒有你的應用沒有發布的話,那么你的sessionkey的有效期只有1天,如果sessionkey過期了,私有的數據你就不能進行訪問了。這個問題折騰了我一天半,當遇到這個問題之后,我立即發揚問度娘傳統,但是非常的失望,基本上都是用JAVA的,.net也只有winform形式的,對於webform中沒有提及。期間仿照JAVA的代碼進行編碼,但是失敗了,可能是因為對.net沒有達到滾瓜爛熟的地步,有些java的方法和對象我在.net都沒有找到與之對應的方法和對象,就這樣一直試,最終還是以失敗告終。最后還是在淘寶的文檔中找到了方法,不過這個方法的有效時間是多久還需要在之后進行驗證。真是后悔自己沒有好好的看看文檔,導致浪費了大量的時間。下面就說說我是如何實現自動獲取淘寶API的SessionKey。
首先還是建議大家想看一下淘寶提供的文檔http://open.taobao.com/doc/detail.htm?spm=0.0.0.0.nDCovh&id=118,這篇文檔比較詳細的介紹了在各個平台上如何延長SessionKey的有效期,我使用的是Refreshing an Access Token(通過刷新令牌刷新訪問令牌)方式來延長訪問令牌的時間。一般來說有三步,獲取授權碼code,得到訪問令牌和刷新令牌,通過刷新令牌刷新訪問令牌的有效期。下面對這三個部分進行說明,不過只針對采用Oauth2.0進行身份驗證和授權協議的應用。
下面這幅圖是淘寶文檔上的,它說明了淘寶OAuth2.0的授權過程:
- 獲取授權碼Code
其實獲取授權碼Code非常的簡單,只要你按照https://oauth.taobao.com/authorize?response_type=code&client_id=12304977&redirect_uri=http://www.oauth.net/2/&state=1212&view=web這種Url的格式,將連接中的client_id和redirect_uri替換成自己的就行,然后在瀏覽器輸入該地址,回調的地址中就有code。這條Url中,client_id是我們從淘寶中獲取到的AppKey,回調地址改成自己的本地地址就行。
- 獲取訪問令牌和刷新令牌
獲取訪問令牌這一操作建議每一次要獲取數據時就進行一次操作,這樣可以保證訪問令牌SessionKey和Refresh_key保持最新。剛開始的時候,這一步我就執行了一次,獲取刷新令牌后,以為刷新令牌的有效期會很長,可是第二天我運行第三步的代碼是,發現出現了400錯誤,沒辦法,我又重新來了一遍同樣的操作。現在我也沒有弄明白是什么原因導致刷新令牌不能使用,如果有人知道,還請留下你的足跡,我猜可能是刷新令牌過期了。獲取刷新令牌和訪問令牌的代碼如下:
Top.Api.Util.WebUtils wu = new Top.Api.Util.WebUtils(); IDictionary<string, string> param = new Dictionary<string, string>(); param.Add("grant_type", "authorization_code"); param.Add("code",code); param.Add("client_id", appkey); param.Add("client_secret", appsecret); param.Add("redirect_uri", "http://192.168.3.120"); param.Add("view", "web"); string response = wu.DoPost(tokenUrl, param);
這里的DoPost方法返回的是Json格式的數據,需要使用JavaScriptSerializer進行解析。這樣就獲取到了access_token和refresh_token。下面就進入下一步,進行訪問令牌的有效期進行刷新。
- 刷新訪問令牌的有效期
一般來說,如果你的應用沒有發布,那么你的sessionKey的有效期是1天,我的應用沒有發布,刷新之后,訪問令牌的有效期變成了兩天,不知道發布之后的應用有效期能夠刷到多久,知道的還麻煩留下足跡。刷新令牌有效期的代碼如下:
Top.Api.Util.WebUtils wu = new Top.Api.Util.WebUtils(); IDictionary<string, string> param = new Dictionary<string, string>(); param.Add("grant_type", "refresh_token"); param.Add("refresh_token", refreshToken); param.Add("client_id", appKey); param.Add("client_secret", appSecret); param.Add("view", "web"); string response = wu.DoPost(refreshTokenUrl, param);
和上面一樣,返回的數據格式為json格式。
還要說的是,刷新令牌需要在刷新有效期內進行刷新,不然運行代碼時可能會報錯。建議是將使用授權碼Code獲取刷新令牌和訪問令牌這段代碼放入一個Job中,根據刷新令牌的有效期來設置job運行的間隔時間。
其實如果參照TopApi的文檔,很容易就能掌握上面的知識,只是很多時候我們都在追求速度,對於文檔都不細看,當遇到問題時,還是需要倒過來閱讀文檔,這與之前的意圖背道而馳,希望自己能夠吸取這次的教訓。