您的位置:首页 > 编程语言 > PHP开发

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的一些修改。

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快速堆起来的东西。

后面再重构一些,加入一些自己的元素进去。

一步步来,我也不会差。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: