一、 在QQ互联官网上注册开发者账号、获取APP ID和APP Key

QQ互联的官网:https://connect.qq.com/



根据步骤按部就班的来就行了。

在创建应用的时候,基本信息要认真填,一般第二天就会审核好,我当时不知道怎么填,在这里浪费了好几天时间呢

此处网站名称必须得和备案的域名信息一致

网站回调地址很简单,备案过的域名就行了,但是注意回调域,要填该网站地址下的子级目录,回调域就是登录成功后的回调地址,当用户使用QQ登录成功时,会自动跳转到这个回调页面下,所以开发者可以在里面处理一些数据库或者是Session的操作

创建好了一个应用后,就可以获得APP ID和APP Key:

官方文档教程:https://wiki.connect.qq.com/准备工作_oauth2-0


二、PHP的QQ登录代码下载

我之所以在文章标题说我写的登录调用超简单,是因为我就只用到了三个文件(如下图所示),下载地址:https://download.csdn.net/download/jal517486222/11347475 , 文中也给出了这三个文件的完整代码。

如果去QQ互联网站上下载PHP版本demo的话,会发现demo中有好多个文件夹,文件夹里又有好几个文件,让人都看不下去。

如果你接入QQ只是为了获取用户的昵称、性别、头像这些不用授权的信息,那直接参考我的代码就行了,我的代码就是从官方demo的代码提炼出来的三个文件,绝对非常方便实用。


三、代码使用(代码解释见注释)

1. 首先在页面上放置一个QQ登录的链接或者按钮

我是在登录页面和个人后台管理页面都放置了一个QQ登录的图片按钮,为的是让用户可以在个人后台点击按钮绑定QQ,绑定后以后在登录页面时就可以使用QQ登录了。这个QQ登录图片可以在QQ互联的网站上下载的。
这里代码比较简单,主要就是一个QQ登录的链接,所以这个代码我就没放到上面的QQ_Oauth文件夹里了。

  • 下图是用户后台绑定QQ:

关键代码如下:

 <p>QQ绑定(开发中):<?phpif(empty($openId)){//$openId是在数据库的users表中查看当前用户是不是已经绑定过了QQecho ' <a href="#" οnclick=\'toLogin()\'><img src="../image/QQ_login.png"></a>';}else{echo $QQ_nick;echo '<a class="layui-btn layui-btn-xs layui-btn-danger" href="#" οnclick=\'unbind()\'>解除绑定</a>';}?></p>
<script>
function toLogin()
{//以下为按钮点击事件的逻辑。注意这里要重新打开窗口//否则后面跳转到QQ登录,授权页面时会直接缩小当前浏览器的窗口,而不是打开新窗口var A=window.open("../QQ_Oauth/index.php","TencentLogin","width=700,height=500,menubar=0,scrollbars=1,resizable=1,status=1,titlebar=0,toolbar=0,location=1");//定时判断是否新窗口已经被关闭了,如果被关闭了,则执行刷新页面的操作。var loop = setInterval(function() {if(A.closed) {clearInterval(loop);//alert('closed');parent.location.reload();}}, 1);}function unbind(){//解除QQ绑定if(confirm("你确定要解除此账号当前绑定的QQ吗?")){//我在这里的解绑操作就是清空了当前用户的users表中的openID字段就行了。$.post("doPost.php?action=unbindQQ", {}, function(r){if($.trim(r)==='success'){alert("解除绑定成功!");window.location.reload();}else{alert("解除绑定失败!");}});}}
</script>

其中doPost.php中只做了清空users表QQOpenId、QQ_nick字段的操作

if (isset($_GET['action']) && $_GET['action'] == 'unbindQQ') {if (!(isset($_SESSION[$OJ_NAME . '_' . 'user_id']))) {//未登录echo "error";}else{pdo_query("update users set QQOpenId = '', QQ_nick = '' where user_id = ?", $_SESSION[$OJ_NAME . '_' . 'user_id']);echo "success";}
}
  • 下图是登录页面

    代码跟上面的类似,不同的是登录成功后,上面的代码是执行刷新操作,而下面的代码是跳转到之前的页面或者是跳转到首页。
<a href="#" onclick='toLogin()'><img src="data:image/QQ_login.png"></a>
<script>function toLogin(){//以下为按钮点击事件的逻辑。注意这里要重新打开窗口//否则后面跳转到QQ登录,授权页面时会直接缩小当前浏览器的窗口,而不是打开新窗口var A=window.open("QQ_Oauth/index.php","TencentLogin", "width=700,height=500,menubar=0,scrollbars=1,resizable=1,status=1,titlebar=0,toolbar=0,location=1");var loop = setInterval(function() {if(A.closed) {clearInterval(loop);//alert('closed');// parent.location.reload();<?phpif($OJ_NEED_LOGIN)echo "window.location.href='index.php';\n";elseecho "history.go(-2);\n";?>}}, 1);}</script>

2. 填写配置文件config.php

  • QQ_Oauth/config.php完整代码如下:
<?php
@session_start();
//申请到的appid
$_SESSION["appid"]    = 1*******4; //申请到的appkey
$_SESSION["appkey"]   = "7**********************3"; //QQ登录成功后跳转的地址,请确保地址真实可用,否则会导致登录失败。
//这个地址务必要细心填写,得和QQ互联网站上创建的应用的网站回调域一致,我当时就是因为这个没填好耽误了时间。
$_SESSION["callback"] = "http://acm.webturing.com/JudgeOnline/QQ_Oauth/callback.php";//QQ授权api接口.按需调用
$_SESSION["scope"] = "get_user_info";//get_user_info是不需要用户授权的,可以直接使用?>

3. 用户点击qq登录按钮浏览器新窗口打开QQ_Oauth/index.php页面,生成登录页面,进行登录准备

我们可以看到上面的登录按钮跳转的是新窗口打开QQ_Oauth/index.php页面,
当点击上面的QQ登录按钮的时候,将会打开登录页面

  • QQ_Oauth/index.php完整代码如下:
<?php
require_once("config.php");
@session_start();function qq_login($appid, $scope, $callback)
{$_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection$login_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=". $appid . "&redirect_uri=" . urlencode($callback). "&state=" . $_SESSION['state']. "&scope=".$scope;header("Location:$login_url");
}//用户点击qq登录按钮调用此函数
qq_login($_SESSION["appid"], $_SESSION["scope"], $_SESSION["callback"]);
?>

可以从上面代码中看到我们是请求了https://graph.qq.com/oauth2.0/authorize去生成QQ登录页面的,并且我们要带上正确的$_SESSION["appid"], $_SESSION["scope"], $_SESSION["callback"]这三个参数,这三个参数都是在config.php中配的。

4. 用户使用QQ登录成功后,进入回调页面QQ_Oauth/callback.php

用户登录成功后,则会自动进入QQ_Oauth/callback.php这个回调页面

  • QQ_Oauth/callback.php完整代码如下:
<?php
require_once("config.php");
include_once "../include/db_info.inc.php";function qq_callback()
{//debug
//    print_r($_REQUEST);
//    print_r($_SESSION);if($_REQUEST['state'] == $_SESSION['state']) //csrf{$token_url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&". "client_id=" . $_SESSION["appid"]. "&redirect_uri=" . urlencode($_SESSION["callback"]). "&client_secret=" . $_SESSION["appkey"]. "&code=" . $_REQUEST["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;}}$params = array();parse_str($response, $params);//debug//print_r($params);//set access token to session$_SESSION["access_token"] = $params["access_token"];}else{echo("The state does not match. You may be a victim of CSRF.");}
}function get_openid()
{$graph_url = "https://graph.qq.com/oauth2.0/me?access_token=". $_SESSION['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;}//debug//echo("Hello " . $user->openid);//set openid to session$_SESSION["openid"] = $user->openid;
}function get_user_info()
{$get_user_info = "https://graph.qq.com/user/get_user_info?". "access_token=" . $_SESSION['access_token']. "&oauth_consumer_key=" . $_SESSION["appid"]. "&openid=" . $_SESSION["openid"]. "&format=json";$info = file_get_contents($get_user_info);$arr = json_decode($info, true);return $arr;
}//QQ登录成功后的回调地址,主要保存access token
qq_callback();//获取用户标示id
get_openid();//获取用户基本资料
$arr = get_user_info();if (!(isset($_SESSION[$OJ_NAME . '_' . 'user_id']))) {//未登录,说明在进行登录操作,通过OpenID查得User_id进行登录,更新这个用户的session$openid_users = pdo_query("select user_id from users where QQOpenId = ?", $_SESSION["openid"]);if(count($openid_users) > 0){$user_id = $openid_users[0]['user_id'];$_SESSION[$OJ_NAME.'_'.'user_id']=$user_id;$result=pdo_query("SELECT `rightstr` FROM `privilege` WHERE `user_id`=?",$user_id);foreach ($result as $row)$_SESSION[$OJ_NAME.'_'.$row['rightstr']]=true;$sql = "update users set accesstime = NOW() where user_id=?";$result = pdo_query($sql, $user_id);if ($OJ_SIMPLE_LOGIN){$session_id = session_id();pdo_query("update users set session_id = ? where user_id = ?", $session_id, $user_id);}}else{echo "<script>alert('此QQ尚未绑定任何OJ账号!');</script>";}
}else{//已登录,说明在进行绑定操作,更新OpenID和QQNick$openid_users = pdo_query("select user_id from users where QQOpenId = ?", $_SESSION["openid"]);if(count($openid_users) > 0){echo "<script>alert('此QQ已绑定别的账号!');</script>";}else{$user_id = $_SESSION[$OJ_NAME . '_' . 'user_id'];pdo_query("update users set QQOpenId = ?, QQ_nick = ? where user_id = ?", $_SESSION["openid"], $arr['nickname'], $user_id);}
}//print_r($_SESSION);
echo "<script>window.close();</script>";
?>

我在判断$_REQUEST['state'] == $_SESSION['state']还遇到了一个小坑,记录在此了:域名不一致导致CSRF验证失败

当callback.php执行结束后,这个窗口就会关闭,如果之前用户在进行登录操作,则是完成了登录,页面将会发生跳转,如果用户之前是在进行绑定操作,则是自动刷新页面:

这就表示已经绑定成功了,下次就可以用QQ登录了。

4. 备注:

  • 我在代码中用到的pdo_query()函数是我自己封装的数据库执行代码,并不是PHP内置的函数,如果有网友参考我的代码,请自己手动修改对应的数据库操作部分代码。
  • 我们无法直接获取用户的QQ号,但可以获取用户的OpenID,OpenID可以作为用户的QQ号的唯一标识,与用户QQ号一一对应。

如果指正或咨询之处,可以直接在评论留言,我一般都是秒回的,也可以QQ我哟:517486222

PHP网站接入QQ互联实现QQ登录获取用户信息功能,超级简单,三个文件就搞定,无需费力地去了解官方提供的一大堆Demo文件相关推荐

  1. Android之QQ授权登录获取用户信息

    有时候我们开发的app需要方便用户简单登录,可以让用户使用自己的qq.微信.微博登录到我们自己开发的app. 今天就在这里总结一下如何在自己的app中集成QQ授权登录获取用户信息的功能. 首先我们打开 ...

  2. 微信小程序授权登录获取用户信息详解

    今天来说一下微信小程序的授权登录获取用户信息,首先我们看微信提供的小程序开发文档: https://blog.csdn.net/qq_41971087/article/details/82466647 ...

  3. Spring boot 项目(十三)——实现微信公众号授权登录获取用户信息

    引言 微信公众号开发中,必不可少的一环:公众号授权登录.获取微信用户信息 前期准备 内网渗透=>生成本地指定端口映射的外网域名 链接:内网渗透工具natapp使用详解 域名生成之后修改yml文件 ...

  4. 微信小程序开发之——用户登录-获取用户信息(5),意外收获字节跳动内部资料

    {{userInfo.nickName}} {{userInfo.city}} {{userInfo.gender0?"未知":userInfo.gender1?"男&q ...

  5. android qq登录 获取用户信息吗,免登录 只需要一个QQ号就能获取QQ头像和QQ昵称 获取QQ用户信息API...

    [PHP] 纯文本查看 复制代码<?php // header header("Content-Type:application/json"); error_reportin ...

  6. asp微信登陆源码,实现asp网站授权微信登录(获取用户信息,微信名头像openid等)

    一个同学的网站想实现asp微信登陆,获取到微信用户资料信息,微信昵称,微信头像,微信openid等信息保存到数据库,我给他了一份asp微信登录授权(获取用户信息)源码,他说不会用,让我帮忙写好入库,并 ...

  7. H5网页使用支付宝授权登录获取用户信息详解

    用户信息授权 用户信息授权主要是为了获取支付宝用户ID(USER_ID).授权令牌(access_token),便于开发者处理自身业务逻辑的时候使用,例如:获取支付宝用户信息.发会员卡.快捷登录等.授 ...

  8. java实现微信公众号授权登录获取用户信息(一)

    参考文章:https://blog.csdn.net/Santiago_M/article/details/79109154 : https://www.cnblogs.com/jilu/p/6123 ...

  9. java对接微信小程序(登录获取用户信息)

    需求说明: 用户通过小程序登录,进入到平台系统,进行各功能操作: 解决方案: 首先通过对接小程序,用户通过小程序登录及授权获取用户信息,后端调用接口获取微信用户信息,进行保存到数据库,然后返回toke ...

  10. 微信第三方登陆,无需注册一键登录,获取用户信息,PHP实现方法

    今天讲讲利用微信oauth2实现第三方登陆的实现方法. 先说说前提吧! 首先你得是服务号,并且是经过认证的.这样微信会给你很多第三方接口的权限,如果是订阅号或者没有认证的服务号那就不用想了! 一开始你 ...

最新文章

  1. 为 Kerberos 连接注册服务主体名称
  2. #pragma指令与#ifndef指令
  3. Spring3.x与jdk8兼容问题
  4. python3代码转python2_Python2代码转成Python3代码
  5. HUST1024 dance party(最大流)
  6. 织梦内容管理系统(DedeCMS)
  7. AQS理解之一,基础知识——LockSupport
  8. 为什么APF框架初始化时有两个一模一样的analyticConfiguration请求
  9. python少儿编程课件ppt_Python课程第五期
  10. python大纲_python学习大纲
  11. 孙鑫VC学习笔记:第十一讲 (二) 图形的保存与重绘方法一
  12. 【mindspore】数据加载报错,提示The pointer[cnode] is null.
  13. 6月第3周网络安全报告:境内感染网络病毒主机55.4万
  14. 广和通率先启动基于联发科技 T830 5G平台的5G模组开发,加速全球运营商5G FWA部署
  15. 联想e470加装固态硬盘_ThinkPad E470C怎么安装固态硬盘?
  16. android微信右滑删除,Android实现微信侧滑删除当前页面
  17. 重保服务全面守护互联网企业的“重要时刻”
  18. 典型相关分析(Canonical correlation analysis)(一):基本思想 、复相关系数、偏相关系数
  19. 什么是epub格式,mac上有什么好用的epub阅读器
  20. java-net-php-python-92SSM出版社管理系统开题PPT计算机毕业设计程序

热门文章

  1. coverity分析端软件环境搭建
  2. 真实经历,说一说本人苹果ipad mini2官方799元以旧换新真实操作
  3. linux系统苹果刷机,iPhone上安装Android系统详细步骤
  4. DTCC2019数据风云,十年变迁 第十届中国数据库技术大会隆重启动
  5. 电商自营藏猫腻 苏宁国美京东的套路谁最深?
  6. Exploring and Distilling Posterior and Prior Knowledge for Radiology Report Generation
  7. android 极光推送测试,Android 极光推送基本步骤
  8. 传智五虎是真相?受影射最重PHP学科,这几月在忙什么..?
  9. 天正建筑(TArch)8.0破解版下载(包含SP1、全系列注册机)
  10. 中国县级和以下行政区编码,2013年,sql文件