ECShop和Discuz完美整合方案(上)
2019.10.25 - 宅先生
最近,公司的一个电商项目在重构,需要在商城上面挂一个论坛。大boss的要求是,能够实现商城和论坛,会员同步注册、登陆以及退出功能。无疑,康盛的ECShop以及Discuz,再结合UCenter的通信原理,能够完美解决这个问题。
最新版本的ECShop是2.7.3的,Discuz是X3.1的,安装过程这里不做详细介绍(注意编码的一致性)。只是特别说明一点,为了实现会员整合,需要安装UCenter,这里并没有单独安装,只是在安装Discuz的时候,选择“全新安装Discuz! X (含UCenter Server)”方式,如下图(其实单独安装道理也是一样的)
安装完ECShop和Discuz,接下来就是整合会员的操作了。
一:设置UCenter通信规则
进入ecshop后台 -> 会员整合(会员管理菜单中) -> 安装 Ucenter,会出现如下提示。
根据提示,将 discuz中的uc_client整个文件夹直接拷贝到ecshop根目录下,然后重新进行此步骤。如下图,按照提示输入UCenter的URL,根据你的实际安装路径填写,这里我的UCenter的URL为“http://localhost/integration/discuz/uc_server”(注意:结尾请不要加“/”),创始人密码是你在安装Discuz时创建的。
输入完之后点击“下一步”或者“直接保存配置信息”,若选择“下一步”,再根据提示,选择你希望的会员合并方式,点击“开始导入”即可。
经过第一步之后,我们登陆到Discuz后台,点击导航中的“UCenter”-> 选择"应用管理"菜单,查看ECShop和Discuz是否已经和UCenter通信成功。如下图
本人在操作过程中,通信是成功的,如果你的显示“通信失败”,可点击上图中的相应“编辑”按钮,根据提示正确配置。如果你是一步步按照本文来操作,基本上都会通信成功的,所以这里不对“通信失败”情况做如何处理说明,如果有问题可留言我,一块交流。
接下来,有个很重要的一步,就是分别打开ecshop和discuz目录下的uc_client\data\cache\apps.php文件,检查是否都配置了ECShop和Discuz这两个应用,如果两个apps.php文件内容都类似于下面这段代码的形式,则表示是OK的
<?php
$_CACHE['apps'] = array (
1 =>
array (
'appid' => '1',
'type' => 'DISCUZX',
'name' => 'Discuz! Board',
'url' => 'http://localhost/integration/discuz',
'ip' => '',
'viewprourl' => '',
'apifilename' => 'uc.php',
'charset' => '',
'synlogin' => '1',
'extra' =>
array (
'apppath' => '',
'extraurl' => ' ',
),
'recvnote' => '1',
),
2 =>
array (
'appid' => '2',
'type' => 'ECSHOP',
'name' => 'ECSHOP',
'url' => 'http://localhost/integration/ecshop',
'ip' => '',
'viewprourl' => '',
'apifilename' => 'uc.php',
'charset' => 'utf-8',
'synlogin' => '1',
'extra' =>
array (
'apppath' => '',
'extraurl' => ' ',
),
'recvnote' => '1',
),
'UC_API' => 'http://localhost/integration/discuz/uc_server',
);
若只有其中一个OK,则将另外一个复制替换即可。
二:实现同步登陆/退出
关于同步登陆/退出,要实现以下6种情况:
①ECShop登陆->Discuz同步登陆;
②ECShop登陆->Discuz同步登陆->ECShop退出->Discuz同步退出;
③ECShop登陆->Discuz同步登陆->Discuz退出->ECShop同步退出;
④Discuz登陆->ECShop同步登陆;
⑤Discuz登陆->ECShop同步登陆->Discuz退出->ECShop同步退出;
⑥Discuz登陆->ECShop同步登陆->ECShop退出->Discuz同步退出。
按照本文安装ECShop和Discuz,并且设置好通信规则之后,经过一一尝试,发现上述6种情况,只有第①种正常,其余情况都没有实现,现逐个解决。
情况②:跟踪代码发现,在调用同步退出函数"uc_user_synlogout"时,由于参数问题,导致调用失败,所以只需做如下修改即可,找到ECShop根目录下的includes\modules\integrates\ucenter.php文件,在“logout”函数(大致在200行左右)中有这么一行代码
$this->ucdata = uc_call("uc_user_synlogout"); //同步退出
将其修改为
$this->ucdata = uc_call("uc_user_synlogout", array()); //同步退出
问题解决。原因在于uc_call函数中调用了call_user_func_array()函数,而该函数要求两个参数都要有,不然无法调用。
情况③:经过调试,发现在调用ecshop同步退出函数“synlogout”(api\uc.php文件)的时候,由于cookie域的问题,导致清除cookie失败,所以只需将ecshop根目录下api\uc.php文件中“set_cookie”函数(大致在408行)如下代码
if (empty($user_id))
{
/* 摧毁cookie */
$time = time() - 3600;
setcookie('ECS[user_id]', '', $time);
setcookie('ECS[username]', '', $time);
setcookie('ECS[email]', '', $time);
}
修改为:
if (empty($user_id))
{
/* 摧毁cookie */
$time = time() - 3600;
setcookie('ECS[user_id]', '', $time, $GLOBALS['cookie_path']);
setcookie('ECS[username]', '', $time, $GLOBALS['cookie_path']);
setcookie('ECS[email]', '', $time, $GLOBALS['cookie_path']);
}
即可。
修改完②③两个bug之后,你会意外发现其他3种情况④⑤⑥也已经能够实现啦。是不是很简单呢?其实如果掌握了UCenter通信原理的机制,再懂得如何跟踪调试代码,我想关于同步登陆/退出的一切问题,都不是什么问题啦。
关于会员同步注册、删除同步以及后台同步的内容,请继续阅读ECShop和Discuz完美整合方案(下)
- END -


