ECSHOP会员整合ECSHOP与discuz论坛

我们要实现的效果是

1、ec login dx login ec logout dx logout -> ecshop登陆 discuz登陆,ecshop退出 discuz退出

2、ec login dx login dx logout ec logout -> ecshop登陆 discuz登陆,discuz退出 ecshop退出

3、dx login ec login dx logout ec logout -> discuz登陆 ecshop登陆,discuz退出 ecshop退出

4、dx login ec login ec logout dx logout -> discuz登陆 ecshop登陆,ecshop退出 discuz退出

第一步,安装ecshop和discuz

安装包的文件编码统一和安装过程这里略过了

第二步,ecshop会员整合->安装UCenter

把discuz安装包里面的 uc_client 文件夹复制一份到 ecshop 网站目录下。

ecshop后台->会员管理->会员整合



最后登陆uc_server看“应用管理”是否通信成功

第三步,测试同步登陆和同步退出

通信成功后,我们在ecshop网站上注册一个新用户,注册成功后,并自动登陆,再打开discuz网站,发现没有同步登陆。

查看uc_server->用户管理 里面有刚刚ecshop注册的那个新用户了,再看discuz后台管理 -> 用户 -> 用户管理 里面没有这个新用户。

回到ecshop注册页面的php处理,user.php,大概在272行,

$ucdata = empty($user->ucdata)? "" : $user->ucdata;

改成

$user->login($username,$password);$ucdata = isset($user->ucdata) ? $user->ucdata : '';

$user->login 的相关详细介绍可以参考ecshop中$user对象

再来重新注册一个新ecshop用户,跟踪同步登陆代码,发现ecshop新注册的用户还是只存放到Ucenter中,需要激活之后才会写入到pre_common_member中,同时dsetcookie()。

这个问题的解决方法增加对pre_common_member及pre_common_member_count的写入(该文件为discuz下的api目录中的uc.php)

大概191行:

if(($member = getuserbyuid($uid, 1))) {

dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);}

修改成

if(($member = getuserbyuid($uid, 1))) {

dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);}else{

//下面为增加部分

$username = $get['username'];

$password = md5(time().rand(100000, 999999));

$email = $get['email'];

$ip = $_SERVER['REMOTE_ADDR'];

$time = time();

$userdata = array(

'uid' => $uid,

'username' => $username,

'password' => $password,

'email' => $email,

'adminid' => 0,

'groupid' => 10,

'regdate' => $time,

'credits' => 0,

'timeoffset' => 9999

);

DB::insert('common_member', $userdata);

$status_data = array(

'uid' => $uid,

'regip' => $ip,

'lastip' => $ip,

'lastvisit' => $time,

'lastactivity' => $time,

'lastpost' => 0,

'lastsendmail' => 0,

);

DB::insert('common_member_status', $status_data);

DB::insert('common_member_profile', array('uid' => $uid));

DB::insert('common_member_field_forum', array('uid' => $uid));

DB::insert('common_member_field_home', array('uid' => $uid));

DB::insert('common_member_count', array('uid' => $uid));

$query = DB::query("SELECT uid, username, password FROM ".DB::table('common_member')." WHERE uid='$uid'");

if($member = DB::fetch($query)) {

dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);

}}

最后,更新3个后台的缓存,ecshop后台,discuz后台,Ucenter后台。再来注册或者登陆,可以同步登陆了。

通信成功,不能同步登陆 和 新用户需要激活问题,解决!

还记得最前面我们要的效果吗?

1、ec login dx login ec logout dx logout -> ecshop登陆 discuz登陆,ecshop退出 discuz退出

在ecshop中退出,发现discuz没有退出,继续找问题。

在ecshop程序的 includes\modules\integrates\ucenter.php 文件logout()方法中,第205行

$this->ucdata = uc_call("uc_user_synlogout"); //同步退出

发现调用call_user_func_array 时必须要二个参数都要有,否则无法调用

所以上面的代码应该修改成:

$this->ucdata = uc_call("uc_user_synlogout",array("0")); //同步退出

或者修改 ecshop程序的 includes\lib_common.php 大概2152行中

function uc_call($func, $params=null)

修改成

function uc_call($func, $params=array())

这样,我们的第一个效果就完成了。

2、ec login dx login dx logout ec logout -> ecshop登陆 discuz登陆,discuz退出 ecshop退出

第一个效果做好后,发现第二个效果有问题,discuz退出,ecshop没有退出。

继续找原因,在ecshop登陆后,discuz 点退出,

会发送一个javascript申请到 /api/uc.php的 logout请求 ( 如果setcookie 只是在 /bbs/ 下 设置cookie 为空,那么就清空不了cookie )

所以ecshop程序 api/uc.php 里面是function set_cookie( 方法应该是这样

function set_cookie($user_id='', $user_name = '', $email = ''){

if (empty($user_id))

{

/* 摧毁cookie */

$time = time() - 3600;

//setcookie('ECS[user_id]', '', $time);

//setcookie('ECS[username]', '', $time);

//setcookie('ECS[email]', '', $time);

setcookie('ECS[user_id]', '', $time, $GLOBALS['cookie_path'], $GLOBALS['cookie_domain']);

setcookie('ECS[username]', '', $time, $GLOBALS['cookie_path'], $GLOBALS['cookie_domain']);

setcookie('ECS[email]', '', $time, $GLOBALS['cookie_path'], $GLOBALS['cookie_domain']);

}

else

{

/* 设置cookie */

$time = time() + 3600 * 24 * 30;

setcookie("ECS[user_id]", $user_id, $time, $GLOBALS['cookie_path'], $GLOBALS['cookie_domain']);

setcookie("ECS[username]", $user_name, $time, $GLOBALS['cookie_path'], $GLOBALS['cookie_domain']);

setcookie("ECS[email]", $email, $time, $GLOBALS['cookie_path'], $GLOBALS['cookie_domain']);

}}

还有要修改ecshop的 ucenter插件,includes/modules/integrates/ucenter.php

function ucenter($cfg)

{

parent::integrate(array());

$this->user_table = 'users';

$this->field_id = 'user_id';

$this->field_name = 'user_name';

$this->field_pass = 'password';

$this->field_email = 'email';

$this->field_gender = 'sex';

$this->field_bday = 'birthday';

$this->field_reg_date = 'reg_time';

$this->need_sync = false;

$this->is_ecshop = 1;

$this->cookie_path = $GLOBALS['cookie_path']; //wuruhua

$this->cookie_domain = $GLOBALS['cookie_domain']; //wuruhua

function set_cookie($username='')

{

if (empty($username))

{

/* 摧毁cookie */

$time = time() - 3600;

//setcookie("ECS[user_id]", '', $time, $this->cookie_path);

//setcookie("ECS[password]", '', $time, $this->cookie_path);

setcookie("ECS[user_id]", '', $time, $this->cookie_path, $this->cookie_domain); //wuruhua

setcookie("ECS[password]", '', $time, $this->cookie_path, $this->cookie_domain); //wuruhua

}

最后,如果你发现2个程序的uc_client配置文件不一致的话,还要把ecshop程序下的 uc_client\data\cache\apps.php 复制-> 覆盖到 discuz 程序下的 uc_client\data\cache\apps.php

这样,我们的第2个效果也完成了。然后你会发现,当你把第一和第二个效果完成了,第三和第四也是OK的了。

过程中修改的文件有:

discuz程序:

api\uc.php

uc_client\data\cache\apps.php

ecshop程序:

user.php

api\uc.php

includes\lib_common.php

includes\modules\integrates\ucenter.php

ecshop ucenter卸载

登录ecshop后台,“SQL查询”提交以下语句,清除缓存!

update ecs_shop_config set value='ecshop' where code='integrate_code';update ecs_shop_config set value='' where code='integrate_config';

这里的SQL将整合信息还原成默认的ecshop方式,然后清空整合数据。

注意:如果你的数据表前缀 不是 ecs_ 请自行修改 本站内容如转载,需注明来源:银众网络,本文链接:http://www.yinzhong.net/article/31.html