騰訊開放平臺——client id is illegal(100008)!錯誤解決
今天心血來潮想借騰訊的開放平臺熟悉oauth。結果就擺弄了起來,騰訊的文件還是寫得很詳細的,比我上一次看的已經好很多了。而且還提供了sdk,可以快速呼叫騰訊的開放平臺,既然是學習來的,也就沒圖快,決定從零開始,手寫程式碼。
一切都是按文件來的,可沒想到第一步取access token就受挫了:
程式碼如下:
- functionget_access_token(){
- varreq_url=‘https://graph.qq.com/oauth2.0/authorize‘;
- varreq_data={
- ‘response_type‘:‘token‘,//授權型別,此值固定為“token”
-
‘client_id
- ‘redirect_uri‘:‘http://www.goodje.com/labs/login/qq_login.php‘,//成功授權後的回撥地址,建議設定為網站首頁或網站的使用者中心。
- /*
- 請求使用者授權時向用戶顯示的可進行授權的列表。
- 可填寫的值是【QQ登入】API文件中列出的介面,以及一些動作型的授權(目前僅有:do_like),如果要填寫多個介面名稱,請用逗號隔開。
- 例如:scope=get_user_info,list_album,upload_pic,do_like
- 不傳則預設請求對介面get_user_info進行授權。
-
建議控制授權項的數量,只傳入必要的介面名稱,因為授權項越多,使用者越可能拒絕進行任何授權。
- */
- ‘scope‘:‘get_user_info‘,
- ‘state‘:‘comeonbb‘//client端的狀態值。用於第三方應用防止CSRF攻擊,成功授權後回撥時會原樣帶回。
- //’display’: ‘mobile’//用於展示的樣式。不傳則預設展示為為PC下的樣式。如果傳入“mobile”,則展示為mobile端下的樣式
- }
- window.open(req_url+‘?‘+buildHttpData(req_data));
- }
buildHttpData是我自定義的函式,用於把一個js物件轉化為格式化的url引數。返回值為 {時間戳}&name1=value1&name2=value2&…
然後拼接req_url 後為: https://graph.qq.com/oauth2.0/authorize?1320327350000&response_type=token&client_id=201981&redirect_uri=http%3A%2F%2Fwww.goodje.com%2Flabs%2Flogin%2Fqq_login.php&scope=get_user_info&state=comeonbb
結果,就有了剛才那種情況了
後來分析了半天,網上也完全找不到解決辦法,對比了文件上url的格式,發現除了多了時間戳外一點區別都沒有,我想了下可能是引數必須是name=value的形式,服務端才能認識吧,因為url中有這麼一段:?1320327350000&
而時間戳主要是之前為了防止ajax請求時讀到快取,所以才自動加上的,以前是從來都沒有問題的,去掉了時間戳後,還不行,急了,仔細一看url,引數部分最前頭還有個&,去了之後,好了,擦。。。
正確的獲取access token url為:https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=201981&redirect_uri=http%3A%2F%2Fwww.goodje.com%2Flabs%2Flogin%2Fqq_login.php&state=comeonbb
而如果把時間戳或者任意一段字串(只要是url中允許存在的字元,而且不是name=value的形式)放到url末尾,也會有問題
如:https://graph.qq.com/oauth2.0/authorize?response_type=token&client_id=201981&redirect_uri=http%3A%2F%2Fwww.goodje.com%2Flabs%2Flogin%2Fqq_login.php&scope=get_user_info&state=comeonbb&1320327350000
會報lost which in paraml(1000028)!錯誤
看了下響應頭,server: tnginx
tnginx, 騰訊二次開發並優化過的nginx。難道優化的時候去掉了啥東西麼,我記得nginx不會這樣的呀,理論上這是騰訊的一個bug,不說了,反正是很坑爹的。