thinkPHP5项目中实现QQ第三方登录功能


Posted in PHP onOctober 20, 2017

本文实例讲述了thinkPHP5项目中实现QQ第三方登录功能。分享给大家供大家参考,具体如下:

最近用thinkPHP 5框架做了一个婚纱店的项目,在开发过程中需要用到第三方登录,腾讯官方给的案例是几个文件相互包含实现的,放到tp5里面很悲催的发现在控制器中不能通过include或者require完成预期功能,想要用腾讯官方封的类就必须对其进行修改,修改如下:

1. 找到官方SDK里面的核心文件

thinkPHP5项目中实现QQ第三方登录功能

框架外使用的时候是include 'qqConnectAPI.php',打开这个文件可以看到它是包含了另外几个文件的,comm文件夹下的几个文件无非就是定义一些常量,记录一下你的APP KEY这些信息,都无关紧要,只要把class文件夹下的几个类文件放到tp5里面就好了,而且仔细看一下代码会发现其实只要拿到三个类就完全可以实现功能了。

2. 放到tp框架里

tp5推荐将第三方的东西,同时又不是composer安装的统一放到extend目录下,因为可能以后还要做其他扩展,这里将qq登录相关的单独建一个qqlogin文件夹,

thinkPHP5项目中实现QQ第三方登录功能

可以看到里面只有三个类,我去掉了一个Recorder和一个ErrorCase类,见名知意,这两个的作用是记录一些信息,如access_token,还有异常处理,这里我就直接删掉了。另外注意,按照psr4规范,类名要跟文件名一致,所以要把文件名改一下,同时加上命名空间extend\qqlogintp5所有的类都要有命名空间

另外为了防止tp5找不到我们需要的文件,最好在config.php文件里注册一条根命名空间,在第30行:

// 注册的根命名空间
'root_namespace'  => [
 'extend\qqlogin' => '../extend/qqlogin/',
 'extend\baidu' => '../extend/bdlogin/'
],

3. 改造源代码

因为QC.php是继承了Oauth.php,我们从后者改起,去掉require_once,加上命名空间这个就不说了,首先看成员属性,类常量是腾讯平台的地址,不用管,原来有三个属性,recorder、error不需要,注释掉或直接删掉。下文同样,要想象跟这两个单词有仇,看到就注释或删掉。

// protected $recorder;
public $urlUtils;
// protected $error;
public $state;
public $appid = "****";
public $callback = "http://****/index/user/qqcallback";
public $scope = "get_user_info";

下面四个属性是需要添加的,state用于防止CSRF攻击,下面三个看官方文档就知道是什么东西了,这些原来是在comm文件夹下的inc.php存放的,现在直接拿过来变成成员属性。

然后构造函数,实例化三个类,有两个已经不存在了,而且上面说了,跟这两个单词有仇,看到就要注释或删掉。

再看下面的第一个成员方法qq_login()

public function qq_login(){
 $appid = $this->recorder->readInc("appid");
 $callback = $this->recorder->readInc("callback");
 $scope = $this->recorder->readInc("scope");
 //---生成唯一随机串防CSRF攻击
 $state = md5(uniqid(rand(), TRUE));
 $this->recorder->write('state',$state);
 *
 *
 return $login_url;
 // header("Location:$login_url");
}

我们已经有仇把有那两个单词的这几行删掉了,我们又需要这些东西,不要忘了我们上面增加了三个成员属性,这些值我们已经有了下面用的时候通过$this->appid就好了。state验证的时候我们可以通过session去验证,在tp5里面提供了助手函数去写session:

session('state',$this->state);

最后一句是header跳转,暂不知道什么原因在tp5里面并不能看到跳转效果,于是直接将url返回,再在控制器里面通过tp5的重定向函数$this->redirect()实现跳转。

下面看qq_callback()

public function qq_callback(){
 // $state = $this->recorder->read("state");
 //---验证state防止CSRF攻击
 if(input('state') != session('state')){
  // $this->error("30001");
  exit('30001');
 }
 *
 *
 // return $params["access_token"];
 session('access_token',$params["access_token"]);
}

出现那两个单词的已经注释了,我们在qq_login里面有写session,这里直接取sessio比较就行了,input()也是tp5的助手函数,可以获得get、post请求的参数,结果是一个数组,但是不能够再动态为其添加键值对,想要添加的话必须将其赋给一个变量,再对变量进行操作。这里有错误的话直接exit打印出错误号,官方文档有详细的错误号说明。在最后也是直接将获取到的access_token写进session。

下面的get_openid()方法类似,参数列表用session构建,返回值直接写进session。

然后再修改QC.php,只需修改构造方法,把数组的三个变量给一下值就好了。

$this->keysArr = array(
 "oauth_consumer_key" => (int)$this->appid,
 "access_token" => session('access_token'),
 "openid" => session('openid')
);

4. 控制器调用

改造完成,可以在控制器里面使用了,附上代码入下:

use extend\qqlogin\QC;
// 处理qq登录
public function qqlogin()
{
 $qq = new QC();
 $url = $qq->qq_login();
 $this->redirect($url);
}
// qq登录回调函数
public function qqcallback(UserModel $user)
{
 $qq = new QC();
 $qq->qq_callback();
 $qq->get_openid();
 $qq = new QC();
 $datas = $qq->get_user_info();
 * // 拿到用户信息后的处理
 *
}

切记:

在回调函数里面要实例化两次QC才能拿到用户信息,第二次实例化的时候才有openidaccess_token两个参数。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php str_pad 函数使用详解
Jan 13 PHP
用来解析.htpasswd文件的PHP类
Sep 05 PHP
php中sprintf与printf函数用法区别解析
Feb 17 PHP
php操作mysql数据库的基本类代码
Feb 25 PHP
PHP图片裁剪函数(保持图像不变形)
May 04 PHP
php简单操作mysql数据库的类
Apr 16 PHP
php array_slice 取出数组中的一段序列实例
Nov 04 PHP
php实现的XML操作(读取)封装类完整实例
Feb 23 PHP
PHP实现webshell扫描文件木马的方法
Jul 31 PHP
thinkPHP5框架中widget的功能与用法详解
Jun 11 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
Mar 27 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
Jun 24 PHP
PHP简单实现二维数组赋值与遍历功能示例
Oct 19 #PHP
phpStudy2016 配置多个域名期间遇到的问题小结
Oct 19 #PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
Oct 19 #PHP
PHP自定义函数实现数组比较功能示例
Oct 19 #PHP
phpstudy的php版本自由修改的方法
Oct 18 #PHP
phpStudy 2016 使用教程详解(支持PHP7)
Oct 18 #PHP
PHP实现重载的常用方法实例详解
Oct 18 #PHP
You might like
php visitFile()遍历指定文件夹函数
2010/08/21 PHP
PHP在网页中动态生成PDF文件详细教程
2014/07/05 PHP
PHP扩展模块memcached长连接使用方法分析
2014/12/24 PHP
php单一接口的实现方法
2015/06/20 PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
2016/08/01 PHP
使用正则替换变量
2007/05/05 Javascript
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
js正则表达式中test,exec,match方法的区别说明
2014/01/29 Javascript
Nodejs初级阶段之express
2015/11/23 NodeJs
node.js require() 源码解读
2015/12/13 Javascript
JavaScript判断图片是否已经加载完毕的方法汇总
2016/02/05 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
多个vue子路由文件自动化合并的方法
2019/09/03 Javascript
vue本地打开build后生成的dist文件夹index.html问题
2019/09/04 Javascript
关于layui的动态图标不显示的解决方法
2019/09/04 Javascript
js 解析 JSON 数据简单示例
2020/04/21 Javascript
解决vue字符串换行问题(绝对管用)
2020/08/06 Javascript
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
js实现类选择器和name属性选择器的示例步骤
2021/02/07 Javascript
Python实现随机生成有效手机号码及身份证功能示例
2017/06/05 Python
Python正则匹配判断手机号是否合法的方法
2020/12/09 Python
pandas中的series数据类型详解
2019/07/06 Python
Django 实现xadmin后台菜单改为中文
2019/11/15 Python
Python代码需要缩进吗
2020/07/01 Python
Python日志器使用方法及原理解析
2020/09/27 Python
python switch 实现多分支选择功能
2020/12/21 Python
HTML5 canvas 基本语法
2009/08/26 HTML / CSS
沙特阿拉伯电子产品和家用电器购物网站:Black Box
2019/07/24 全球购物
毕业生个人求职自荐信
2014/02/26 职场文书
工程力学专业自荐信范文
2014/03/17 职场文书
2015年行政部工作总结
2015/04/28 职场文书
实习单位鉴定意见
2015/06/04 职场文书
公司保洁员管理制度
2015/08/04 职场文书
详解Laravel框架的依赖注入功能
2021/05/27 PHP
Android开发手册自定义Switch开关按钮控件
2022/06/10 Java/Android