开发攻略_Server-side

收藏685

阅读17211

更新时间2022-04-11

阅读前提

本开发攻略基于使用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:

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. 示例代码

  //应用的APPID
  $app_id = "YOUR_APP_ID";
  //应用的APPKEY
  $app_secret = "YOUR_APP_KEY";
  //成功授权后的回调地址
  $my_url = "YOUR_REDIRECT_URL";

  //Step1:获取Authorization Code
  session_start();
  $code = $_REQUEST["code"];
  if(empty($code)) 
  {
     //state参数用于防止CSRF攻击,成功授权后回调时会原样带回
     $_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("");
  }
 //Step2:通过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 "

error:

" . $msg->error;
           echo "

msg  :

" . $msg->error_description;
           exit;
        }
     }
  //Step3:使用Access Token来获取用户的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 "

error:

" . $user->error;
        echo "

msg  :

" . $user->error_description;
        exit;
     }
     echo("Hello " . $user->openid);
  }
  else 
  {
  echo("The state does not match. You may be a victim of CSRF.");
  }
?>


相关

视频

RELATED VIDEOS

更多

免费

Web前端开发极速入门
初级 Web前端开发极速入门

219920次学习

收藏

免费

前端入门_HTML5
初级 前端入门_HTML5

616946次学习

收藏

免费

30分钟学会网站布局
初级 30分钟学会网站布局

238440次学习

收藏

免费

CSS视频教程-玉女心经版
初级 CSS视频教程-玉女心经版

393054次学习

收藏

免费

独孤九贱(1)_HTML5视频教程

免费

独孤九贱(6)_jQuery视频教程

免费

独孤九贱(7)_Bootstrap视频教程

免费

独孤九贱(2)_CSS视频教程
初级 独孤九贱(2)_CSS视频教程

229605次学习

收藏

科技资讯

更多

精选课程

更多
前端入门_HTML5
前端入门_HTML5

共29课时

61.7万人学习

CSS视频教程-玉女心经版
CSS视频教程-玉女心经版

共25课时

39.3万人学习

JavaScript极速入门_玉女心经系列
JavaScript极速入门_玉女心经系列

共43课时

70.9万人学习

独孤九贱(1)_HTML5视频教程
独孤九贱(1)_HTML5视频教程

共25课时

61.6万人学习

独孤九贱(2)_CSS视频教程
独孤九贱(2)_CSS视频教程

共22课时

23万人学习

独孤九贱(3)_JavaScript视频教程
独孤九贱(3)_JavaScript视频教程

共28课时

33.9万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时

125万人学习

关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号