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自动跳转中英文页面
Jul 29 PHP
php 时间计算问题小结
Jan 04 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
May 02 PHP
php调用Google translate_tts api实现代码
Aug 07 PHP
php分页代码学习示例分享
Feb 20 PHP
CI(CodeIgniter)框架中的增删改查操作
Jun 10 PHP
Yii框架中memcache用法实例
Dec 03 PHP
简单的php+mysql聊天室实现方法(附源码)
Jan 05 PHP
php批量转换文件夹下所有文件编码的函数类
Aug 06 PHP
ThinkPHP5 的简单搭建和使用详解
Nov 15 PHP
laravel 验证错误信息到 blade模板的方法
Sep 29 PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 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
Protoss魔法科技
2020/03/14 星际争霸
在PHP中使用反射技术的架构插件使用说明
2010/05/18 PHP
PHP中使用mktime获取时间戳的一个黑色幽默分析
2012/05/31 PHP
PHP HTML JavaScript MySQL代码如何互相传值的方法分享
2012/09/30 PHP
利用PHP生成CSV文件简单示例
2016/12/21 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
一些不错的js函数ajax
2008/08/20 Javascript
由JavaScript技术实现的web小游戏(不含网游)
2010/06/12 Javascript
jquery实现简单的自动播放幻灯片效果
2015/06/13 Javascript
实例讲解JavaScript中instanceof运算符的用法
2016/06/08 Javascript
微信小程序 wxapp地图 map详解
2016/10/31 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
2017/02/16 Javascript
详解AngularJS2 Http服务
2017/06/26 Javascript
使用socket.io制做简易WEB聊天室
2018/01/02 Javascript
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
vue项目打包之开发环境和部署环境的实现
2020/04/23 Javascript
微信小程序实现通讯录列表展开收起
2020/11/18 Javascript
[05:26]2014DOTA2西雅图国际邀请赛 iG战队巡礼
2014/07/07 DOTA
Python去除字符串两端空格的方法
2015/05/21 Python
Python 使用SMTP发送邮件的代码小结
2016/09/21 Python
学习Python3 Dlib19.7进行人脸面部识别
2018/01/24 Python
python实现整数的二进制循环移位
2019/03/08 Python
matplotlib绘制多个子图(subplot)的方法
2019/12/03 Python
python使用pandas抽样训练数据中某个类别实例
2020/02/28 Python
Django choices下拉列表绑定实例
2020/03/13 Python
scrapy redis配置文件setting参数详解
2020/11/18 Python
一个不错的HTML5 Canvas多层点击事件监听实例
2014/04/29 HTML / CSS
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
幼儿教师个人求职信范文
2013/09/21 职场文书
岗位工作说明书
2014/07/29 职场文书
电力工程合作意向书
2015/05/11 职场文书
联村联户简报
2015/07/21 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书
解决persistence.xml配置文件修改存放路径的问题
2022/02/24 Java/Android
Vscode中SSH插件如何远程连接Linux
2022/05/02 Servers
Java异常体系非正常停止和分类
2022/06/14 Java/Android