ThinkPHP第三方登录--QQ登录案例

前面的文章讲述了,如何在thinkphp框架开发的项目中,配置第三方登录类文件ThinkSDK类库,在此不再赘述,本文就具体讲解用QQ做第三方登陆的实例。

前面的文章讲述了,如何在thinkphp框架开发的项目中,配置第三方登录类文件ThinkSDK类库,在此不再赘述,本文就具体讲解用QQ做第三方登陆的实例。

ThinkSDK类库,很好的帮我们集成了主流的第三方登录类,把第三方平台的SDK包集成在了一起,我们需要做的任务是从QQ开发平台申请开发者权限,获取appkey和appsecret参数,将其配置到项目中即可。

注意:网站申请第三方登录必须是已备案的网站才可以。我在阿里云购买的域名和服务器,半个月就备案下来了。

首先需要到qq开发平台申请开发者权限,地址是:https://connect.qq.com/manage.html

打开页面之后,填写个人信息(个人是可以申请QQ做第三方登录的),提交腾讯审核,其中的网站名称一项必须是备案信息上的名称,有过不一致,会被打回,不给通过(亲身经历)。

提交信息页面

自学php博客


审核通过后的页面

自学php博客

审核通过详情页

自学php博客

登录效果页面

自学php博客

上面几个步骤执行完之后,就可以获取到QQ开发者平台的appkey和appsecret了,将其放到thinkphp的config.php配置文件中即可,具体配置前面的文章已经讲过(参考:http://www.zixuephp.cn/index.php/Home/Index/article/aid/51),我们接下来就是用户输入QQ账号步骤完成之后的,回调方法了。

该回调方法,会将通过appkey和appsecret获取到的openid,再用openid换取用户的基本信息,将信息保存到数据库中,则执行完毕。

回调方法如下:

<?php

// 第三方登录类:新浪微博德隆

class ThirdAction extends Action{

//SNS登录首页

public function index(){

$this->display();

}

//登录地址

public function login($type = null){

empty($type) && $this->error('参数错误');


//加载ThinkOauth类并实例化一个对象

import("ORG.ThinkSDK.ThinkOauth");

$sns  = ThinkOauth::getInstance($type);


//跳转到授权页面

redirect($sns->getRequestCodeURL());

}

//授权回调地址

public function callback($type = null, $code = null){

(empty($type) || empty($code)) && $this->error('参数错误');

//加载ThinkOauth类并实例化一个对象

import("ORG.ThinkSDK.ThinkOauth");

$sns  = ThinkOauth::getInstance($type);


//腾讯微博需传递的额外参数

$extend = null;

if($type == 'tencent'){

$extend = array('openid' => $this->_get('openid'), 'openkey' => $this->_get('openkey'));

}

//请妥善保管这里获取到的Token信息,方便以后API调用

//调用方法,实例化SDK对象的时候直接作为构造函数的第二个参数传入

//如: $qq = ThinkOauth::getInstance('qq', $token);

$token = $sns->getAccessToken($code , $extend);

//获取当前登录用户信息

if(is_array($token)){

$user_info = A('Type', 'Event')->$type($token);

//echo("<h1>恭喜!使用 {$type} 用户登录成功</h1><br>");

//echo("授权信息为:<br>");

//dump($token);

//echo("当前登录用户信息为:<br>");

//dump($user_info);

//exit;

$model=M('custome');

$data=array();

$data['uname']=$user_info['nick'];

$data['name']=$user_info['nick'];

//$name=$user_info['name'];//接收新浪的用户名,作为本站的用户姓名项,此处保证来自新浪的是唯一标识符,方便用户再次用新浪登录可以保存之前的数据

$name=$token['openid'];

$nick=$user_info['nick'];

$data['headPortrait']=$user_info['head'];

//判断用户是否已经登录过

$info=$model->where("namecode='{$name}'")->find();

if($info){

$pre_id=$info['id'];

$res=$model->where("id='{$pre_id}'")->save($data);

$data['password']=$info['password'];

}else{

$data['namecode']=$token['openid'];

$data['type']=1;

$data['status']='ACTIVE';

$data['comefrom']='网站';

$data['comechild']='装修情报M站';

$data['createTime']=date('Y-m-d H:i:s');

$data['password']=md5('a123456');

$data['points']=50;

$data['zxCoins']=50;

//生成用户唯一的id标识符

$id = md5(uniqid(mt_rand(), true));

$data['id']=strtoupper($id);

$pre_id=$data['id'];

$res=$model->add($data);

}

if($res!==false){

//保存cookie做免登陆验证

$time = time()+86400*7;

//注册成功则在积分详情表中,标明用户积分和装修比变动详情

//1、用户积分变动详情

$m_coindetail=M('coinDetail');

$arr=array();

$arr['customerId']=$data['id'];

$arr['direction']=1;

$arr['coins']=50;

$arr['coinsType']=2;

$arr['coinsTime']=date('Y-m-d H:i:s');

$arr['remark']='注册赠送积分';

$rss=$m_coindetail->add($arr);

//2、装修币变动详情

$arrs=array();

$arrs['customerId']=$data['id'];

$arrs['direction']=1;

$arrs['coins']=50;

$arrs['coinsType']=1;

$arrs['coinsTime']=date('Y-m-d H:i:s');

$arrs['remark']='注册赠送装修币';

$rss=$m_coindetail->add($arrs);

setcookie('pre_id',$pre_id,$time,'/');

setcookie('pre_uname',$name,$time,'/');

setcookie('pre_password',$data['password'],$time,'/');

header('Location:http://m.myhousing.cn/index.php/Ucenter/index');

}

}

}

}