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

基本配置信息如下:

[code]
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 作用路径
[/code]

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

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

[code]
include ‘ucenterapi/config.inc.php’;
include ‘ucenterapi/uc_client/client.php’;
[/code]

4.同步注册开发

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

[code lang=”php”]
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(‘用户同步到平台出错,请联系客服:未定义’);
}
}
[/code]

具体请看手册。

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

}
[/code]
6.同步退出很简单:
[code]
$ucsynlogout = uc_user_synlogout();//生成同步退出的代码
echo $ucsynlogout;
[/code]

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

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

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

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

2.同步登陆
[code lang=”php”]
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

}

[/code]

3.同步退出:

[code]
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();
}
[/code]

4.同步更改密码://注意这里 $get[‘password’]获取不到 后台发送过来的密码,可能是由于整合在论坛的缘故,需要修改文件才能接收到密码。
[code]
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;
}
[/code]

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

到此为止一切都搞定。

“Ucenter接入第三方开发总结”的4个回复

评论已关闭。