phptext.net PHPText.Net
PHPText.Net > 文章 > 技术 > WEB开发

Discuz 用户整合 免激活 同步登录 解决方法

2015/11/21 01:03
4295人阅读
做DZ对接的都会遇到这个问题,无法同步登录,用户需要激活,今天来说说如何解决。

DZ同步登录这个话题已经很老了,收购都过去了那么久了。UCenter还停留在1.6的版本。但是作为一个论坛产品来说,DZ已经非常不错也很完美了,腾讯收购之后也做了写维护改进。不过相信大家在做对接时候都会遇到一个问题,UCenter已经打通,但是同步登录时候论坛不登陆,而需要登陆论坛去激活,再同步登录就可以了,这个问题其实就是因为DZ在同步注册时候没有插入用户数据问题。


你在你的网站进行注册,然后同步UC,之后你会发现UC有用户和DZ里面找不到。这个就是没有同步登录的原因,DZ没有用户数据。而大家都知道DZ在X系列以来,就抛弃了DZ自身的用户登录验证,而改用UCENTER,所以我们可以在DZ进行登录,但是需要激活一下。之后才能在DZ的数据库中找到这个用户。


既然知道原因了,那就很好解决了。其实做的方法我一直都是在用户在网站注册之后,同步UC,插入论坛数据。而这个做法其实不够好,没有用到UC,实际UC通讯我们都需要在UC的API文件中加入对应接口而进行同步,但是对于一个整合的网站来说,登陆注册基本上都是使用网站的功能,所以对于DZ的登录注册同步就完全可以不考虑,而从网站注册时候进行考虑。


下面一起来看做法。

测试版本:discuz! x3

打开discuz/api/uc.php synlogin方法(180行)处,往下找到

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 {

    if(!function_exists('uc_get_user')) {

        loaducenter();

    }

    $user = uc_get_user($uid, 1);

    if($user) {

        $time = time();

        DB::query("REPLACE INTO ".DB::table('common_member')." SET `uid`='{$user[0]}' , `username`='{$user[1]}' , `password`='".md5(random(10))."' , `email`='{$user[2]}' , `adminid`='0' , `groupid`='10' , `regdate`='{$time}' , `emailstatus`='0' , `credits`='0' , `timeoffset`='9999'");

        DB::query("REPLACE INTO ".DB::table('common_member_status')." SET `uid`='{$user[0]}' , `regip`='{$_G['clientip']}' , `lastip`='{$_G['clientip']}' , `lastvisit`='{$time}' , `lastactivity`='' , `lastpost`='0' , `lastsendmail`='0'");

        DB::query("REPLACE INTO ".DB::table('common_member_count')." SET `uid`='{$user[0]}' , `extcredits1`='0' , `extcredits2`='0' , `extcredits3`='0' , `extcredits4`='0' , `extcredits5`='0' , `extcredits6`='0' , `extcredits7`='0' , `extcredits8`='0'");

        DB::query("REPLACE INTO ".DB::table('common_member_profile')." SET `uid`='{$user[0]}'");

        DB::query("REPLACE INTO ".DB::table('common_member_field_forum')." SET `uid`='{$user[0]}'");

        DB::query("REPLACE INTO ".DB::table('common_member_field_home')." SET `uid`='{$user[0]}'");

        DB::query("UPDATE ".DB::table('common_stat')." SET `register`=`register`+1 WHERE `daytime` = '".date('Ymd', $time)."'");

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

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

        }

    }

}

其实从结构看也一目了然了,只是在同步登录时候去检查用户是否存在论坛里,不存在则插入一个,再登录。这样是不是就完全解决啦!

同类推荐

百度地图WEB API报错:APP Referer校验失败百度地图WEB API报错:APP Referer校验失败
微信支付 官方SDK报错 Fatal error: Uncaught exception ‘WxPayException‘ with message ‘curl出错,错误码:60‘微信支付 官方SDK报错 Fatal error: Uncaught exception ‘WxPayException‘ with message ‘curl出错,错误码:60‘
web app iphone4 iphone5 iphone6 响应式布局 适配代码web app iphone4 iphone5 iphone6 响应式布局 适配代码
关于ios/iphone/ipad 网页不能自动播放视频、音频的解决方案 mediaPlaybackRequiresUserAction  和 解决iphone/ipad视频播放单独弹出问题webkit-playsinline/allowsInlineMediaPlayback关于ios/iphone/ipad 网页不能自动播放视频、音频的解决方案 mediaPlaybackRequiresUserAction 和 解决iphone/ipad视频播放单独弹出问题webkit-playsinline/allowsInlineMediaPlayback
PHP 判断是蜘蛛(搜索引擎)来访PHP 判断是蜘蛛(搜索引擎)来访
PHP版 P2P借贷公式算法函数大全 平息/等额本金/等额本息/先息后本/混合型PHP版 P2P借贷公式算法函数大全 平息/等额本金/等额本息/先息后本/混合型
iPhone iPad HTML5网页不能自动播放AUDIO音频、VIDEO视频 原因iPhone iPad HTML5网页不能自动播放AUDIO音频、VIDEO视频 原因
jQuery获得页面元素(div、table等)页面中的相对位置(position)和绝对位置(offset)jQuery获得页面元素(div、table等)页面中的相对位置(position)和绝对位置(offset)
ECSHOP 订单状态、支付状态、配送状态 相关程序文件、变量、常量 整理说明ECSHOP 订单状态、支付状态、配送状态 相关程序文件、变量、常量 整理说明
Discuz 用户整合 免激活 同步登录 解决方法Discuz 用户整合 免激活 同步登录 解决方法