thinkPHP3.2.2使用thinkSDK实现第三方登录(以QQ登录)为例。

最近在做第三方登录。大体流程是首先开发者在第三方平台上注册一个应用。 一般你的域名空间要备过案的比较容易检核通过。 然后获取到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'];
                        $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);

      //跳转到授权页面
		redirect($sns->getRequestCodeURL());
	}

6.回调登录。callback。以及第三方登录与本地登录体系的结合,授权。

我这里在回调里去获取openid以及用户的信息。要我们的数据表中建立对应的字段保存openid。 先检索一下是否已有该id。从而确认用户是否第一次登录。如果是第一次登录,则保存openid以及用户名。   保存用户名的时候会有一个问题。因为账号是自动创建的,那么要考虑到用户名是不能重复的。所以也要查询一下用户名是否存在。比如我的qq用户名是runner,如果用户名存在的话,就模糊查询   username like 'runner%' 。   查出来有3个runner开头的。那么我新注册这个账号就自动给他名字runner3或runner4。

创建了用户之后,再查找用户信息,进行本地的登录流程。  保存相应的session以获取本地系统的权限。


7.Over。  有问题或建议欢迎留言讨论。


转载请注明出处:http://blog.csdn.net/liusaint1992/article/details/50354154

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 33
    评论
THINKPHP最全第三方登录(包括腾讯QQ、微信、新浪微博、Github、淘宝网、百度、搜狐微博、人人、360、网易等等) 使用方式: 1、使用命名空间 use Org\ThinkSDK\ThinkOauth; 2、设置三方登录的类别并赋予一个变量 $type = ThinkOauth::getInstance('qq'); 3、设置配置文件 'THINK_SDK_(TYPE)' => array( 'APP_KEY' => '', //应用注册成功后分配的 APP ID 'APP_SECRET' => '', //应用注册成功后分配的KEY 'CALLBACK' => '', //注册应用填写的callback ), 上文中的(TYPE)为设置的类别,其值目前有以下几个: //腾讯QQ登录配置 THINK_SDK_QQ // 用户基本信息API接口 user/get_user_info //腾讯微博配置 THINK_SDK_TENCENT // 用户基本信息API接口 user/info //新浪微博配 THINK_SDK_SINA // 用户基本信息API接口 users/show。附加参数:'uid='.$obj->openid() //网易微博配置 THINK_SDK_T163 // 用户基本信息API接口 users/show //人人网配置 THINK_SDK_RENREN // 用户基本信息API接口 users.getInfo //360配置 THINK_SDK_X360 // 用户基本信息API接口 user/me //豆瓣配置 THINK_SDK_DOUBAN // 用户基本信息API接口 user/~me //Github配置 THINK_SDK_GITHUB // 用户基本信息API接口 user //Google配置 THINK_SDK_GOOGLE // 用户基本信息API接口 userinfo //MSN配置 THINK_SDK_MSN // 用户基本信息API接口 msn。附加参数:token //点点配置 THINK_SDK_DIANDIAN // 用户基本信息API接口 user/info //淘宝网配置 THINK_SDK_TAOBAO // 用户基本信息API接口 taobao.user.buyer.get。附加参数:'fields=user_id,nick,sex,buyer_credit,avatar,has_shop,vip_info' //百度配置 THINK_SDK_BAIDU // 用户基本信息API接口 passport/users/getLoggedInUser // 注意,百度的头像位置是http://tb.himg.baidu.com/sys/portrait/item/{$data['portrait']} //开心网配置 THINK_SDK_KAIXIN // 用户基本信息API接口 users/me //搜狐微博配置 THINK_SDK_SOHU // 用户基本信息API接口 i/prv/1/user/get-basic-info 4、实例化一个登录页面 redirect($type->getRequestCodeURL()); 这里的$type是第二部获取的结果 5、回页面 $code = $this->get('code'); $type = 'QQ'; $sns = ThinkOauth::getInstance($type); //腾讯微博需传递的额外参数 $extend = null; if($type == 'tencent'){ $extend = array('openid' => $this->_get('openid'), 'openkey' => $this->_get('openkey')); } //请妥善保管这里获取到的Tok

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值