2015-05-18 15:47:42
thinkphp和ucenter做会员整合的流程讲解:
今天在所做的项目中需要中遇到ucenter与 thinkphp要对会员进行整合,他在网上查看了一些资料参考没有成功,最主要的原因是从ucenter1.6中下载后在复制 advanced\examples\api\下的uc.php时里面的路径没有修改OK,下面就详细说一下
1、打开ucenter的后窗口在应用中添加所需要的应用,这里不详细说了,就按ucenter中的提示添写即可,关键是在添加完成以后要复制如下的内容
如图:
然后在ucenter1.6中的advanced\examples\api\中的api目录复制到你所对应的项目根目录下,然后在建立一个conf.ucenter.php配置文件。把应用Ucenter的配置信息复制到该文件,并做相对应的修改,
然后在api/uc.php文件对ucenter引用配置文件的路径做修改
原有的:require_once DISCUZ_ROOT.'./config.inc.php';修改成为你所对应的文件名和路径,(注意:DISCUZ_ROOT这个常量是../相对的路径,根据自己的情况做修改)?
2、把advanced\uc_client中的 uc_client目录复制到项目的根目录,现在到ucenter后台查看通信是失败的,在此纠结了很长时间,查看在api/uc.php文件中有一 行 require_once DISCUZ_ROOT.'./include/db_mysql.class.php';这个。而所在项目中根本找不 到些文件,这是就是受uncentet案例中的影响,要把此行修改成 为 require_once DISCUZ_ROOT.'./uc_client/lib/db.class.php';。是在 uc_client/lib/db.class.php所对应的文件,那么此处修改完了以后还是通信失败的。然后在api/uc.php文件的59号做修 改
原有的:
//$GLOBALS['db'] = new dbstuff;
//$GLOBALS['db']->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect, true, $dbcharset);
//$GLOBALS['tablepre'] = $tablepre;
? 修改以后的
$GLOBALS['db'] = new ucclient_db;
$GLOBALS['db']->connect(UC_DBHOST, UC_DBUSER, UC_DBPW, UC_DBNAME, UC_DBCONNECT, true, UC_DBCHARSET);
$GLOBALS['tablepre'] = UC_DBTABLEPRE;
然后保存,现在返回到ucenter后台中的应用列表中查看是通信成功的。
那么通信成功以后,下面接着书写同步登录和同步注册的步骤:
1、同步注册?
在lib/org/目录下创建一个文件,UcService.php,在此文件中书写代码:
class UcService{
public function __construct(){
//BASE_PATH在入品的配置文件中建立一个常量,并赋值define('BASE_PATH',dirname(__FILE__));
require_once BASE_PATH . '/config_ucenter.php';
require_once BASE_PATH . '/uc_client/client.php';
}
/*
* 会员注册
**/
public function register($username, $password, $email){
$uid = uc_user_register($username, $password, $email);//UCenter的注册验证函数
if($uid <= 0) {
if($uid == -1) {
return '用户名不合法';
} elseif($uid == -2) {
return '包含不允许注册的词语';
} elseif($uid == -3) {
return '用户名已经存在';
} elseif($uid == -4) {
return 'Email 格式有误';
} elseif($uid == -5) {
return 'Email 不允许注册';
} elseif($uid == -6) {
return '该 Email 已经被注册';
} else {
return '未定义';
}
} else {
return intval($uid);//返回一个非负数
}
}
/*
* 会员登录
* */
public function uc_login($username, $password){
list($uid, $username, $password, $email) = uc_user_login($username, $password);
if($uid > 0) {
return array(
'uid' => $uid,
'username' => $username,
'password' => $password,
'email' => $email
);
} elseif($uid == -1) {
return '用户不存在,或者被删除';
} elseif($uid == -2) {
return '密码错误';
} elseif($uid == -3) {
return '安全提问错误';
} else {
return '未定义';
}
}
public function uc_synlogin($uid){
return uc_user_synlogin($uid);
}
/*
* 会员退出
* */
public function uc_user_logout(){
setcookie('Example_auth', '', -86400);
//生成同步退出的代码
$ucsynlogout = uc_user_synlogout();
return $ucsynlogout;
}
}
然后在lib/Action下建立MemberAction.class.php文件,显示模板在模板中创建注册和登录页面就不说了。在这里贴出注册和登录的代码
public function index(){
if(!empty($_COOKIE['Example_auth'])) {
list($Example_uid, $Example_username) = explode("\t", uc_authcode($_COOKIE['Example_auth'], 'DECODE'));
}else {
$Example_uid = $Example_username = '';
}
if(!$Example_username) {
//用户未登录
echo "<a href="http://murongshuai.blog.163.com/.U('Index/memlogin').">登录</a> ";
echo "<a href="http://murongshuai.blog.163.com/.U('Index/memberreg').">注册</a> ";
} else {
//用户已登录
dump($Example_uid);
dump($Example_username);
echo " <a href="http://murongshuai.blog.163.com/.U('Index/mem_loginout').">退出</a> ";
}
}
public function addmember(){
if($this->isPost()){
$username = $_POST['me_username'];
$email = $_POST['me_email'];
$password = trim($_POST['me_password']);
import('@.Org.UcService');//导入第三方类文件
$ucService = new UcService;//实例化UcService类
$uid = $ucService->register($username, $password, $email);//注册到UCenter
if(is_numeric($uid)){//如果上面注册成功将返回一个int类型的数字
$M = D('Member');
if ($vo = $M->create()) {
if ($M->add()) {
$this->success('注册成功!');
} else {
$this->error('注册失败!');
}
} else {
$this->error();
}
}else{
exit($uid);
}
}else{
$this->error('非法数据!');
}
}
/*
* 会员登录
* */
public function memlogin(){
$this->display();
}
public function checkLogin() {
if(!$_POST['me_username']) $this->error('帐号错误!');
if(!$_POST['me_password']) $this->error('密码错误!');
if(empty($_POST['verify'])) $this->error('验证码必须!');
import('@.Org.UcService');//导入第三方类文件
$ucService = new UcService;
$uidarray = $ucService->uc_login($_POST['me_username'], $_POST['me_password']);
$loginurl=$ucService->uc_synlogin($uidarray['uid']);
echo $loginurl;//输出同步登录代码,否则无法同步登录
if(!is_string($uidarray)){
//生成认证条件
$map = array();
// 支持使用绑定帐号登录
$map['me_username'] = $_POST['me_username'];
$map["status"] = array('gt',0);
if($_SESSION['verify'] != md5($_POST['verify'])) {
$this->error('验证码错误!');
}
$mem_M = M('Member');
$memberinfo=$mem_M->where($map)->find();
if(false === $memberinfo) {
$this->error('帐号不存在或已禁用!');
}elseif($memberinfo['status']==0){
$this->error('帐号已禁用!');
}else {
$password = md5($_POST['me_password']);
if($memberinfo['me_password'] != $password) {
$this->error('密码错误!');
}
//用户登陆成功,设置 Cookie,加密直接用 uc_authcode 函数,用户使用自己的函数
cookie('Example_auth', uc_authcode($uidarray['uid']."\t".$uidarray['username'], 'ENCODE'));
session(C('USERHOME_AUTH_KEY'), $memberinfo['id']);
session('email', $memberinfo['email'] );
session('loginUserName', $memberinfo['loginUserName']);
session('lastLoginTime', $memberinfo['lastLoginTime']);
session('loginnum', $memberinfo['loginnum']);
session('lastloginip', $memberinfo['lastloginip']);
//保存登录信息(相当于更新信息)
$data = array();
$data['id'] = $memberinfo['id'];
$data['lastlogintime'] = time();
$data['loginnum'] = array('exp','loginnum+1');
$data['lastloginip'] = get_client_ip();
//$data['verify'] = $authInfo['verify'];
$this->Member->save($data);
$this->success('登录成功!',U('Index/index'));
}
}
}
public function mem_loginout(){
if(isset($_SESSION[C('USERHOME_AUTH_KEY')])) {
//退出Ucenter
import('@.Org.UcService');//导入第三方类文件
$ucService = new UcService;
$ucsynlogout =$ucService->uc_user_logout();
echo $ucsynlogout;
unset($_SESSION[C('USERHOME_AUTH_KEY')]);
unset($_SESSION);
session_destroy();
$this->assign("jumpUrl",__URL__);
$this->success('登出成功!');
}else {
$this->success('已经退出');
}
}
到这里就可以实现同步注册和同步登录同步退出了