其实任何一个系统都一样,在A系统注册后,如何到B系统自动激活?其实很方便,修改一下每一个系统的uc.php中的synlogin方法即可,我这里以discuz 7为例写了一个简单的(我没有判断uid无效的情况,实际应用中需注意,但其实问题也不大,因为返回的值被你自己插入后也全是空,如果为了严谨,还是加上一个判断较好)
function synlogin($get, $post) {
$uid = $get['uid'];
$username = $get['username'];
if(!API_SYNLOGIN) {
return API_RETURN_FORBIDDEN;
}require_once $this->appdir.’./forumdata/cache/cache_settings.php’;
$cookietime = 2592000;
$discuz_auth_key = md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']);
header(‘P3P: CP=”CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR”‘);
$uid = intval($uid);
$query = $this->db->query(“SELECT username, uid, password, secques FROM “.$this->tablepre.”members WHERE uid=’$uid’”);
if($member = $this->db->fetch_array($query)) {
_setcookie(‘sid’, ”, -86400 * 365);
_setcookie(‘cookietime’, $cookietime, 31536000);
_setcookie(‘auth’, _authcode(“$member[password]\t$member[secques]\t$member[uid]“, ‘ENCODE’, $discuz_auth_key), $cookietime);
} else {
require_once $this->appdir.’./uc_client/client.php’;list($tmp['uid'], $tmp['username'], $tmp['email']) = uc_get_user($uid,1);
$password = md5(time());
$onlineip = $_SERVER['REMOTE_ADDR'];
$timestamp = time();
$secques = ”;
$this->db->query(“INSERT INTO “.$this->tablepre.”members (uid, username, password, secques, adminid, groupid, regip, regdate, lastvisit, lastactivity, posts, credits, email, showemail, timeoffset, pmsound, invisible, newsletter) VALUES (‘$uid’, ‘$username’, ‘$password’, ”, ’0′, ’10′, ‘$onlineip’, ‘$timestamp’, ‘$timestamp’, ‘$timestamp’, ’0′, ’0′, ‘”.$tmp['email'].”‘, ’0′, ’9999′, ’1′, ’0′, ’1′)”);
$this->db->query(“REPLACE INTO “.$this->tablepre.”memberfields (uid) VALUES (‘$uid’)”);
_setcookie(‘sid’, ”, -86400 * 365);
_setcookie(‘cookietime’, $cookietime, 31536000);
_setcookie(‘auth’, _authcode(“$password\t$secques\t$uid”, ‘ENCODE’, $discuz_auth_key), $cookietime);
}
}
这其中有几个需要注意一下,新用户在discuz中涉及到两个表:member和memberfield。然后member的表字段,请尽量与我上面写的一致,否则有可能还需要让你手工激活。(至于为什么,我忘了,这是一年前的代码了。)
刚好需要 非常感谢
太感谢了,搞了一天的ucenter整合。
看代码解决了同步登陆的问题。 正在搞同步注册的问题,官方都在说的被动激法。
原本一起在想,攺变下uc的注册函数,思路和同步登陆一样,呼出js调用应用接口。
看你的的帖子顿悟到:登陆激活。 这个简单的方法
你这方法,比较局限。我们应分析一下在ucenter里已同步,为什么在discuz里要激活的原因:用uc_user_register()这个函数,只是把会员信息保存在ucenter这个数据库的表里,而未保存在discuz的会员表里(即使ucenter和discuz是同一个数据库),所以在其它应用里注册(登陆),再到discuz时,检测出其本身会员表里没有会员信息,所以提示要激活.
上面的方法,也是为针对上面的原因,insert to members! or insert into memberfields.
不过,上面以$this->tablepre这样表示discuz的表前缀,和以$this->db为当前数据库对像,有好大的局限性,只适合ucenter和discuz的数据表同时安装在同一个数据库里,且数据表的前缀统一.
如果ucenter和discuz是分开独立安装,上面的方法就要好多地方要改进.比如要实例一个discuz 的db对象.
不过,我这里也提出一个解决方案:不修改ucenter,而是修改discuz那register.php这个文件,在if($action == ‘activation’) 里面,用上面的思维:
$db->query(“INSERT INTO “.$tablepre.”members (uid, username, password, secques, adminid, groupid, regip, regdate, lastvisit, lastactivity, posts, credits, email, showemail, timeoffset, pmsound, invisible, newsletter) VALUES (‘$uid’, ‘$username’, ‘$password’, ”, ’0′, ’10′, ‘$onlineip’, ‘$timestamp’, ‘$timestamp’, ‘$timestamp’, ’0′, ’0′, ‘”.$tmp['email'].”‘, ’0′, ’9999′, ’1′, ’0′, ’1′)”);
$db->query(“REPLACE INTO “.$tablepre.”memberfields (uid) VALUES (‘$uid’)”);
实现自动把登陆信息插入当前discuz的会员表.
这样做的原因,如果ucenter是一个多个应用的中心,就不会为把ucenter的synlogin修改得面目全非,而是通过修改每个应用的检测登陆,来实现.
@itlong
不知道你是否确实理解我想表达的功能的含义。因为我说的其实是同步注册并激活。所以,必须要在uc.php里改动。而不是改动ucenter。你所说的,其实每个系统里都有这个功能,即自动把ucenter里的数据导入到当前的系统中。