CI框架开发新浪微博登录接口源码完整版
首先来看下流程:
流程原理:
1.通过code获得access_token通过授权,并获取用户的信息(包括用户u_id)(这个u_id在后面的第三方登录表里面叫sina_id,那个表是需要自己建的)
2.查询第三方登录表,如果不存在用户sina_id,分2种情况,一:用户在平台已经有帐号,这时需要把平台(比如:平台的用户表是:user_reg)用户id绑定到第三方登录表(比如是:third_login表),然后就让客户登录;
二:用户在平台没有帐号,跳转至注册页面注册,注册的同时,信息写入uer_reg表,同时也把用户sina_id写入第三方登录表进行绑定;
3.查询第三方登录表(third_login),如果存在用户sina_id,再查询用户表(user_reg),如果邮箱已经激活,就直接登录,如果没有激活,提示用户去邮箱激活帐号。
下面开始详讲步骤:
第一步:申请Appkey和Appsecret申请地址:http://open.weibo.com/在页面点击网站接入WEB,进去申请就好了,通过后会得到AppKey和AppSecret如下:
AppKey:1428003339
AppSercet:f1c6177a38b39f764c76a1690720a6dc
回调地址:http://test.com/callback.php
说明:申请下来后,那你的这个新浪帐号就是测试帐号,你在开发的时候可以用这个帐号来调试,其他帐号是无法登录,无法返回信息的。开发前,最好上官网看下开发流程,流程是最重要的。只要思路理清楚了,剩下就是用代码实现你的所思所想。
第二步:下载SDK,下载php版的,下载地址(官网):http://code.google.com/p/libweibo/downloads/list,下载下来有5个文件,其中一个是saetv2.ex.class.php,我只需要这个文件。
第三步:代码
1.建立一个第三方登录表,以便存储第三方登录的信息(新浪是u_id,QQ是openid,他们都是唯一的,用来标识用户,我们根据这个来存储):
CREATETABLEIFNOTEXISTS`third_login`( `user_id`INT(6)NOTNULL, `sina_id`BIGINT(16)NULL, `qq_id`varchar(64)NULL, PRIMARYKEY(`user_id`), UNIQUEINDEX`user_id_UNIQUE`(`user_id`ASC), INDEX`sina_id`(`sina_id`ASC), INDEX`index4`(`qq_id`ASC)) ENGINE=MyISAM DEFAULTCHARACTERSET=utf8 COLLATE=utf8_bin COMMENT='第三方登录表'
说明:平台返回的是u_id,他是用户的唯一标识,我把他存为sina_id,user_id是关联平台用户表user_reg的id的,user_reg表我这里不列出,你可以按实际项目需求来建表,推荐的操作工具有phpmyadmin,MySQLWorkbench,操作方便。
如果你只需要做新浪登录接口,那可以把qq_id这个字段去掉。
2.写配置文件,在application下新建一个文件sina_conf.php,把刚申请到的AppKey和AppSecret写进去,代码如下:
<?php $config["sina_conf"]=array( "App_Key"=>'1428003339', "App_Secret"=>'f1c6177a38b39f764c76a1690720a6dc', "WB_CALLBACK_URL"=>'http://test.com/callback.php' );
保存
3.oauth认证类,把刚下载下来的saetv2.ex.class.php文件复制到application/libraries下。
说明:这是非常重要的类,登录,授权,获取用户信息都要用到这个类中的方法,没他就没法玩下去了,原封不动的粘到application/libraries下。
4.写新浪微博登录类(QQ登录也可用,我这里QQ登录的也封装在一起了,就算只做新浪登录接口,也不影响),在application/models下建一个文件third_login_model.php,代码:
<?php /** *Descriptionofthird_login_model *第三方接口授权,登录model *@author */ classthird_login_modelextendsCI_Model{ //putyourcodehere private$sina=array(); private$qq =array(); private$users=''; private$third=''; publicfunction__construct(){ parent::__construct(); // $this->l=DIRECTORY_SEPARATOR; $this->load->database(); $this->load->library('session'); include_onceAPPPATH."/libraries"."/saetv2.ex.class.php"; $this->third= $this->db->'third_login';//第三方登录表 $this->users=$this->db->'user_reg';//本项目用户表 $this->config->load("sina_conf"); $this->sina=$this->config->item("sina_conf"); } /** *@uses:新浪微博登录 *@param: *@return:$sina_url----登录地址 */ publicfunctionsina_login(){ $obj=newSaeTOAuthV2($this->sina['App_Key'],$this->sina['App_Secret']); $sina_url=$obj->getAuthorizeURL($this->sina['WB_CALLBACK_URL']); return$sina_url; } /** *@uses:登录后,通过返回的code值,获取token,实现授权完成,然后获取用户信息 *@param:$code *@return:$user_message--用户信息 */ publicfunctionsina_callback($code){ $obj=newSaeTOAuthV2($this->sina['App_Key'],$this->sina['App_Secret']); if(isset($code)){ $keys=array(); $keys['code']=$code; $keys['redirect_uri']=$this->sina['WB_CALLBACK_URL']; try{ $token=$obj->getAccessToken('code',$keys);//完成授权 }catch(OAuthException$e){ } } $c=newSaeTClientV2($this->sina['App_Key'],$this->sina['App_Secret'],$token['access_token']); $ms=$c->home_timeline(); $uid_get=$c->get_uid();//获取u_id $uid=$uid_get['uid']; $user_message=$c->show_user_by_id($uid);//获取用户信息 return$user_message; } /** *@uses:查询第三方登录表 *@param:$where *@return:第三方登录用户记录结果集 */ publicfunctionselect_third($where){ $result=false; $this->db->select(); $this->db->from($this->third); $this->db->where($where); $query=$this->db->get(); if($query){ $result=$query->row_array(); } return$result; } /*- *@uses:sina---查询用户表和第三方登录表 *@param:$where *@return:第三方登录用户记录结果集 */ publicfunctionselect_user_name($where){ $field="user.id,user.password,user.username,utl.*"; $sql="select{$field}from{$this->third}asutl" ."leftjoin{$this->users}asuseronuser.id=utl.user_id" ."whereutl.sina_id={$where}"; $query=$this->db->query($sql); $result=$query->row_array(); return$result; } /** *@uses:qq---查询用户表和第三方登录表 *@param:$where *@return:第三方登录用户记录结果集 */ publicfunctionselect_user_qqname($where){ $field="user.id,user.password,user.username,utl.*"; $sql="select{$field}from{$this->third}asutl" ."leftjoin{$this->users}asuseronuser.id=utl.user_id" ."whereutl.qq_id='{$where}'"; $query=$this->db->query($sql); $result=$query->row_array(); return$result; }
/** *@uses:将用户和第三方登录表信息绑定 *@param:$datas *@return: */ publicfunctionbinding_third($datas){ if(!is_array($datas))show_error('wrongparam'); if($datas['sina_id']==0&&$datas['qq_id']==0) return; $resa=''; $resb=''; $resa=$this->select_third(array("user_id"=>$datas['user_id'])); $temp=array( "user_id"=>$datas['user_id'], "sina_id"=>$resa['sina_id']!=0?$resa['sina_id']:$datas['sina_id'], "qq_id" =>$resa['qq_id']!=0?$resa['qq_id']:$datas['qq_id'], ); if($resa){ $resb=$this->db->update($this->third,$temp,array("user_id"=>$datas['user_id'])); }else{ $resb=$this->db->insert($this->third,$temp); } if($resb){ $this->session->unset_userdata('sina_id');//注销 $this->session->unset_userdata('qq_id');//注销 } return$resb; } }