Thinkphp 实现QQ一键登录的例子

1.到QQ互联上申请APP ID、APP KEY。地址:http://connect.qq.com/ 详细注方法这里不再赘述。
需要注意可以写多个这里的回调地址需要和你配置文件中的一致:http://www.***.com/Login/qq_login_cb;http://www.***.com/Index/qq_bc

3.QQHelper.class.php这个文件请放到ThinkPhp核心报中 路径为:ThinkphpExtendLibraryORGNetQQHelper.class.php,此文件为QQ登录的核心类。

4.配置一下配置文件如下:
//网站url路径
define ( 'WEBSITE_URL', 'http://www.***.com' );
//应用ID 这个是在  http://connect.qq.com/   申请
define ( 'APP_ID', ********* );
//应用KEY  这个是在  http://connect.qq.com/   申请
define ( 'APP_KEY', '****9676d9bec3bf0f0d53ff4ff6****' );
//QQ登录回调地址
define ( 'APP_LOGIN_CPATH', WEBSITE_URL . '/Login/qq_login_cb' );//这里的路径要和QQ互联上的回调接口一致
//绑定QQ回调地址
define ( 'APP_BIND_CPATH', WEBSITE_URL . '/Index/qq_bc' );//这里的路径要和QQ互联上的回调接口一致
//请求用户授权时向用户显示的可进行授权的列表
define ( 'APP_SCOPE', 'get_user_info,add_share,list_album,add_album,upload_pic,add_topic,add_one_blog,add_weibo' );
//图片是否本地化
define ( 'AVATAR_LOCAL', false );

//Session设置
define ( 'SES_TOKEN_NAME', 'qq_token' ); //token名称
define ( 'SES_OPENID_NAME', 'qq_openid' ); //QQ用户的openid名称
define ( 'SES_STATE_NAME', 'qq_state' );// 状态名称

5.php代码
    1.commonAction.class.php代码
    class CommonAction extends Action
    {
        public function _initialize() {
            header("Content-Type:text/html; charset=utf-8");
            header('Content-Type:application/json; charset=utf-8');
            $systemConfig = include WEB_ROOT . 'Common/systemConfig.php';
            $this->assign("site", $systemConfig);
           
           
            if(empty($_SESSION['info']['username']))
            {
                if(empty($_SESSION['qq_openid']))
                {
                    $L="<li><a href=".$systemConfig['WEB_ROOT']."Register/index>注册</a></li>";
                    $L.="<li><a href='javascript:void(0);' id='login'>登录</a></li>";
                    $L.="<li><a href='".$systemConfig['WEB_ROOT']."Login/qq_login'><img src='".$systemConfig['WEB_ROOT']."/Public/home/images/qq_login.png'/></a></li>";
                }else{
                    if($_SESSION['info']['bind']=="N")
                    {   
                        $L="<li><a href='".$systemConfig['WEB_ROOT']."Login/loginout'>退出</a></li>";
                        $L.="<li><a href='".$systemConfig['WEB_ROOT']."Center/index'>会员中心</a></li>";
                        $L.="<li><a href='".$systemConfig['WEB_ROOT']."Index/readtemplate?source=bind_uname'>请绑定用户名</a></li>";
                        $L.="<li>".$_SESSION['info']['nickname']."</li>";
                        $L.="<li><img src='".$_SESSION['info']['avatar']."' style='width:30px;'/></li>";   
                    }else{
                        $L="<li><a href='".$systemConfig['WEB_ROOT']."Login/loginout'>退出</a></li>";
                        $L.="<li><a href='".$systemConfig['WEB_ROOT']."Center/index'>会员中心</a></li>";
                        //$L.="<li><a href='/Index/readtemplate?source=bind_uname'>请绑定用户名</a></li>";
                        $L.="<li>".$_SESSION['info']['nickname']."</li>";
                        $L.="<li><img src='".$_SESSION['info']['avatar']."' style='width:30px;'/></li>";
                    }
                }

            }else{
                $L="<li><a href='".$systemConfig['WEB_ROOT']."Login/loginout'>退出</a></li>";
                if(empty($_SESSION['info']['open_id']))
                {
                    $L.="<li><a href='".$systemConfig['WEB_ROOT']."Index/qq_bind'>绑定QQ号</a></li>";   
                }else{
                    $L.="<li><a href=".$systemConfig['WEB_ROOT']."Index/qq_unbind'>解绑QQ号</a></li>";
                }
                   
               
                $L.="<li><a href='".$systemConfig['WEB_ROOT']."Center/index'>会员中心</a></li>";
                $L.="<li>您好:".$_SESSION['info']['username']."</li>";
            }
            $this->assign("L", $L);       
        }

    }

    2.实现QQ登录代码 LoginAction 都需继承 CommonAction
    class LoginAction extends CommonAction {

        private $user;
        private $qqHelper;
       
        function _initialize() {
            $this->user = M('Member');
            import ('ORG.Net.QQHelper');
            $this->qqHelper = new QQHelper ();
        }
       
        //QQ登录
        public function qq_login()
        {
            $this->qqHelper->login ( APP_ID, APP_SCOPE, APP_LOGIN_CPATH );
        }
       
        //QQ登录的回调
        function qq_login_cb() {
            $this->qqHelper->callback ( APP_LOGIN_CPATH );
            $this->qqHelper->get_openid ();
           
            //先去数据库中查找openid存在不
            $temp_data = $this->user->where(array('open_id' => $_SESSION [SES_OPENID_NAME]))->find();
           
            if (empty($temp_data['open_id'])) {
                //证明该QQ还没有在本站登录过
                $userInfo = json_decode ( $this->qqHelper->get_user_info (), true );
                $data ['open_id'] = $_SESSION [SES_OPENID_NAME];
                $data ['nickname'] = $userInfo ['nickname'];
                $data ['avatar'] = $userInfo ['figureurl_2'];
                $data ['login_ip'] = get_client_ip();
                $data ['login_time'] = time();
                $data ['reg_date'] = time();
                $this->user->add ( $data );
                //将信息写入session
                $temp_data = $this->user->where(array('uid' => $this->user->getLastInsID()))->find();
                $_SESSION['info']=$temp_data;
            } else {
                $_SESSION['info']=$temp_data;
            }
            $this->redirect ('Index/index');
        }
       
        //退出
        public function loginout()
        {
            unset($_SESSION['info']);
            session_destroy();
            $this->redirect('Index/index');
        }
    }

    3.QQ号与本地用户绑定 IndexAction 都需继承 CommonAction
   
    class IndexAction extends CommonAction {

        private $user;
        private $qqHelper;
       
        function _initialize() {
            parent::_initialize();
            $this->user = M ( 'Member' );
            import ('ORG.Net.QQHelper');
            $this->qqHelper = new QQHelper ();
        }   
       
        /**QQ登录**/
       
        //绑定用户名 指采用QQ登录的用户,还没有本站帐号和密码
        function bind_uname() {
            $data ['username'] = $_POST ['uname'];
            $data ['pwd'] = MD5(MD5($_POST ['pwd']));
            $data ['bind'] = 'Y';
           
            $map ['open_id'] = $_SESSION [SES_OPENID_NAME]; //QQ的openid
           

            //查找该openid是否已经绑定过用户名没有
            $stat = $this->user->where ( $map )->find ();
            if ($stat ['username'] != '' || $stat ['username'] != null) {
                $this->error ( '你已经绑定过用户名,请不要再绑定啦' );
            }
           
            $res = $this->user->where ( $map )->save ( $data );
            //更新session
            $_SESSION['info']['bind']='Y';
           
            if ($res) {
                $this->success ( '绑定用户成功');
            } else {
                $this->error ( '绑定失败' );
            }
        }
       
        //绑定QQ号 主要是通过本站注册的用户
        function qq_bind() {
            //先去判断该帐号是否绑定过QQ号
            $map ['open_id'] = $_SESSION [SES_OPENID_NAME];
            $res = $this->user->where ( $map )->find ();
            if ($res != null) {
                $this->error ( '您已经绑定了QQ帐号了,如果要更改请先解除绑定!' );
            }
            $this->qqHelper->login ( APP_ID, APP_SCOPE, APP_BIND_CPATH ); //注意这里的回调地址和登录的回调地址不同
        }
       
        //绑定QQ号 的回调地址
        function qq_bc() {
            $tmp_ses = $_SESSION [SES_OPENID_NAME]; //保存之前的Sesion 避免Session被覆盖
            $this->qqHelper->callback ( APP_BIND_CPATH ); //注意这里的回调地址和登录的回调地址不同
            $this->qqHelper->get_openid ();
            $userInfo = json_decode ( $this->qqHelper->get_user_info (), true );
           
            //先要去判断这个QQ号是否已经绑定过帐号没有
            $res = $this->user->where ( array ('open_id' => $_SESSION [SES_OPENID_NAME] ) )->find ();
            if ($res != null) {
                $_SESSION [SES_OPENID_NAME] = $tmp_ses;
                $this->error ( '该QQ号已经绑定过帐号了,请勿再次绑定', /esoxue.php );
            }
            $map['uid'] = $_SESSION['info']['uid'];
            $data ['open_id'] = $_SESSION [SES_OPENID_NAME];
            $data ['avatar'] = $userInfo ['figureurl_2'];
            $data ['bind'] = 'Y';
            $stat = $this->user->where ( $map )->save ( $data );
            if ($stat > 0) {
                $this->success ( '绑定QQ号成功!', /esoxue.php );
            } else {
                $this->error ( '绑定QQ失败', /esoxue.php );
            }
        }
       
        //解绑QQ号
        function qq_unbind() {
            $map ['uid'] = $_SESSION['info']['uid'];
            $data ['open_id'] = '';
            $res = $this->user->where ( $map )->save ( $data );
            if ($res > 0) {
                $this->success ( '解绑成功!', /esoxue.php );
            } else {
                $this->error ( '解绑失败', /esoxue.php );
            }
        }
       
        //读模板
        function readtemplate() {
            $dotpl = $_GET ['source'];
           
            if ($dotpl == 'bind_uname') {
                $this->display ( 'bind_uname' );
            }
        }
       
        /**QQ登录**/
       
    }

在header中输出{$L} header 是包含文件

6.数据库在您的会员中添加如下字段:
nickname、avatar、open_id、bind

CREATE TABLE IF NOT EXISTS `lw_member` (
  `uid` int(11) NOT NULL AUTO_INCREMENT,
  `nickname` varchar(20) DEFAULT NULL COMMENT '用户昵称',
  `pwd` char(32) DEFAULT NULL COMMENT '密码',
  `avatar` varchar(100) DEFAULT NULL COMMENT '用户头像',
  `login_ip` varchar(15) DEFAULT NULL COMMENT '登录ip',
  `login_time` int(17) DEFAULT NULL COMMENT '登录时间',
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `open_id` varchar(32) NOT NULL,
  `bind` enum('N','Y') NOT NULL DEFAULT 'N',
  PRIMARY KEY (`uid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='网站前台会员表' AUTO_INCREMENT=6 ;

绑定本地用户模板代码:
        <form action="{:U('Index/bind_uname')}" method="POST">
            <p style="margin:0;text-align:right;margin-right:10px;cursor: pointer;" ></p>
            <h1>绑定用户</h1>
            <p>&nbsp;</p>
            <p><input type="text" name="uname" class="input" placeholder="请输入用户名"/></p>
            <p>&nbsp;</p>
            <p><input type="password" name="pwd" class="input" placeholder="请输入密码"/></p>
            <p>&nbsp;</p>
            <p><input type="submit" name="submit" value="绑 定" class="submit"/></p>
        </form>
临时演示地址:http://sheng.weilingdao.com
以上所有代码可根据实际情况更改。需要注意:QQ登录需要CURL的支持

时间: 2024-10-26 08:18:22

Thinkphp 实现QQ一键登录的例子的相关文章

郭吉军:“QQ一键登录”简化用户操作 提高社区黏度

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 12月16日消息,腾讯公司全资收购康盛discuz,曾在中小站长群轰动一时.论坛社区程序Discuz与腾讯的聊天工具如何整合,业界一直密切关注.近期,腾讯推出首个基于Discuz的应用程序"QQ一键登录"已经开始内测.包括康盛创想官方论坛(discuz.net).雨林木风论坛(ylmf.net).落伍者(im286.com

QQ一键登录和网站绑定的问题

问题描述 现在我们网站要添加qq的一键登录功能,qq登录成功后,第一次需要用户去绑定账号,类似下图:假如绑定成功后,我再次登录,我怎么设置我的表结构,知道用户已经绑定成功了呢. 解决方案 解决方案二:因为腾讯qq的接口只能读取用户的基本信息,例如昵称什么的(不能读取qq号),假如用户再次登录,我要去数据库查询下此qq有没有绑定,存放什么字段是唯一的呢解决方案三:疼讯给的信息唯一么还是不唯一啊有个特别的标识么来识别每个账号的不同应该有个吧解决方案四:不知道哪个东西是唯一的呢?解决方案五:这得你们分

QQ互联一键登录审核不通过的解决方案_php实例

在QQ互联上申请帐号之后提交了审核, 后台填写APPID和KEY之后自己申请的QQ号可以正常登录,但QQ互联审核的时候一直审核不通过说是"您的网站审核未通过,原因是"点击QQ登录按钮提示登录失败或出现错误信息(无跳转.提示失败.出现错误信息)",请确认申请符合审核标准后,再提交审核",或者是""禁止开发商强制用户重新注册或绑定其他帐号"". 错误提示图: Destoon爱好者对此问题的解决方案是:修改模板目录下的chip/li

demo-qq一键登录怎么开发?

问题描述 qq一键登录怎么开发? qq一键登录怎么开发?开发语言php,有现成的demo么?谢谢了各位大神们 解决方案 http://blog.csdn.net/bianta/article/details/6525485 解决方案二: http://bbs.csdn.net/topics/370235358 解决方案三: http://www.discuz.net/thread-2919658-1-1.html 解决方案四: 要申请的好像,腾讯给你权限才可以 解决方案五: 去腾讯开放平台申请开

QQ帐号一键登录接入网站 v1.0发布

通过"QQ登录",用户能使用QQ帐号一键登录接入网站,大大降低了用户注册.登录的门槛,借助庞大的http://www.aliyun.com/zixun/aggregation/7730.html">QQ用户群,给第三方网站带来更多新用户.已登录用户还可以将在第三方网站发布.分享的信息即时同步到QQ空间,使网站内容通过好友关系得到进一步的传播,从而提升网站的访问量和用户数. 项目地址:http://open-qq.googlecode.com SVN: http://op

thinkphp中与subkey进行登录验证例子

使用thinkphp做一个用户登录功能是一个很简单的功能,最近公司的一个项目需要将thinkphp结合usbkey进行登录,(也就是需要插入usbkey进行登录,否则不放进行登录),开始的时候使用php+驱动(USB驱动)读取usbkey实现登录.在本地可以实现登录,上传到服务器上就不能登录(其原因就是php只能检测本地是否安装了usbkey的驱动,却不能检测其他客户端是否安装了驱动.)后来使用js来实现.这次可以实现登录. 实现的步骤: 1.安装USBKEY的驱动(本代码只使用飞天诚信USBK

destoon之一键登录设置_php实例

目前destoon已经支持QQ.新浪微博.百度.MSN帐号一键登录. 进入网站后台,会员管理  模块设置  会员整合选项卡,点击对应的申请帐号连接,申请接口帐号和密钥,填写提交. 一键登录需要服务器的PHP环境支持allow_url_fopen.json和curl扩展,请确认服务器支持之后再开启,否则无法正常登录. 在后台起始页,服务器信息,点详细信息,如果能看到以下字样,说明务器环境支持:      

VC调用JavaScript函数--处理QQ网页登录密码加密(空间、农场、WEB QQ等)

相信很多朋友都对QQ伴侣等农场外挂十分好奇吧!其实我也是,然而不幸的是很多像我一样的兄弟在模拟农场登录时,就被JS函数加密的密码字符串给挡在门外,于是百度来google去,始终没有一个完整的代码或例子. 登录时用OmniPeek捕获得到的数据包如下(QQ号1.密码123456.验证码1234): 其实QQ网页登录密码加密方式(包括空间.农场.WEB QQ等)都是一样的. http://imgcache.qq.com/ptlogin/js/comm.js 周末自己便将腾讯JS加密文件给下载下来了.

腾讯企业邮箱api,一键登录的接口调不通

问题描述 oauthauthkey均已调通,但就是一建登陆的接口进入异常.报远程服务器返回错误:(501)未实现.错误3.1.2一键登录接口说明:1.URL:2.格式:JSON3.HTTP请求方式:GET/POST4.输入参数说明:参数名称类型描述ticketstring调用"获取Authkey"获取的Authkeyagentstring管理员帐号5.请求示例:https://exmail.qq.com/cgi-bin/login?fun=bizopenssologin&met