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通信成功。如下图

  本人在操作过程中,通信是成功的,如果你的显示通信失败,可点击上图中的相应编辑按钮,根据提示正确配置。如果你是一步步按照本文来操作,基本上都会通信成功的,所以这里不对通信失败情况做如何处理说明,如果有问题可留言我,一块交流。

  接下来,有个很重要的一步,就是分别打开ecshopdiscuz目录下的uc_client\data\cache\apps.php文件,检查是否都配置了ECShopDiscuz这两个应用,如果两个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同步退出。

  按照本文安装ECShopDiscuz,并且设置好通信规则之后,经过一一尝试,发现上述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 -

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

取消

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

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

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

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

海报生成中...