ECShop和Discuz完美整合方案(下)

2019.10.25 - 宅先生

  传送门:ECShop和Discuz完美整合方案(上)

  三:同步注册的实现

  关于同步注册,主要实现两点:

    ①在ecshop中完成注册操作之后,ecshop和Discuz同时自动处于登陆状态;

    ②在Discuz中完成注册操作以后,Discuz和ecshop同时自动处于登陆状态。

  经过测试,目前情况是:

    ①在ecshop完成注册之后,ecshop自动处于登陆状态,但是Discuz并未登陆,需要在Discuz中登陆一次该账号,完成激活操作,方可实现同步登陆/退出;

    ②同样,在Discuz中完成注册之后,Discuz自动处于登陆状态,ecshop却并未登陆,退出Discuz之后,再次手动登陆,即可实现同步。

  现在贴出解决方案:

  问题①:跟踪ecshop注册代码发现,注册完成之后并没有调用同步登陆的代码,所以找到ecshop下的includes\modules\integrates\ucenter.php文件,在添加用户函数“add_user”(大致在210行左右)注册成功代码段

else
{
//注册成功,插入用户表
$reg_date = time();
$ip = real_ip();
$password = $this->compile_password(array('password'=>$password));
$this->db->query('INSERT INTO ' . $GLOBALS['ecs']->table("users") . "(`user_id`, `email`, `user_name`, `password`, `reg_time`, `last_login`, `last_ip`) VALUES ('$uid', '$email', '$username', '$password', '$reg_date', '$reg_date', '$ip')");
return true;
}

加入生成同步登陆js脚本的代码,具体如下

else
{
//注册成功,插入用户表
$reg_date = time();
$ip = real_ip();
$password = $this->compile_password(array('password'=>$password));
$this->db->query('INSERT INTO ' . $GLOBALS['ecs']->table("users") . "(`user_id`, `email`, `user_name`, `password`, `reg_time`, `last_login`, `last_ip`) VALUES ('$uid', '$email', '$username', '$password', '$reg_date', '$reg_date', '$ip')");
$this->ucdata = uc_call("uc_user_synlogin",array($uid)); //新增生成同步登陆脚本代码
return true;
}

按照上述修改完之后,发现虽然运行了同步登陆的脚本,但是Discuz并未成功登陆,Discuz仍需激活之后,才能同步,原来ecshop新注册用户,只会同步到UCenter中,必须激活之后,才会写入到Discuz的用户表。那么很明显,接下来要做的就是,在ecshop注册的同时,将信息写入到Discuz的用户表(pre_common_member及pre_common_member_count两张表),具体操作是在Discuz目录下找到api\uc.php中的同步登陆“synlogin”函数(180行左右),有这样一段代码

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

在其之后加入else部分,变成

if(($member = getuserbyuid($uid, 1))) {
dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
}else{//非激活状态下写入
$query = DB::query("SELECT email FROM ".DB::table('ucenter_members')." WHERE uid= ".$uid);
$email_row = DB::fetch($query);
if(!empty($email_row)){
$email = $email_row['email'];
}else{
$email = '';
}
$userdata = array(
'uid' => $get['uid'],
'username' => $get['username'],
'password' => $get['password'],
'email' => $email,
'adminid' => 0,
'groupid' => 10,
'regdate' => $get['time'],
'credits' => 0,
'timeoffset' => 9999
);
DB::insert('common_member', $userdata);
DB::insert('common_member_count', array('uid'=>$get['uid']));
dsetcookie('auth', authcode("$get[password]\t$get[uid]", 'ENCODE'),$cookietime);
}

现在再尝试,发现问题①解决啦。

  问题②:很自然,看到这个问题,第一感觉就想到,可能是Discuz注册完成之后,并没有调用同步登陆的代码。经排查,的确是这样,所以我们找到Discuz下的source\class\class_member.php文件,在“on_register”函数(356行左右)结尾有这么一段代码(大概在925行左右)

$param = array('bbname' => $this->setting['bbname'], 'username' => $_G['username'], 'usergroup' => $_G['group']['grouptitle'], 'uid' => $_G['uid']);
if(strpos($url_forward, $this->setting['regname']) !== false || strpos($url_forward, 'buyinvitecode') !== false) {
$url_forward = 'forum.php';
}
$href = str_replace("'", "\'", $url_forward);
$extra = array(
'showid' => 'succeedmessage',
'extrajs' => '',
'striptags' => false
);
showmessage($message, $url_forward, $param, $extra);

只要在其中加入同步登陆脚本即可,如下

$ucsynlogin = $this->setting['allowsynlogin'] ? uc_user_synlogin($_G['uid']) : '';
$param = array('bbname' => $this->setting['bbname'], 'username' => $_G['username'], 'usergroup' => $_G['group']['grouptitle'], 'uid' => $_G['uid']);
if(strpos($url_forward, $this->setting['regname']) !== false || strpos($url_forward, 'buyinvitecode') !== false) {
$url_forward = 'forum.php';
}
$href = str_replace("'", "\'", $url_forward);
$extra = array(
'showid' => 'succeedmessage',
'extrajs' => ''.$ucsynlogin,
'striptags' => false
);
showmessage($message, $url_forward, $param, $extra);

问题②解决。

  四:ecshopDiscuz以及UCenter后台添加会员,实现同步

  我们知道,在ecshop、Discuz以及UCenter管理后台中,均有手动添加用户的菜单,那么问题来了,通过管理后台添加的用户,是否实现同步了呢?

  经过本人对以下6种情况亲自测试,现作简单阐述说明:

    ①ecshop后台添加用户,从ecshop前台登陆,能够同步登陆到Discuz;

    ②ecshop后台添加用户,从Discuz前台登陆,激活后,能够同步登陆到ecshop;

    ③Discuz后台添加用户,从Discuz前台登陆,能够同步登陆到ecshop;

    ④Discuz后台添加用户,从ecshop前台登陆,能够同步登陆到Discuz;

    ⑤UCenter后台添加用户,从ecshop前台登陆,能够同步登陆到Discuz;

    ⑥UCenter后台添加用户,从Discuz前台登陆,激活后,能够同步登陆到ecshop。

  由此看来,不管是通过哪种方式添加的用户,均实现了同步,只是有一点,我们发现,只要不是通过Discuz前台注册或Discuz后台手动添加的用户,首次登陆Discuz,都会有一个提示“激活账号”的操作,这在业务逻辑上是说得通的,无可厚非。

  五:关于后台删除用户,是否同步的问题

  既然添加用户已经做到了同步,那么删除用户,是否同步呢?看一下亲测结果:

    ①ecshop后台删除会员,并没有同步删除UCenter和Discuz中的用户信息,所以在ecshop和Discuz前台,该用户仍可登陆;

    ②Discuz后台删除会员,没有选中“删除UCenter中的用户资料”一项,就没有同步删除UCenter和ecshop中的用户信息,所以在Discuz前台,只需完成激活,同样仍可登陆;

    ③Discuz后台删除用户,选中“删除UCenter中的用户资料”一项,就会同步删除UCenter和ecshop中的用户信息,那么该账号不管是在Discuz还是ecshop,均无法登陆了;

    ④UCenter后台删除用户,会同步删除Discuz中的用户信息,但ecshop的用户资料却没有同步删除,虽然这样,该账号仍然无法在ecshop前台登陆,并且还会在提示“账号错误”的同时,删除掉该账号的用户信息。

  所以,要想真正删除某些会员的信息,只需要从UCenter后台删除或者从Discuz后台删除(选中“删除UCenter中的用户资料”)即可。   

  结束语:码了那么久,希望没有把简单问题复杂化。

- END -

各位看官,如果你觉得文章不错,请鼓励鼓励吧~~

ECShop和Discuz完美整合方案(上)

​最近,公司的一个电商项目在重构,需要在商城上面挂一个论坛。大boss的要求是,能够实现商城和论坛,会员同步注册、登陆以及退出功能。无疑,康盛的ECShop以及Discuz,再结合UCenter的通信原理,能够完美解决这个问题。

取消

您的支持,是我继续创作的动力!

扫码支持
人生百态皆无常,最是一颗感恩心

打开支付宝扫一扫,即可进行扫码打赏

所得打赏均用于域名续费、服务器租赁等维持平台正常运营的必要支出。

海报生成中...