thinkphp3.2.3第三方登录(QQ、微信、微博、github等)

最近在做网站时,要用到第三方登录。这里大体总结一下流程,首先开发者在第三方平台上注册一个应用,如果你的域名空间备过案,那么申请起来比较容易检核通过。通过后获取到appid跟appkey,使用你的密钥调用第三方平台接口,获取到access_token,接着换取openid,使用openid获取到第三方登录用户信息。
从而实现第三方的登录。 如果你的网站有自己登录体系的话。可以在用户第一次用第三方登录的时候为用户创建本地账号。 用户可以修改自己的账号信息。再次登录时更新本地帐号信息。
在网上搜索第三方登陆发现一个好用的第三方类库ThinkSDK,集合了好多第三方登陆方法(腾讯QQ,腾讯微博,新浪微博,网易微博,人人网,360,豆瓣,Github,Google,MSN,点点,淘宝网,百度,开心网,搜狐),自己整合了一下,加入了微信登录。

冯奎博客

这里大体使用方法,以qq互联的登录为例子。到QQ互联申请key。这些就不讲了。 只说thinkSDK, 点这里查看出处,下载原版demo。

1.文件放置位置:
thinkSDK放置的位置:ThinkPHP/Library/Org/ThinkSDK/。
我的案例下载地址:https://github.com/kuif/kuifeng
文档中包含的SDK有

ThinkSDK/ThinkOauth.class.php //SDK基类,主要用于Oauth的认证,所有平台的SDK均需要继承此类

ThinkSDK/sdk/BaiduSDK.class.php //(百度SDK)
ThinkSDK/sdk/DiandianSDK.class.php //(点点SDK)
ThinkSDK/sdk/DoubanSDK.class.php //(豆瓣SDK)
ThinkSDK/sdk/GithubSDK.class.php //(Github SDK)
ThinkSDK/sdk/GoogleSDK.class.php //(Google SDK)
ThinkSDK/sdk/KaixinSDK.class.php //(开心网SDK)
ThinkSDK/sdk/MsnSDK.class.php //(MSN SDK)
ThinkSDK/sdk/QqSDK.class.php //(腾讯QQ SDK)
ThinkSDK/sdk/RenrenSDK.class.php //(人人网SDK)
ThinkSDK/sdk/SinaSDK.class.php //(新浪微博SDK)
ThinkSDK/sdk/SohuSDK.class.php //(搜狐SDK)
ThinkSDK/sdk/T163SDK.class.php //(网易微博SDK)
ThinkSDK/sdk/TaobaoSDK.class.php //(淘宝网SDK)
ThinkSDK/sdk/TencentSDK.class.php //(腾讯微博SDK)
ThinkSDK/sdk/WeixinSDK.class.php //(微信 SDK)
ThinkSDK/sdk/X360SDK.class.php //(360 SDK)

2、添加配置文件application/common/conf/config.php
加入密钥等参数:

'LOAD_EXT_CONFIG'       => 'oauth', // 加载第三方登陆密钥及回调地址
//*************************************第三方登录****************************************
'QQ_APP_ID'             =>  '',     // QQ登录APP ID
'QQ_APP_KEY'            =>  '',     // QQ登录APP KEY
'WEIXIN_APP_ID'         =>  '',     // 微信登录APP ID
'WEIXIN_SECRET'         =>  '',     // 微信登录SECRET
'SINA_API_KEY'          =>  '',     // 新浪登录API KEY
'SINA_SECRET'           =>  '',     // 新浪登录SECRET
'DOUBAN_API_KEY'        =>  '',     // 豆瓣登录API KEY
'DOUBAN_SECRET'         =>  '',     // 豆瓣登录SECRET
'RENREN_API_KEY'        =>  '',     // 人人登录API KEY
'RENREN_SECRET'         =>  '',     // 人人登录SECRET
'KAIXIN_API_KEY'        =>  '',     // 开心网登录API KEY
'KAIXIN_SECRET'         =>  '',     // 开心网登录SECRET
'GITHUB_CLIENT_ID'      =>  '',     // github登录API KEY
'GITHUB_CLIENT_SECRET'  =>  '',     // github登录SECRET
'SOHU_API_KEY'          =>  '',     // 搜狐网登录API KEY
'SOHU_SECRET'           =>  '',     // 搜狐网登录SECRT
//***********************************其他第三方接口****************************************

引入同级目录下的oauth.php文件,同时在config.php文件中引入,oauth文件为初始化配置文件,以及登录过后的回调地址

//定义回调URL通用的URL
define('URL_CALLBACK', 'http://'.$_SERVER['HTTP_HOST'].'/index.php/Api/Oauth/oauth/type/');

return array(
    //腾讯QQ登录配置
    'THINK_SDK_QQ'      => array(
        'APP_KEY'       => C('QQ_APP_ID'), //应用注册成功后分配的 APP ID
        'APP_SECRET'    => C('QQ_APP_KEY'), //应用注册成功后分配的KEY
        'CALLBACK'      => URL_CALLBACK . 'qq',
    ),
    //腾讯微信登录配置
    'THINK_SDK_WEIXIN'      => array(
        'APP_KEY'       => C('WEIXIN_APP_ID'), //应用注册成功后分配的 APP ID
        'APP_SECRET'    => C('WEIXIN_SECRET'), //应用注册成功后分配的KEY
        'CALLBACK'      => URL_CALLBACK . 'weixin',
    ),

3、添加home/user控制器中加入登录方法,第三方登陆初始化,页面中同时添加第三方登录的A链接

// 第三方平台登录
public function oauth_login(){
    $type=I('get.type');  //获取登录的方法
    import("Org.ThinkSDK.ThinkOauth");  ////加载ThinkOauth类
    $sdk=\ThinkOauth::getInstance($type); //实例化一个对象
    redirect($sdk->getRequestCodeURL());  //重定向到第三方登录授权页面
}
<a href="{:U('Home/User/oauth_login',array('type'=>'qq'))}"></a>

4、回调登录。引入Application/Api/Controller/OauthController.class.php文件,授权后获取用户信息,存入数据库,跳转登陆前的页面
通用回调方法

public function oauth(){
    $type=I('get.type');
    $code=I('get.code');
    //加载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 = $sns->getAccessToken($code , $extend);
    //获取当前登录用户信息
    if(is_array($token)){
        // 获取第三方账号数据
        $user_info = $this->$type($token);
        $data=array(
            'oauth'         =>  $type,
            'nickname'      =>  $user_info['nickname'],
            'head_pic'      =>  $user_info['head_img'],
            'openid'        =>  $token['openid'],
            'access_token'  =>  $token['access_token'],
            );
        // 获取本地数据库的用户数据
        $where['openid'] = $data['openid'];
        $user_data=D('User')->where($where)->find();
        // 如果登录过 则覆盖;没有登录这添加数据
        if(empty($user_data)){
            $data['reg_time'] = time();
            $data['last_login'] = time();
            $data['last_ip'] = getIP();
            $id=M('User')->data($data)->add();
        }else{
            $data['last_login'] = time();
            $data['last_ip'] = getIP();
            $id=D('User')->where($where)->data($data)->save();
        }
        $login_info=array(
            'user_id'=>$id,
            'head_pic'=>$data['head_pic'],
            'nickname'=>$data['nickname'],
            );
        session('user',$login_info);   //存数SESSION中,用于登陆后的一些操作

        $_COOKIE['this_url']=empty($_COOKIE['this_url']) ? 'http://www.xxxx.com' : cookie('this_url');  //获取登陆前的URL,获取不到则返回首页
        redirect(cookie('this_url'));
    }
}

授权回调获取用户信息:

//登录成功,获取腾讯QQ用户信息
public function qq($token){
    import("Org.ThinkSDK.ThinkOauth");
    $qq   = \ThinkOauth::getInstance('qq', $token);
    $data = $qq->call('user/get_user_info');
    if($data['ret'] == 0){
        $userInfo['type'] = 1;
        $userInfo['name'] = $data['nickname'];
        $userInfo['nickname'] = $data['nickname'];
        $userInfo['head_img'] = $data['figureurl_2'];
        return $userInfo;
    } else {
        throw_exception("获取腾讯QQ用户信息失败:{$data['msg']}");
    }
}

到这里登录也就差不多可以了,点击页面中的登录按钮,去试一下可以登录吗,如果不能请按照流程,再看一遍,看看是否有哪里忘记了,也欢迎大家留言询问。

冯奎博客
请先登录后发表评论
  • latest comments
  • 总共1条评论
冯奎博客

觉微小哥:这个没有BaseController啊

2019-05-28 11:46:05 回复

冯奎博客 冯奎博客
  • 岁月清浅 安之若素 回复 觉微小哥:BaseController是一个空的控制器,你可以直接继承controller
  • 2019-05-29 22:32:37 回复