ThinkPHP接入QQ互联实现登录的案例分析
发布时间 - 2020-03-05 00:00:00 点击率:次本篇介绍了使用thinkphp接入qq互联实现第三方登录的方法,作为一个小案例来为各位讲解,希望对各位有帮助。
ThinkPHP接入QQ互联实现登录的案例分析
我的一个二级域名项目想在也想接入QQ第三方登录功能,该项目采用的thinkphp5框架开发的项目,在网上搜了一些接入的案例,个人觉得鱼龙混杂不太适合自己,现在自己重新在thinkphp5框架上开发这个功能,下面是详细的开发步骤。
(推荐教程:thinkphp教程)
第一步、下载QQ互联SDK,我们是基于thinkphp5框架下的,当然是要用PHP版的SDK,下载下来后的文件目录如下。
第二步、将SDK主要目录上传到服务器合适的目录下,先说下SDK的主要的目录是API文件夹里面的class目录,当初为了做配置设置项测试,我上传了install文件夹,然后再开发环境配置了APP ID、APP Key以及callback_url,配置好之后会在API/comm文件夹中多处一个inc.php配置文件,最后再recorder类中会引用这个配置文件。可是在后面的 开发过程中我发现会报这个错The state does not match. You may be a victim of CSRF。后面我把qqlogin方法里面的 state放到session中,对官网的DEMO SDK已经完全失去信心了,不在用QQ互联全部的文件而是挑几个重要的类文件来做开发。后面想想官方给的SDK只是普通的PHP代码格式,我应用到thinkphp那很多东西都已经变了,最后我选择上个类文件,QC.php、URL.php、Oauth.php上传到extend/qqlogin目录下。在thinkphp5的项目中扩展类一般上传到extend文件夹下,如下图所示我上次的目录位置。
第三步、改造上述三个类文件,因为QC.php是继承了Oauth.php,我们从后者改起,去掉require_once,加上命名空间如namespace qqlogin,首先看成员属性,类常量是腾讯平台的地址,不用管,原来有三个属性,recorder、error不需要,注释掉或直接删掉。下文同样,因为5个类文件我们只用到3个类文件,一个是报错类一个读取配置相关类。下面看Oauth.php成员属性、qqlogin跳转方法、qqcallback回调方法的,其他两个类文件没有太大的改大,按照上述规则改即可
recorder = new Recorder();
$this->urlUtils = new URL();
// $this->error = new ErrorCase();
}
public function qq_login(){
// $appid = $this->recorder->readInc("appid");
// $callback = $this->recorder->readInc("callback");
// $scope = $this->recorder->readInc("scope");
$appid = $this->appid;
$callback = $this->callback;
$scope = $this->scope;
//-------生成唯一随机串防CSRF攻击
$state = md5(uniqid(rand(), TRUE));
// $this->recorder->write('state',$state);
session('state',$state);
//-------构造请求参数列表
$keysArr = array(
"response_type" => "code",
"client_id" => $appid,
"redirect_uri" => $callback,
"state" => $state,
"scope" => $scope
);
$login_url = $this->urlUtils->combineURL(self::GET_AUTH_CODE_URL, $keysArr);
return $login_url;
}
public function qq_callback(){
// $state = $this->recorder->read("state");
//--------验证state防止CSRF攻击
if(input('state') != session('state')){
// $this->error->showError("30001");
exit('30001');
}
//-------请求参数列表
$keysArr = array(
"grant_type" => "authorization_code",
"client_id" => $this->appid,
"redirect_uri" => urlencode($this->callback),
"client_secret" => $this->appkey,
"code" => $_GET['code']
);
//------构造请求access_token的url
$token_url = $this->urlUtils->combineURL(self::GET_ACCESS_TOKEN_URL, $keysArr);
$response = $this->urlUtils->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)){
// $this->error->showError($msg->error, $msg->error_description);
// }
}
$params = array();
parse_str($response, $params);
// $this->recorder->write("access_token", $params["access_token"]);
// return $params["access_token"];
session('access_token',$params["access_token"]);
}
}第四步、编写控制器调用函数和回调函数,同时检查回调地址是否正确(回调地址是当你添加QQ第三方登录QQ互联返回跳转的地址,该地址携带重要参数,能获取最后用户的数据),有些时候如果你在QQ互联填写的回调地址与你控制器的不一样,那么最后就会卡在那个QQ互联填写的回调地址那,如www.100txy.com/index.php?code=65B7668A4F1BBB71DD0DF52B55AC1FC1&state=804e921e18e3545ecdf690316639c067。下面是控制器方法
use qqlogin\QC;
// 处理qq登录
public function qqlogin(){
$qq = new QC();
$url = $qq->qq_login();
$this->redirect($url);
}
// qq登录回调函数
public function qqcallback(){
$qq = new QC();
$qq->qq_callback();
$qq->get_openid();
$qq = new QC();
$datas = $qq->get_user_info();
die(var_dump($datas));//为用户数据
}值得注意的是在回调函数里面要实例化两次QC才能拿到用户信息,第二次实例化的时候才有openid和access_token两个参数。
更多Thinkphp教程,请关注PHP中文网!
# thinkphp
# php
# csrf
# 常量
# 命名空间
# Session
# Error
# 回调函数
# 继承
# class
# Namespace
# 互联
# 回调
# 第三方
# 跳转
# 会报
# 配置文件
# 几个
# 就会
# 是在
# 目录下
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
Laravel怎么连接多个数据库_Laravel多数据库连接配置
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
详解CentOS6.5 安装 MySQL5.1.71的方法
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
Windows Hello人脸识别突然无法使用
如何在企业微信快速生成手机电脑官网?
微信公众帐号开发教程之图文消息全攻略
如何用好域名打造高点击率的自主建站?
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
如何在 Pandas 中基于一列条件计算另一列的分组均值
三星网站视频制作教程下载,三星w23网页如何全屏?
EditPlus中的正则表达式 实战(4)
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
Python进程池调度策略_任务分发说明【指导】
如何快速重置建站主机并恢复默认配置?
昵图网官网入口 昵图网素材平台官方入口
香港服务器部署网站为何提示未备案?
如何用PHP快速搭建高效网站?分步指南
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
如何在香港服务器上快速搭建免备案网站?
Python并发异常传播_错误处理解析【教程】
Android自定义控件实现温度旋转按钮效果
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
如何在万网利用已有域名快速建站?
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
微信小程序 HTTPS报错整理常见问题及解决方案
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
在线制作视频网站免费,都有哪些好的动漫网站?
Laravel如何实现API资源集合?(Resource Collection教程)
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
如何快速生成专业多端适配建站电话?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
Laravel怎么使用artisan命令缓存配置和视图
网页设计与网站制作内容,怎样注册网站?
Laravel如何实现用户密码重置功能?(完整流程代码)
如何用西部建站助手快速创建专业网站?
PHP正则匹配日期和时间(时间戳转换)的实例代码
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
如何在阿里云虚拟主机上快速搭建个人网站?
在Oracle关闭情况下如何修改spfile的参数
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
html5的keygen标签为什么废弃_替代方案说明【解答】
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
制作电商网页,电商供应链怎么做?


"code" => $_GET['code']
);
//------构造请求access_token的url
$token_url = $this->urlUtils->combineURL(self::GET_ACCESS_TOKEN_URL, $keysArr);
$response = $this->urlUtils->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)){
// $this->error->showError($msg->error, $msg->error_description);
// }
}
$params = array();
parse_str($response, $params);
// $this->recorder->write("access_token", $params["access_token"]);
// return $params["access_token"];
session('access_token',$params["access_token"]);
}
}