轻源码

  • QingYuanMa.com
  • 全球最大的互联网技术和资源下载平台
搜索
一起源码网 门户 ECShop网店 查看主题

ECSHOP会员整合ECSHOP与discuz论坛完美整合教程

发布者: goophy | 发布时间: 2018-8-5 15:09| 查看数: 5753| 评论数: 1|帖子模式

        我们要实现的效果是


        1、ec login  dx login  ec logout  dx logout -> 登陆 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行,
  1. $ucdata = empty($user->ucdata)? "" : $user->ucdata;
复制代码
改成
  1. $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行:
  1. if(($member = getuserbyuid($uid, 1))) {
  2.         dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);}
复制代码
修改成
  1. if(($member = getuserbyuid($uid, 1))) {
  2.         dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);}else{
  3.         //下面为增加部分
  4.         $username = $get['username'];
  5.         $password = md5(time().rand(100000, 999999));
  6.         $email = $get['email'];
  7.         $ip = $_SERVER['REMOTE_ADDR'];
  8.         $time = time();
  9.         $userdata = array(
  10.                 'uid' => $uid,
  11.                 'username' => $username,
  12.                 'password' => $password,
  13.                 'email' => $email,
  14.                 'adminid' => 0,
  15.                 'groupid' => 10,
  16.                 'regdate' => $time,
  17.                 'credits' => 0,
  18.                 'timeoffset' => 9999
  19.         );
  20.         DB::insert('common_member', $userdata);
  21.         $status_data = array(
  22.                 'uid' => $uid,
  23.                 'regip' => $ip,
  24.                 'lastip' => $ip,
  25.                 'lastvisit' => $time,
  26.                 'lastactivity' => $time,
  27.                 'lastpost' => 0,
  28.                 'lastsendmail' => 0,
  29.         );
  30.         DB::insert('common_member_status', $status_data);
  31.         DB::insert('common_member_profile', array('uid' => $uid));
  32.         DB::insert('common_member_field_forum', array('uid' => $uid));
  33.         DB::insert('common_member_field_home', array('uid' => $uid));
  34.         DB::insert('common_member_count', array('uid' => $uid));
  35.         $query = DB::query("SELECT uid, username, password FROM ".DB::table('common_member')." WHERE uid='$uid'");
  36.         if($member = DB::fetch($query)) {
  37.                 dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
  38.         }}
复制代码
最后,更新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行
  1. $this->ucdata = uc_call("uc_user_synlogout");   //同步退出
复制代码
发现调用call_user_func_array 时必须要二个参数都要有,否则无法调用
        所以上面的代码应该修改成:
  1. $this->ucdata = uc_call("uc_user_synlogout",array("0"));   //同步退出
复制代码
或者修改 ecshop程序的 includes\lib_common.php 大概2152行中
  1. function uc_call($func, $params=null)
复制代码
修改成
  1. 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( 方法应该是这样
  1. function set_cookie($user_id='', $user_name = '', $email = ''){
  2.     if (empty($user_id))
  3.     {
  4.         /* 摧毁cookie */
  5.         $time = time() - 3600;
  6.         //setcookie('ECS[user_id]',  '', $time);
  7.         //setcookie('ECS[username]', '', $time);
  8.         //setcookie('ECS[email]',    '', $time);
  9.                
  10.         setcookie('ECS[user_id]', '', $time, $GLOBALS['cookie_path'], $GLOBALS['cookie_domain']);
  11.         setcookie('ECS[username]', '', $time, $GLOBALS['cookie_path'], $GLOBALS['cookie_domain']);
  12.         setcookie('ECS[email]', '', $time, $GLOBALS['cookie_path'], $GLOBALS['cookie_domain']);
  13.     }
  14.     else
  15.     {
  16.         /* 设置cookie */
  17.         $time = time() + 3600 * 24 * 30;
  18.         setcookie("ECS[user_id]",  $user_id,   $time, $GLOBALS['cookie_path'], $GLOBALS['cookie_domain']);
  19.         setcookie("ECS[username]", $user_name, $time, $GLOBALS['cookie_path'], $GLOBALS['cookie_domain']);
  20.         setcookie("ECS[email]",    $email,     $time, $GLOBALS['cookie_path'], $GLOBALS['cookie_domain']);
  21.     }}
复制代码
还有要修改ecshop的 ucenter插件,includes/modules/integrates/ucenter.php
  1.     function ucenter($cfg)
  2.     {
  3.         parent::integrate(array());
  4.         $this->user_table = 'users';
  5.         $this->field_id = 'user_id';
  6.         $this->field_name = 'user_name';
  7.         $this->field_pass = 'password';
  8.         $this->field_email = 'email';
  9.         $this->field_gender = 'sex';
  10.         $this->field_bday = 'birthday';
  11.         $this->field_reg_date = 'reg_time';
  12.         $this->need_sync = false;
  13.         $this->is_ecshop = 1;
  14.         $this->cookie_path = $GLOBALS['cookie_path'];        //wuruhua
  15.         $this->cookie_domain = $GLOBALS['cookie_domain'];        //wuruhua
复制代码
  1. $user->login($username,$password);$ucdata = isset($user->ucdata) ? $user->ucdata : '';0
复制代码
最后,如果你发现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查询”提交以下语句,清除缓存!
  1. $user->login($username,$password);$ucdata = isset($user->ucdata) ? $user->ucdata : '';1
复制代码
这里的SQL将整合信息还原成默认的ecshop方式,然后清空整合数据。
注意:如果你的数据表前缀 不是 ecs_ 请自行修改

最新评论

卿休奇 发表于 2022-7-8 22:05
音乐网站排名

轻源码让程序更轻更快

QingYuanMa.com

工作时间 周一至周六 8:00-17:30

侵权处理

客服QQ点击咨询

关注抖音号

定期抽VIP

Copyright © 2016-2021 https://www.171739.xyz/ 滇ICP备13200218号

快速回复 返回顶部 返回列表