thinkPHP3.2.2使用thinkSDK实现第三方登录(以QQ登录)为例。
2015-12-18 21:59
751 查看
最近在做第三方登录。大体流程是首先开发者在第三方平台上注册一个应用。 一般你的域名空间要备过案的比较容易检核通过。 然后获取到appid跟appkey。
然后再用你的key,调用第三方平台的接口。获取登录信息。 实现第三方的登录。 如果自己网站本身有登录体系的话。可以在用户第一次用第三方登录的时候为用户创建本地账号。 用户可以修改自己的账号信息。
无意间找到一个集成了多种第三方登录的叫做thinkSDK的东西。可以直接拿过来用。
不过这个东西是基于thinkPHP比较早的版本。现在做这个项目是基于thinkPHP3.2.2的。 所以很多地方要做不少修改才能运用到新的thinkPHP版本中来。
调通了整个流程。记录下来给有需要的人看一看。其实自己去调通一下,对thinkPHP的一些东西也会有更深的了解。
这里以qq互联的登录为例子。到QQ互联申请key。这些就不讲了。 只说thinkSDK, 点这里查看出处,下载原版demo。
1.文件放置位置:
thinkSDK放置的位置:ThinkPHP/Library/Org/ThinkSDK/。
event文件夹放到模块下比如Admin模块下面。跟Controller文件夹同一个位置。
2.命名空间与类的引入。实例化。
(1)ThinkOauth.class.php:
首先加上命名空间,以及sdk文件夹中的文件要用哪一个就加进来。比如这里我们要用QqSDK跟SinaSDK。
namespace Org\ThinkSDK;
use Org\ThinkSDK\sdk\QqSDK;
use Org\ThinkSDK\sdk\SinaSDK;
abstract class ThinkOauth{
(2)TypeEvent.class.php:
namespace Home\Event;//我是放在Home模块下的。
class TypeEvent{
然后,新版的thinkPHP类的调用方式也有所不同,在里面调用 thinkOauth的方法是这样:
原版:import("ORG.ThinkSDK.ThinkOauth");
$qq = ThinkOauth::getInstance();
修改为: $qq = \Org\ThinkSDK\ThinkOauth::getInstance(); //加载ThinkOauth类并实例化一个对象
(3)sdk目录下面的类。如QqSDK.class.php。
原版:
class QqSDK extends ThinkOauth{
修改为:
namespace Org\ThinkSDK\sdk;
use Org\ThinkSDK;
class QqSDK extends \Org\ThinkSDK\ThinkOauth{
其他的也一样。
3.ThinkOauth.class.php的一些修改。
4.一些在这里用起来不顺的函数修改。
throw new Exception()这个函数会报错。所有throw new Exception修改为E;用thinkphp的E方法处理错误。
原版:throw new Exception("获取新浪微博ACCESS_TOKEN出错:{$data['error']}");
修改:E("获取新浪微博ACCESS_TOKEN出错:{$data['error']}");
还有halt函数,也用E方法来代替。
5.在Cotroller(控制器)中调用。例如(注意里面类的实例化方式):
6.回调登录。callback。以及第三方登录与本地登录体系的结合,授权。
我这里在回调里去获取openid以及用户的信息。要我们的数据表中建立对应的字段保存openid。 先检索一下是否已有该id。从而确认用户是否第一次登录。如果是第一次登录,则保存openid以及用户名。 保存用户名的时候会有一个问题。因为账号是自动创建的,那么要考虑到用户名是不能重复的。所以也要查询一下用户名是否存在。比如我的qq用户名是runner,如果用户名存在的话,就模糊查询 username like 'runner%' 。 查出来有3个runner开头的。那么我新注册这个账号就自动给他名字runner3或runner4。
创建了用户之后,再查找用户信息,进行本地的登录流程。 保存相应的session以获取本地系统的权限。
7.Over。 有问题或建议欢迎留言讨论。
昨天 一个小伙伴告诉我她跳槽了,工资非常高,翻了一倍多。真替她开心。
她是专注的前端。快乐的前端。 不会后台。 之前在一家外包公司被压榨。现在进入一家外企。
我也要考虑下自己的路了。
前端后端一起做到底好不好。
最近也没有写博客,也没有去逛javascript论坛。
借了一堆书在看。
自己的独立博客也还在备案中。
那个博客也没有做得很好。 只是用thinkphp和boostrap快速堆起来的东西。
后面再重构一些,加入一些自己的元素进去。
一步步来,我也不会差。
然后再用你的key,调用第三方平台的接口。获取登录信息。 实现第三方的登录。 如果自己网站本身有登录体系的话。可以在用户第一次用第三方登录的时候为用户创建本地账号。 用户可以修改自己的账号信息。
无意间找到一个集成了多种第三方登录的叫做thinkSDK的东西。可以直接拿过来用。
不过这个东西是基于thinkPHP比较早的版本。现在做这个项目是基于thinkPHP3.2.2的。 所以很多地方要做不少修改才能运用到新的thinkPHP版本中来。
调通了整个流程。记录下来给有需要的人看一看。其实自己去调通一下,对thinkPHP的一些东西也会有更深的了解。
这里以qq互联的登录为例子。到QQ互联申请key。这些就不讲了。 只说thinkSDK, 点这里查看出处,下载原版demo。
1.文件放置位置:
thinkSDK放置的位置:ThinkPHP/Library/Org/ThinkSDK/。
event文件夹放到模块下比如Admin模块下面。跟Controller文件夹同一个位置。
2.命名空间与类的引入。实例化。
(1)ThinkOauth.class.php:
首先加上命名空间,以及sdk文件夹中的文件要用哪一个就加进来。比如这里我们要用QqSDK跟SinaSDK。
namespace Org\ThinkSDK;
use Org\ThinkSDK\sdk\QqSDK;
use Org\ThinkSDK\sdk\SinaSDK;
abstract class ThinkOauth{
(2)TypeEvent.class.php:
namespace Home\Event;//我是放在Home模块下的。
class TypeEvent{
然后,新版的thinkPHP类的调用方式也有所不同,在里面调用 thinkOauth的方法是这样:
原版:import("ORG.ThinkSDK.ThinkOauth");
$qq = ThinkOauth::getInstance();
修改为: $qq = \Org\ThinkSDK\ThinkOauth::getInstance(); //加载ThinkOauth类并实例化一个对象
(3)sdk目录下面的类。如QqSDK.class.php。
原版:
class QqSDK extends ThinkOauth{
修改为:
namespace Org\ThinkSDK\sdk;
use Org\ThinkSDK;
class QqSDK extends \Org\ThinkSDK\ThinkOauth{
其他的也一样。
3.ThinkOauth.class.php的一些修改。
public function __construct($token = null){ //设置SDK类型 $class = get_class($this); $this->Type = strtoupper(substr($class, 0, strlen($class)-3)); //下面三句是我添加的。 $typeArr = explode('\\',$this->Type); $typeLen = count($typeArr); $this->Type = $typeArr[$typeLen-1]; //获取应用配置 $config = C("THINK_SDK_{$this->Type}"); if(empty($config['APP_KEY']) || empty($config['APP_SECRET'])){ E('请配置您申请的APP_KEY和APP_SECRET'); } else { $this->AppKey = $config['APP_KEY']; $this->AppSecret = $config['APP_SECRET']; <span style="white-space:pre"> </span>$this->Token = $token; //设置获取到的TOKEN } }
public static function getInstance($type, $token = null) { $name = ucfirst(strtolower($type)) . 'SDK'; $path="\Org\ThinkSDK\sdk\\$name";//注意这里与下面一句来实例化类的方式。 return new $path($token); }
4.一些在这里用起来不顺的函数修改。
throw new Exception()这个函数会报错。所有throw new Exception修改为E;用thinkphp的E方法处理错误。
原版:throw new Exception("获取新浪微博ACCESS_TOKEN出错:{$data['error']}");
修改:E("获取新浪微博ACCESS_TOKEN出错:{$data['error']}");
还有halt函数,也用E方法来代替。
5.在Cotroller(控制器)中调用。例如(注意里面类的实例化方式):
//第三方登录 public function thirdLogin($type = null){ empty($type) && $this->error('参数错误'); $sns = \Org\ThinkSDK\ThinkOauth::getInstance($type); <span style="white-space:pre"> </span>//跳转到授权页面 redirect($sns->getRequestCodeURL()); }
6.回调登录。callback。以及第三方登录与本地登录体系的结合,授权。
我这里在回调里去获取openid以及用户的信息。要我们的数据表中建立对应的字段保存openid。 先检索一下是否已有该id。从而确认用户是否第一次登录。如果是第一次登录,则保存openid以及用户名。 保存用户名的时候会有一个问题。因为账号是自动创建的,那么要考虑到用户名是不能重复的。所以也要查询一下用户名是否存在。比如我的qq用户名是runner,如果用户名存在的话,就模糊查询 username like 'runner%' 。 查出来有3个runner开头的。那么我新注册这个账号就自动给他名字runner3或runner4。
创建了用户之后,再查找用户信息,进行本地的登录流程。 保存相应的session以获取本地系统的权限。
7.Over。 有问题或建议欢迎留言讨论。
昨天 一个小伙伴告诉我她跳槽了,工资非常高,翻了一倍多。真替她开心。
她是专注的前端。快乐的前端。 不会后台。 之前在一家外包公司被压榨。现在进入一家外企。
我也要考虑下自己的路了。
前端后端一起做到底好不好。
最近也没有写博客,也没有去逛javascript论坛。
借了一堆书在看。
自己的独立博客也还在备案中。
那个博客也没有做得很好。 只是用thinkphp和boostrap快速堆起来的东西。
后面再重构一些,加入一些自己的元素进去。
一步步来,我也不会差。
相关文章推荐
- php备份数据库
- 困扰多年的THINKPHP隐藏后台.php问题终于解决了!
- 多媒体开发之ftp---一个很现实的需求把ftp转换成rtmp协议做点播
- PHP字符串函数之 strpos stripos strrpos strripos
- PHP字符串函数之 strstr stristr strchr strrchr
- PHP的五种运行模式
- Laravel Repository 模式-让你控制器更易读
- 解决WordPress安装主题/插件提示输入FTP帐号的问题
- 原创简单php框架源码
- php5.5以上版本编译扩展模块方法
- php生成图片验证码
- ThinkPhp小结---配置文件
- PHP If 语句的一些知识,大家可以看下哦,了解多点哦
- 谈下不同的PHP operators,大家都知道吗
- YII 框架在windows系统下的安装
- php-fpm.conf
- /etc/init.d/ 文件夹下的php-fpm脚步文件
- mac下快速安装php的各个版本
- 用纯php实现MVC框架,文件目录模仿yii2
- php的设计模式