亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

QQ third-party login development documents / 開(kāi)發(fā)攻略_Server-side

開(kāi)發(fā)攻略_Server-side

閱讀前提

本開(kāi)發(fā)攻略基于使用Authorization Code獲取Access Token的授權(quán)驗(yàn)證流程,適用于需要從web server訪(fǎng)問(wèn)的應(yīng)用,例如Web/wap網(wǎng)站。

閱讀本開(kāi)發(fā)攻略前,請(qǐng)閱讀【QQ登錄】使用Authorization Code獲取Access Token以了解認(rèn)證流程。

1. 體驗(yàn)一把

注:
本體驗(yàn)基于無(wú)Server端模式,但體驗(yàn)效果與有Server端模式一致。

1. 瀏覽器訪(fǎng)問(wèn):http://qzs.qq.com/qzone/openapi/client.html 。
2. 點(diǎn)擊頁(yè)面中的“登錄”按鈕:
Connect_logo_7.png
3. 在彈出的登錄框中輸入QQ帳號(hào)和密碼:
OAuth_guide_V2_4.png
4. 登錄成功后,跳轉(zhuǎn)到指定的回調(diào)地址,URL中帶有Access Token:
OAuth_guide_V2_5.png

2. 快速上手

準(zhǔn)備工作

1. 請(qǐng)確保您的網(wǎng)站已經(jīng)提交接入QQ登錄的申請(qǐng),并成功獲取到appid和appkey。申請(qǐng)接入
2. 請(qǐng)?jiān)谀愕姆?wù)器上ping openapi.qzone.qq.com ,保證網(wǎng)站和Qzone的連接暢通。

Step1:放置QQ登錄按鈕

網(wǎng)站需要下載“QQ登錄”按鈕圖片,并按照UI規(guī)范將按鈕放置在頁(yè)面合適的位置。
按鈕圖標(biāo)下載 按鈕放置規(guī)范

Step2:獲取Authorization Code

1. 打開(kāi)瀏覽器,訪(fǎng)問(wèn)如下地址(請(qǐng)將client_id,redirect_uri,scope等參數(shù)值替換為你自己的):

https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=[YOUR_APPID]&redirect_uri=[YOUR_REDIRECT_URI]&scope=[THE_SCOPE]



2. 如果用戶(hù)已經(jīng)有登錄態(tài),會(huì)彈出提示一個(gè)確認(rèn)頁(yè)。如果還沒(méi)有登錄,會(huì)彈出登錄頁(yè),如下圖所示:
OAuth_guide_V2_3.png
3. 成功登錄后,彈出授權(quán)框引導(dǎo)用戶(hù)授權(quán)(僅在第一次成功登錄,以及第一次訪(fǎng)問(wèn)某個(gè)未授權(quán)的OpenAPI時(shí)會(huì)出現(xiàn)授權(quán)頁(yè)),如下圖所示:
OAuth_guide_V2_6.png
注意:
如果用戶(hù)點(diǎn)擊“跳過(guò)”,則跳轉(zhuǎn)到回調(diào)地址,返回默認(rèn)的頭像、昵稱(chēng)和性別。
建議第三方應(yīng)用控制授權(quán)項(xiàng),即參數(shù)scope中只傳入必須使用的OpenAPI名稱(chēng)。因?yàn)槭跈?quán)項(xiàng)越多,用戶(hù)越有可能拒絕授權(quán)。

4. 如果用戶(hù)點(diǎn)擊“確認(rèn)”授權(quán),則成功跳轉(zhuǎn)到指定的redirect_uri,并跟上Authorization Code(注意此code會(huì)在10分鐘內(nèi)過(guò)期)。
例如回調(diào)地址是:www.qq.com/my.php,則會(huì)跳轉(zhuǎn)到:

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

注意:
回調(diào)地址建議設(shè)置為網(wǎng)站首頁(yè)或網(wǎng)站的用戶(hù)中心。

Step3:通過(guò)Authorization Code獲取Access Token

1.發(fā)送請(qǐng)求到如下地址(請(qǐng)將參數(shù)值替換為你自己的,參數(shù)解釋詳見(jiàn)這里):

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:

access_token=YOUR_ACCESS_TOKEN&expires_in=3600


可在回調(diào)URL對(duì)應(yīng)的程序(見(jiàn)下文的示例代碼)中接受請(qǐng)求,并完成獲取Access Token的工作。

特別提示:
獲取到的access token具有3個(gè)月有效期,用戶(hù)再次登錄時(shí)自動(dòng)刷新。
第三方網(wǎng)站可存儲(chǔ)access token信息,以便后續(xù)調(diào)用OpenAPI訪(fǎng)問(wèn)和修改用戶(hù)信息時(shí)使用。

Step4:使用Access Token來(lái)獲取用戶(hù)的OpenID

1. 發(fā)送請(qǐng)求到如下地址(請(qǐng)將access_token等參數(shù)值替換為你自己的):

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


2. 獲取到用戶(hù)OpenID,返回包如下:

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

Step5:使用Access Token以及OpenID來(lái)訪(fǎng)問(wèn)和修改用戶(hù)數(shù)據(jù)

1. 建議網(wǎng)站在用戶(hù)登錄后,即調(diào)用get_user_info接口,獲得該用戶(hù)的頭像、昵稱(chēng)并顯示在網(wǎng)站上,使用戶(hù)體驗(yàn)統(tǒng)一。
2. 調(diào)用其他OpenAPI,以訪(fǎng)問(wèn)和修改用戶(hù)數(shù)據(jù)。所有OpenAPI詳見(jiàn)【QQ登錄】API文檔。

以調(diào)用get_user_info接口為例:
(1)發(fā)送請(qǐng)求到get_user_info的URL(請(qǐng)將access_token,appid等參數(shù)值替換為你自己的):

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



(2)成功返回后,即可獲取到用戶(hù)數(shù)據(jù):

{

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

}


3. 示例代碼

<?php 
  //應(yīng)用的APPID
  $app_id = "YOUR_APP_ID";
  //應(yīng)用的APPKEY
  $app_secret = "YOUR_APP_KEY";
  //成功授權(quán)后的回調(diào)地址
  $my_url = "YOUR_REDIRECT_URL";

  //Step1:獲取Authorization Code
  session_start();
  $code = $_REQUEST["code"];
  if(empty($code)) 
  {
     //state參數(shù)用于防止CSRF攻擊,成功授權(quán)后回調(diào)時(shí)會(huì)原樣帶回
     $_SESSION['state'] = md5(uniqid(rand(), TRUE)); 
     //拼接URL     
     $dialog_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=" 
        . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
        . $_SESSION['state'];
     echo("<script> top.location.href='" . $dialog_url . "'</script>");
  }
 //Step2:通過(guò)Authorization Code獲取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") !== false)
     {
        $lpos = strpos($response, "(");
        $rpos = strrpos($response, ")");
        $response  = substr($response, $lpos + 1, $rpos - $lpos -1);
        $msg = json_decode($response);
        if (isset($msg->error))
        {
           echo "<h3>error:</h3>" . $msg->error;
           echo "<h3>msg  :</h3>" . $msg->error_description;
           exit;
        }
     }
  //Step3:使用Access Token來(lái)獲取用戶(hù)的OpenID
     $params = array();
     parse_str($response, $params);
     $graph_url = "https://graph.qq.com/oauth2.0/me?access_token=" 
     $params['access_token'];
     $str  = file_get_contents($graph_url);
     if (strpos($str, "callback") !== false)
     {
        $lpos = strpos($str, "(");
        $rpos = strrpos($str, ")");
        $str  = substr($str, $lpos + 1, $rpos - $lpos -1);
     }
     $user = json_decode($str);
     if (isset($user->error))
     {
        echo "<h3>error:</h3>" . $user->error;
        echo "<h3>msg  :</h3>" . $user->error_description;
        exit;
     }
     echo("Hello " . $user->openid);
  }
  else 
  {
  echo("The state does not match. You may be a victim of CSRF.");
  }
?>