PHP网站接入QQ互联实现QQ登录获取用户信息功能,超级简单,三个文件就搞定,无需费力地去了解官方提供的一大堆Demo文件
一、 在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文件相关推荐
- Android之QQ授权登录获取用户信息
有时候我们开发的app需要方便用户简单登录,可以让用户使用自己的qq.微信.微博登录到我们自己开发的app. 今天就在这里总结一下如何在自己的app中集成QQ授权登录获取用户信息的功能. 首先我们打开 ...
- 微信小程序授权登录获取用户信息详解
今天来说一下微信小程序的授权登录获取用户信息,首先我们看微信提供的小程序开发文档: https://blog.csdn.net/qq_41971087/article/details/82466647 ...
- Spring boot 项目(十三)——实现微信公众号授权登录获取用户信息
引言 微信公众号开发中,必不可少的一环:公众号授权登录.获取微信用户信息 前期准备 内网渗透=>生成本地指定端口映射的外网域名 链接:内网渗透工具natapp使用详解 域名生成之后修改yml文件 ...
- 微信小程序开发之——用户登录-获取用户信息(5),意外收获字节跳动内部资料
{{userInfo.nickName}} {{userInfo.city}} {{userInfo.gender0?"未知":userInfo.gender1?"男&q ...
- android qq登录 获取用户信息吗,免登录 只需要一个QQ号就能获取QQ头像和QQ昵称 获取QQ用户信息API...
[PHP] 纯文本查看 复制代码<?php // header header("Content-Type:application/json"); error_reportin ...
- asp微信登陆源码,实现asp网站授权微信登录(获取用户信息,微信名头像openid等)
一个同学的网站想实现asp微信登陆,获取到微信用户资料信息,微信昵称,微信头像,微信openid等信息保存到数据库,我给他了一份asp微信登录授权(获取用户信息)源码,他说不会用,让我帮忙写好入库,并 ...
- H5网页使用支付宝授权登录获取用户信息详解
用户信息授权 用户信息授权主要是为了获取支付宝用户ID(USER_ID).授权令牌(access_token),便于开发者处理自身业务逻辑的时候使用,例如:获取支付宝用户信息.发会员卡.快捷登录等.授 ...
- java实现微信公众号授权登录获取用户信息(一)
参考文章:https://blog.csdn.net/Santiago_M/article/details/79109154 : https://www.cnblogs.com/jilu/p/6123 ...
- java对接微信小程序(登录获取用户信息)
需求说明: 用户通过小程序登录,进入到平台系统,进行各功能操作: 解决方案: 首先通过对接小程序,用户通过小程序登录及授权获取用户信息,后端调用接口获取微信用户信息,进行保存到数据库,然后返回toke ...
- 微信第三方登陆,无需注册一键登录,获取用户信息,PHP实现方法
今天讲讲利用微信oauth2实现第三方登陆的实现方法. 先说说前提吧! 首先你得是服务号,并且是经过认证的.这样微信会给你很多第三方接口的权限,如果是订阅号或者没有认证的服务号那就不用想了! 一开始你 ...
最新文章
- 为 Kerberos 连接注册服务主体名称
- #pragma指令与#ifndef指令
- Spring3.x与jdk8兼容问题
- python3代码转python2_Python2代码转成Python3代码
- HUST1024 dance party(最大流)
- 织梦内容管理系统(DedeCMS)
- AQS理解之一,基础知识——LockSupport
- 为什么APF框架初始化时有两个一模一样的analyticConfiguration请求
- python少儿编程课件ppt_Python课程第五期
- python大纲_python学习大纲
- 孙鑫VC学习笔记:第十一讲 (二) 图形的保存与重绘方法一
- 【mindspore】数据加载报错,提示The pointer[cnode] is null.
- 6月第3周网络安全报告:境内感染网络病毒主机55.4万
- 广和通率先启动基于联发科技 T830 5G平台的5G模组开发,加速全球运营商5G FWA部署
- 联想e470加装固态硬盘_ThinkPad E470C怎么安装固态硬盘?
- android微信右滑删除,Android实现微信侧滑删除当前页面
- 重保服务全面守护互联网企业的“重要时刻”
- 典型相关分析(Canonical correlation analysis)(一):基本思想 、复相关系数、偏相关系数
- 什么是epub格式,mac上有什么好用的epub阅读器
- java-net-php-python-92SSM出版社管理系统开题PPT计算机毕业设计程序
热门文章
- coverity分析端软件环境搭建
- 真实经历,说一说本人苹果ipad mini2官方799元以旧换新真实操作
- linux系统苹果刷机,iPhone上安装Android系统详细步骤
- DTCC2019数据风云,十年变迁 第十届中国数据库技术大会隆重启动
- 电商自营藏猫腻 苏宁国美京东的套路谁最深?
- Exploring and Distilling Posterior and Prior Knowledge for Radiology Report Generation
- android 极光推送测试,Android 极光推送基本步骤
- 传智五虎是真相?受影射最重PHP学科,这几月在忙什么..?
- 天正建筑(TArch)8.0破解版下载(包含SP1、全系列注册机)
- 中国县级和以下行政区编码,2013年,sql文件