本文介绍了QQ第三方登录功能在thinkPHP5项目中的实现。分享给大家参考,如下:
最近用thinkPHP 5框架做了一个婚纱店项目,开发过程中需要第三方登录。腾讯给出的案例是通过几个互相包含的文件实现的。遗憾的是,控制器无法通过include或require完成预期功能。如果要使用腾讯官方封存类,必须进行如下修改:
1.在官方SDK中找到核心文件
当在框架外使用时,它是include 'qqConnectAPI.php '。当您打开这个文件时,您可以看到它包含其他几个文件。comm文件夹中的文件只不过是定义了一些常量。记录你的APP KEY信息没关系。只需将class文件夹中的几个类文件放入tp5,仔细看代码就会发现,只要得到三个类,就可以完全实现功能。
2.把它放在tp框架中
Tp5建议将composer没有安装的第三方的东西放在extend目录中,因为将来可能会进行其他扩展。在这里,将为qq登录单独创建一个qqlogin文件夹。
你可以看到里面只有三个类。我删除了一个Recorder和一个ErrorCase类,这两个类是用来记录一些信息的,比如access_token和异常处理,这里就直接删除。另外要注意,根据psr4规范,类名要和文件名一致,所以要更改文件名,同时要添加命名空间extendqqlogin。tp5中的所有类都必须有一个命名空间。
此外,为了防止tp5找到我们需要的文件,最好在config.php文件中注册一个根命名空间,在第30行:
//注册的根命名空间' root _ namespace '=[' extend QQ log in '='./extend/qqlogin/',' extend Baidu'='./extend/bdlogin/'],3。转换源代码
因为QC.php继承了Oauth.php,所以我们从后者更改了它,删除了require_once,并添加了名称空间,所以我们不再讨论它。首先,看成员属性。类常量是腾讯平台的地址,不用担心。本来有三个属性,对于记录器和错误是不需要的,直接注释掉或者删除。同样,想象一下对这两个字怀恨在心,看到就评论或删除。
//受保护的$记录器;public $ urlUtils//受保护的$错误;公共$ statepublic $ appid=' * * * * * ';public $ callback=' http://* * * */index/user/QQ callback ';public $ scope=' get _ user _ info需要添加以下四个属性。国家被用来防止CSRF袭击。通过查看官方文档,可以知道以下三个属性。这些最初存储在inc.php的comm文件夹下,但现在它们被直接作为成员属性。
然后构造一个函数,实例化三个类,其中两个不再存在。而且,如上所述,如果你对这两个字怀恨在心,看到就应该评论或者删除。
请看下面第一个成员方法qq_login()
公共函数QQ _ log in(){ $ 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);* *返回$ login _ url//标头(' location : $ log in _ URL ');}我们已经怀恨在心要用那两个字删掉这几行,我们又需要这些东西了。别忘了我们已经在上面添加了三个成员属性。当我们有这些值供下面使用时,只需传递$this-appid。在验证状态时,我们可以通过session进行验证,并在tp5中提供assistant函数来编写session:
会话(' state ',$ this-state);最后一句是头球跳投。不知道为什么在tp5中看不到跳转效果,所以直接返回url,然后在控制器中通过tp5的重定向函数$this-redirect()跳转。
请看下面的qq_callback()
公共函数QQ _ callback(){//$ state=$ this-recorder-read(' state ');//-验证状态以防止CSRF攻击if(输入('状态')!=session(' state '){//$ this-error(' 30001 ');退出(' 30001 ');} * * //返回$ params[' access _ token '];会话(' access_token ',$ params[' access _ token ']);}那两个字已经注释了。我们在qq_login中编写会话。这里,直接比较sessio。input()也是tp5的助手函数,可以获取get和post请求的参数,结果是一个数组,但是不可能动态的给它添加键值对。如果要添加它,必须将其分配给一个变量,然后操作该变量。此处如有错误,将在出口处直接打印错误号,正式文件有错误号的详细说明。最后,获得的access_token被直接写入会话。
下面的get_openid()方法类似,参数列表由session构造,返回值直接写入session。
然后修改QC.php,只需修改构造方法并给数组的三个变量一个值。
$ this-KeyArr=array(' oauth _ consumer _ key '=(int)$ this-appid,' access _ token '=session(' access _ token '),' OpenID '=session(' OpenID '));4.控制器调用
转换完成后,可以在控制器中使用。附上下面的代码:
使用extend qqlogin QC//处理qq登录公共功能QQ log in(){ $ QQ=new QC();$ URL=$ QQ-QQ _ log in();$ this-重定向($ URL);}//qq登录回调函数公共函数qq回调(user model $ user){ $ QQ=new QC();$ QQ-QQ _ callback();$ QQ-get _ OpenID();$qq=新QC();$ datas=$ QQ-get _ user _ info();*//获取用户信息后的处理*}记住:
在回调函数中,QC要实例化两次才能得到用户信息,第二次实例化只有openid和access_token可用。
更多对thinkPHP感兴趣的读者可以查看本网站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》、《PHP模板技术总结》、0103010。
希望本文对基于ThinkPHP框架的PHP编程有所帮助。