開發攻略_Server-side


閱讀前提

本開發攻略基於使用Authorization Code取得Access Token的授權驗證流程,適用於需要從web server存取的應用,例如Web/wap網站。

閱讀本開發攻略前,請閱讀【QQ登入】使用Authorization Code取得Access Token以了解認證流程。

1. 體驗一把

#註:
本體驗是基於無Server端模式,但體驗效果與有Server端模式一致。

1. 瀏覽器存取:http://qzs.qq.com/qzone/openapi/client.html 。
2. 點選頁面中的「登入」按鈕:
Connect_logo_7.png
3. 在彈出的登入框中輸入QQ帳號和密碼:
OAuth_guide_V2_4.png
4. 登入成功之後,跳到指定的回呼位址,URL中帶有Access Token:
OAuth_guide_V2_5.png

#2. 快速上手



準備工作

1. 請確保您的網站已經提交存取QQ登入的申請,並成功取得到appid和appkey。申請接入

2. 請在你的伺服器上ping openapi.qzone.qq.com ,保證網站和Qzone的連線暢通。

Step1:放置QQ登入按鈕
######網站需要下載「QQ登入」按鈕圖片,並依照UI規格將按鈕放置在頁面合適的位置。 ###按鈕圖示下載按鈕放置規格###############Step2:取得Authorization Code#########1. 開啟瀏覽器,存取下列位址(請將client_id,redirect_uri,scope等參數值替換為你自己的):############https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=[YOUR_APPID] &redirect_uri=[YOUR_REDIRECT_URI]&scope=[THE_SCOPE]######



2. 如果使用者已經有登入態,會跳出提示一個確認頁。如果還沒有登錄,會彈出登入頁,如下圖所示:
OAuth_guide_V2_3.png
3. 成功登入後,彈出授權框引導使用者授權(僅在第一次成功登錄,以及第一次訪問某個未授權的OpenAPI時會出現授權頁),如下圖所示:
OAuth_guide_V2_6.png
注意:
如果使用者點擊“跳過”,則跳到回調地址,傳回預設的頭像、暱稱和性別。
建議第三方應用控制授權項,即參數scope中只傳入必須使用的OpenAPI名稱。因為授權項越多,使用者越有可能拒絕授權。

4. 如果使用者點選「確認」授權,則成功跳到指定的redirect_uri,並跟上Authorization Code(注意此code會在10分鐘內過期)。
例如回呼位址是:www.qq.com/my.php,則會跳到:

http://www.qq.com/my.php? code=520DD95263C1CFEA0870FBB66E******

注意:
回呼地址建議設定為網站首頁或網站的使用者中心。

Step3:透過Authorization Code取得Access Token

1.傳送請求到以下位址(請將參數值替換為你自己的,參數解釋詳見這裡):

https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=[YOUR_APP_ID]&client_secret=[YOUR_APP_Key] &code=[The_AUTHORIZATION_CODE]&state=[The_CLIENT_STATE]&redirect_uri=[YOUR_REDIRECT_URI]


2. 即可取得到Access Token:

##token##access_token=# YOUR_ACCESS_TOKEN&expires_in=3600

#可在回呼URL對應的程式(請參閱下文的範例程式碼)中接受請求,並完成取得Access Token的工作。



特別提示:

取得到的access token具有3個月有效期,用戶再次登入時會自動刷新。
第三方網站可儲存access token訊息,以便後續呼叫OpenAPI存取和修改使用者資訊時使用。

#

Step4:使用Access Token來取得使用者的OpenID

1. 發送請求到以下位址(請將access_token等參數值替換為你自己的):

https://graph.qq.com/oauth2.0/me?access_token=YOUR_ACCESS_TOKEN


2. 取得到用戶OpenID,傳回套件如下:

callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} );

#Step5:使用Access Token以及OpenID來存取和修改使用者資料

#1. 建議網站在使用者登入後,即呼叫get_user_info接口,取得該使用者的頭像、暱稱並顯示在網站上,使用戶體驗統一。
2. 呼叫其他OpenAPI,以存取和修改使用者資料。所有OpenAPI詳見【QQ登入】API文件。

以呼叫get_user_info介面為例:
(1)發送請求到get_user_info的URL(請將access_token,appid等參數值替換為你自己的):

https://graph.qq.com/user/get_user_info?access_token=YOUR_ACCESS_TOKEN&oauth_consumer_key=YOUR_APP_ID&openid=YOUR_OPENID



#(2)成功回傳後,即可取得到成功回傳後,即可取得到成功回傳後,即可取得到成功回傳後,即可取得到成功回傳後,即可取得到使用者資料:

{

   "ret":0,
   "msg":"",
   "nickname":"YOUR_NICK_NAME",
   ...

}

#


3. 範例程式碼

< ;?php 
  //應用的APPID
  $app_id = "YOUR_APP_ID";
  //應用的APPKEY
  $app_secret = "YOUR_APP_EYEY";
KEY/app_secret 
  $my_url = "YOUR_REDIRECT_URL";

  //Step1:取得Authorization Code
  session_start();
  $code” ($code)) 
  {
     //state參數用於防止CSRF攻擊,成功授權後回呼時會原樣帶回
     $_SESSION['state'] = rand5(uniqid(Nqid(Oqid(),qid( TRUE)); 
     //拼接URL     
     $dialog_url = "https://graph.qq.com/oauth2.0/authorize?response_ "&redirect_uri=" . urlencode($my_url) . "&state="
       . $_SESSION['state'];
     echo("<) script>");
  }

#
 //Step2:透過授權碼取得Access Token
#  if($_REQUEST['state'] == $_SESSION['state']) 
  {
    # //切割URL ##     $token_url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&"
     . “client_id=”。 $app_id。 “&redirect_uri=”。 urlencode($my_url)
     。 “&client_secret=”。 $app_secret。 “&code=”。 $code;
     $response = file_get_contents($token_url);
     if (strpos($response, "callback") !== pos($response, " (");
        $rpos = strrpos($response,")");
        $response     $msg = json_decode($response);
        if (isset($msg->error))
        {
  。 $msg->error;
           echo "<h3>msg  :</h3>" 。 $msg->error_description;
           退出;
        }
     ,

}
  //Step3:使用Access Token取得使用者的OpenID
     $params = array();
     parse_str($response,#$params);##params); / /graph.qq.com/oauth2.0/me?access_token=" 
     $params['access_token'];
      "回呼") !== false)
     {
        $lpos = strpos($str, "(");
   str = substr($str, $lpos 1, $rpos-$lpos-1);
     }
     $user = json_decode($str);
    $user = json_decode($str);
    ##     {
        echo "<h3>錯誤:</h3>" 。 $user->error;
        echo "<h3>msg  :</h3>" 。 $user->error_description;
        退出;
     }
     echo("Hello " . 不匹配。您可能是CSRF 的受害者。”);
}
?>






##