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

更新:2017-10-27    编辑:语雪    来源:互联网    人气:加载中...    字号:|

本文实例讲述了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\qqlogin,tp5所有的类都要有命名空间

另外为了防止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才干拿到用户信息,第二次实例化的时候才有openid和access_token两个参数。


评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)

站点导航

您可能在找这些