Ucenter接入第三方开发总结

Ucenter 用户管理中心,接入到thinkphp,以实现同步注册登录和退出。

我也不知道这篇文章要如何写,我就记录一下我开发历程吧,其中有遇到一些问题,不过都迎刃而解!

这里有一个重要的问题,就是ucenter客户端uc_client 里面已经有一个model 名字叫user model。在这里引入到thinkphp后,如果你原来就有一个user model 这里会冲突。我原先想把uc_client里面的usermodel改掉,但是太多地方要改了,一环扣一环。。所以我就把thinkphp里面的user model 改名了。。

首先我是下载 dz论坛带ucenter1.5的.

然后我百度搜索ucenter开发文档.

下载了两个版本1.0的和1.5的,不过光看开放文档是搞不懂的。

后来我又下载了ucenter1.5安装版,里面带有开发文档和实例。

1.在thinkphp目录下新建一个ucenterapi的文件夹,里面包含3个文件夹(uc_client,include,api)和一个文件(config.inc.php)。

复制论坛目录下的uc_client到此目录下。从实例那里拷贝一个config.inc.php配置文件、api文件夹里面有一个uc.php接口文件、include文件夹下有一个 db_mysql.class.php文件。

2.到ucenter后台新建一个应用,自定义配置,开启同步登陆,ip填127.0.0.1,URL:http://127.0.0.2/ucenterapi 配置好config.inc.php

基本配置信息如下:

define('UC_CONNECT', 'mysql');				// 连接 UCenter 的方式: mysql/NULL, 默认为空时为 fscoketopen()
							// mysql 是直接连接的数据库, 为了效率, 建议采用 mysql
//数据库相关 (mysql 连接时, 并且没有设置 UC_DBLINK 时, 需要配置以下变量)
define('UC_DBHOST', 'localhost');			// UCenter 数据库主机
define('UC_DBUSER', 'root');				// UCenter 数据库用户名
define('UC_DBPW', '');					// UCenter 数据库密码
define('UC_DBNAME', 'cosbbs');				// UCenter 数据库名称
define('UC_DBCHARSET', 'utf8');				// UCenter 数据库字符集
define('UC_DBTABLEPRE', 'cosbbs.cdb_uc_');			// UCenter 数据库表前缀

//通信相关
define('UC_KEY', '123456789gdfgfdgdfgdffffsdfsdfsdfsdfsd');				// 与 UCenter 的通信密钥, 要与 UCenter 保持一致
define('UC_API', 'http://127.0.0.2/bbs/uc_server');	// UCenter 的 URL 地址, 在调用头像时依赖此常量
define('UC_CHARSET', 'utf8');				// UCenter 的字符集
define('UC_IP', '127.0.0.1');					// UCenter 的 IP, 当 UC_CONNECT 为非 mysql 方式时, 并且当前应用服务器解析域名有问题时, 请设置此值
define('UC_APPID', 2);

$dbhost = 'localhost';			// 数据库服务器
$dbuser = 'root';			// 数据库用户名
$dbpw = '';				// 数据库密码
$dbname = 'ssss';			// 数据库名
$pconnect = 0;				// 数据库持久连接 0=关闭, 1=打开
$tablepre = 'ss_';   		// 表名前缀, 同一数据库安装多个论坛请修改此处
$dbcharset = 'gbk';			// MySQL 字符集, 可选 'gbk', 'big5', 'utf8', 'latin1', 留空为按照论坛字符集设定

//同步登录 Cookie 设置
$cookiedomain = ''; 			// cookie 作用域
$cookiepath = '/';			// cookie 作用路径

配置好信息密匙对应之后,ucenter后台应该可以看到通讯成功了!

3.把文件引入thinkphp,让thinkphp可以调用接口中的方法。具体就在入口文件处引入:

include 'ucenterapi/config.inc.php';
include 'ucenterapi/uc_client/client.php';

4.同步注册开发

在thinkphp注册方法里面相应的位置插入:

if(uc_get_user($email)){
				$this->error("此用户已存在于平台,请登录激活,或者更换用户名注册。");				
				}	
			$uid = uc_user_register($email, $password,$email."@shanmao.me");
				if($uid <= 0) {
			if($uid == -1) {
				$this->error('用户同步到平台出错,请联系客服:用户名不合法');				
			} elseif($uid == -2) {
					$this->error('用户同步到平台出错,请联系客服:包含要允许注册的词语');				
			} elseif($uid == -3) {
					$this->error('用户同步到平台出错,请联系客服:用户名已经存在于平台上');				
			} elseif($uid == -4) {
					$this->error('用户同步到平台出错,请联系客服:Email 格式有误');			
			} elseif($uid == -5) {
				$this->error('用户同步到平台出错,请联系客服:Email 不允许注册');					
			} elseif($uid == -6) {
					$this->error('用户同步到平台出错,请联系客服:该 Email 已经被注册');				
			} else {
					$this->error('用户同步到平台出错,请联系客服:未定义');			
			}
		}

具体请看手册。

5.同步登陆,这个比较麻烦了。由于之前已经有一部分用户了,所以要同步到ucenter,我看网络上好像有一个同步程序,不过我没认真看,我在想两边密码机制不一样,如何同步。于是我在用户第一次登录的时候直接写入到ucenter,以后用户再登录就直接获取ucenter的用户数据,不用本地数据了。

public function uc_login_thinkphp($username,$password,$rset){
		 
				/*Ucenter add by shanmao*/
	//通过接口判断登录帐号的正确性,返回值为数组
	//$listf = uc_user_login('admin',123);
	$listf = uc_user_login($username,$password);
	$uid =$listf[0];
	if($uid > 0) {
		if(!$rset) {
			//判断用户是否存在于thinkphp用户表,不存在则写入
			$auth = rawurlencode(uc_authcode("$username\t".time(), 'ENCODE'));
			$data_uc['username']=$username;
			$data_uc['pass']=md5($password);//你的密码,不过肯定要加强加密,不是md5那么简单。	
			$data_uc["account_status"]=1;
			$re_uc = M("User")->add($data_uc);//同步ucenter 里面的用户到本地数据库
			if($re_uc){
			$this->ajaxReturn($auth,'您已激活本应用,请再次登录!',0);
			}else{
			$this->ajaxReturn('','数据错误!',0);	
				}
			exit;
		}		
		//生成同步登录的代码  js 代码。后面输出。
		$ucsynlogin = uc_user_synlogin($uid);
		if($ucsynlogin){
			$_SESSION['uc_login_info']="";//ucenter同步登陆成功提示语!
			};
		return $ucsynlogin;
	
	} elseif($uid == -1) {//判断用户不存在平台,则登录的时候要写入到平台!
	
	if (1) {//这里是判断用户密码是否正确
		$uid = uc_user_register($username, $password, $rset['email']!="" ? $rset['email'] : $username."@cityofsteam.com" );
		if($uid <= 0) {
			if($uid == -1) {
				$this->error('用户同步到平台出错,请联系客服:用户名不合法');				
			} elseif($uid == -2) {
					$this->error('用户同步到平台出错,请联系客服:包含要允许注册的词语');				
			} elseif($uid == -3) {
					$this->error('用户同步到平台出错,请联系客服:用户名已经存在于平台上');				
			} elseif($uid == -4) {
					$this->error('用户同步到平台出错,请联系客服:Email 格式有误');			
			} elseif($uid == -5) {
				$this->error('用户同步到平台出错,请联系客服:Email 不允许注册');					
			} elseif($uid == -6) {
					$this->error('用户同步到平台出错,请联系客服:该 Email 已经被注册');				
			} else {
					$this->error('用户同步到平台出错,请联系客服:未定义');			
			}
		}else{
			// 写入平台成功
			$_SESSION['uc_login_info']="您的帐户已经同步到用户中心,可以用此帐户登录论坛,感谢!";
			}
		
		
	}else{
		$this->error('密码不正确,或者帐号被锁定。');
		}
	//$this->error('平台用户不存在,或者被删除');	
	} elseif($uid == -2) {
		$this->error('平台密码错');
	} else {
		$this->error('未定义');
	}
/*Ucenter add by shanmao*/	
		 		 
		 
		 }

6.同步退出很简单:

$ucsynlogout = uc_user_synlogout();//生成同步退出的代码
		echo $ucsynlogout;

到这里已经做好了正向登录的同步注册,登陆和退出。也就是thinkphp登录和退出之后,你论坛也可以实现登录退出。

反向:也就是你从论坛注册登录退出之后,你thinkphp应用也能同步登陆退出。

1.打开api文件夹下的uc.php文件

所有反向的执行都在这个文件里面,具体参考开发手册。

2.同步登陆

function synlogin($get, $post) {
		$uid = $get['uid'];
		$username = $get['username'];
		$cookietime = 2592000;
		if(!API_SYNLOGIN) {
			return API_RETURN_FORBIDDEN;			
		}
		$query = $this->db->query("select * from user  WHERE username='$username'");
		if($query)
		$rset =  $this->db->fetch_array($query);
		$data = "";//这里根据你自己的需求添加登录代码。
		header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
		//_setcookie('rset',json_encode($rset['id']),time()+86400);
		//_setcookie('cookietime_cos', $cookietime, 31536000);
		_setcookie('login', json_encode($data),$cookietime);//设置登录cookie
		
		
	}


3.同步退出:

function synlogout($get, $post) {
		if(!API_SYNLOGOUT) {
			return API_RETURN_FORBIDDEN;
		}	
		//note 同步登出 API 接口
		
		header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
		_setcookie('RememberMe', NULL,  -86400 * 365);
		_setcookie('login', NULL,  -86400 * 365);
		//_setcookie('fsdfsd656565656', "fsdfsdfsdfsd",3600);
		//session_destroy();
	}

4.同步更改密码://注意这里 $get['password']获取不到 后台发送过来的密码,可能是由于整合在论坛的缘故,需要修改文件才能接收到密码。

function updatepw($get, $post) {
		if(!API_UPDATEPW) {
			return API_RETURN_FORBIDDEN;
		}
		$username = $get['username'];	
		$password = md5($get['password']);	
		$this->db->query("UPDATE ".$this->tablepre."user SET pass_word='$password' WHERE username='$username'");
		return API_RETURN_SUCCEED;
	}

接收密码修改文件:uc_server/control/admin/uer.php
修改:$_ENV['note']->add(‘updatepw’, ‘username=’.urlencode($username).’&password=’);
为$_ENV['note']->add(‘updatepw’, ‘username=’.urlencode($username).”&password=”.$orgpassword);

到此为止一切都搞定。

更多

本文固定链接: http://shanmao.me/webback/thinkphp/ucenter-jie-ru-di-san-fang-kai-fa-zong-jie | 山猫的博客

该日志由 admin 于2013年03月18日发表在 php, thinkphp 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: Ucenter接入第三方开发总结 | 山猫的博客
关键字: , , ,