本教程针对非UCenter整合。disucz论坛仅支持6.0及一下版本。
很多同学一直被系统整合所困扰,下面我仔细的来讲一下整合的原理,并且做个整合Dz的实例。教程不怎么会写,看得懂就行了。
这里讲的是反相整合,就是以Discuz作为会员统一注册,登录,注销。所以mudder的注册,登录和注销动作都要在discuz页面完成。因此我们必须在dz的会员操作页面加入mudder的代码。
mudder提供了一套API整合的文件,其实就2个文件,存放在api目录下,如果你没有也可以到
http://www.mudder.com.cn/bbs/thread-128-1-1.html 去下载,这个文件夹下就2个文件,一个是mudder_passport_server.php,另一个是mudder_passport_client.php;先来解说一下这2个文件的用处。
mudder_passport_client.php:系统整合客户端
mudder_passport_server.php:系统整合服务器端
所谓客户端文件(mudder_passport_client.php),顾名思义就是要拷贝的整合系统(discuz)下的文件;起到什么作用呢,就是传递会员注册,登录,注销等动作到服务器端(mudder_passport_server.php),然后由这个服务器端做出对应的行为,并且再次传递到客户端文件,告诉他完成的情况,成功,失败等。
下面重点来说说客户端文件里的几个参数:
打开这个文件,最好用Editplus,EmEditor之类或者Zend studio 这个的工具,这样不容易因编码问题引起的乱码。
$mud_server_url :这个参数就是服务器端的地址,只有知道了服务器端的地址,才能和服务器端通信嘛
$login_forward:此函数就是当在dz登录成功以后,返回到那里去。这里要说明一下,在Dz登录后,首先会判断一下Dz是不是由登录返回页面,如果有,就不会返回 $login_forward 这参数里的地址。
$reg_forward:注册后,返回到那里去,同上
$logout_forward:注销(退出)后,返回到那里去
$mud_authkey:
这个是重点,注意看。这个是mudder的网站加密键,在mudder后台可以看到,会员帐户通过这个加密键来加密并保存到本地Cookie里,一定要和mudder保持一直,在后台->基本设置->通行证(反向整合)可以看到具体值,复制下来,粘贴到这个参数里
$mud_cookiepre:
这个也是重点。这个是mudder在本地cookie的前缀,就是一个Cookie的标识,通过这个值来却别其他系统的Cookie和读取Cookie的值,这里要和mudder统一,而不是和Discuz(整合系统)统一了,否者会造成无法正确读取Cookie的值。这个参数的值,可以在mudder系统根目录夏的config.inc.php这个文件里看到,就是$cookiepre这个变量的值,复制到过来粘贴。
$cpath:Cookie的存储范围,一般都是'/'。
$domain:Cookie针对保存的域名。不需要http://www之类的地址符和主机名,例如:mudder.com.cn,本地localhost则留空。
以上讲完了客户端文件内所有参数,并且正确得配置好了所有参数,这个时候,我们就把这个文件复制到discuz系统(整合系统)的根目录下,
整合的成败关键就在这个文件上了。
既然客户端文件做好了,那就要使用这个文件了,所以下一步我们要修改下discuz(整合系统)的注册,登录和注销的文件代码了。
先改discuz的注册页面代码,文件是 register.php。修改前先备份好。
打开这个文件,为了能使用mudder_passport_client.php这个文件,我们要把他载入进来,放在
复制内容到剪贴板
代码:
require_once './include/common.inc.php';
require_once DISCUZ_ROOT.'./forumdata/cache/cache_profilefields.php';这句代码后面,
代码如下:
复制内容到剪贴板
代码:
// mudder passport --- begin
require_once './mudder_passport_client.php';
// mudder passport --- end加入的代码里,我做了Begin...end这样的注解,没有任何含义,仅仅是让你看得懂这是自己加入的。好这样就载入了我们的客户端文件,下面我们要做注册处理了。按Discuz的注册流程,填写完注册信息后就提交注册信息来完成注册,我们的mudder注册整合部分代码就要加载那里。
我们通过查找功能,找到“$discuz_uid = $uid;”这句代码,大概在350-360行这里,这里Discuz已经在他的会员表里完成了新用户的添加,我们在“$discuz_uid = $uid;”这句代码的上一行加入mudder的注册代码:
复制内容到剪贴板
代码:
// mudder passport --- begin
$dreferer = dreferer();
$result_sync = SyncMudder($username,$email,'reg',3600*24*15);
if($result_sync == 'ok') {
$dreferer = $mud_reg_forward !="" && $dreferer=="" ? $mud_reg_forward : $dreferer;
}
// mudder passport --- end解说一下:
$dreferer = dreferer(); 这句是取得discuz注册后,返回到那个页面的地址的变量($dreferer)
$result_sync = SyncMudder($username,$email,'reg',3600*24*15); 这句则是mudder注册的关键,$username,$email,一看就知道是传递用户名和邮箱地址的,'reg'这个字符是告诉mudder服务器端,这次操作是注册行为的意思,3600*24*15这个是Cookie保存的时间,就是Cookie保存15天。
if($result_sync == 'ok') 在SyncMudder函数传递了注册参数后,服务器端会返回结果,如果返回OK的话,就说明mudder也注册成功了。
$dreferer = $mud_reg_forward !="" && $dreferer=="" ? $mud_reg_forward : $dreferer; 这句代码就是判断$dreferer这个参数时候是有返回地址了,有的话,就根据 $dreferer 返回,没有的话就返回 $mud_reg_forward 这个变量里的地址,这个变量我们前面已经定义过的,在这里就起到作用了。
解释完这里的代码,大家应该基本明白了整合的原理了吧。到这一步,保存一下。就完成了注册部分的整合了。
下面我们要整合登录部分的,文件是logging.php。编辑前先备份哦。
打开文件,同样我们要载入mudder_passport_client.php这个文件,在
复制内容到剪贴板
代码:
require_once './include/common.inc.php';
require_once DISCUZ_ROOT.'./include/misc.func.php';下面加入:
复制内容到剪贴板
代码:
//mudder passport --- begin
require_once DISCUZ_ROOT.'./mudder_passport_client.php';
//mudder passport --- end完成了引入后,我们就要在logging.php的登陆处加入mudder的整合代码了。我们找到”if($passport_status == 'shopex' && $passport_shopex)“这句代码,在上面加入我们的代码:
复制内容到剪贴板
代码:
//mudder passport --- begin
$dreferer = dreferer();
$result_sync = SyncMudder($username,"-","login",$cookietime);
if($result_sync == 'ok') {
$dreferer = $mud_login_forward !="" && $dreferer=="" ? $mud_login_forward : $dreferer;
}
//mudder passport --- end代码内基本和注册部分是一样的,不同的一出是SyncMudder($username,"-","login",$cookietime)里面的参数,"-"这里为什么要用这个字符呢,这里原本是email的参数,但是discuz登录不需要参数,所以无法取得email的值,所以就只能用"-"来代替,"login"字符就是告诉服务器端本次操作是登录的意思,$cookietime这个变量是用户在登录discuz时选择保存Cookie的时间,这里mudder和discuz的cookie时间保存一直了。这里说明一点。如果你的系统整合前,discuz已经有了一些会员,他在登录的时候,mudder整合文件的服务器端会自动在mudder系统里加入这个会员。
解释好了,我们的登录部分整合就好了。下面就要这个注销(退出)操作的整合了。discuz的注销操作也是写在logging.php这个文件里的,所以我们就继续修改吧。
找到”if($action == 'logout' && !empty($formhash))“这句代码,在比较前面大约在20行左右,在这个条件代码里,discuz会清除Cookie里的内容。
我们就要在这里下手,我们先要修改这个 if 条件,修改成
复制内容到剪贴板
代码:
if($action == 'logout')为什么要删除 !empty($formhash) 这个条件呢,因为mudder里无法得到$formhash这个变量的值,所以以如果不删除掉,就无法进入这个条件语句了,删除掉不会引起任何安全文件。修改好后,我们在
复制内容到剪贴板
代码:
if($_DCACHE['settings']['frameon'] && $_DCOOKIE['frameon'] == 'yes') {
$extrahead .= '<script>if(top != self) {parent.leftmenu.location.reload();}</script>';
}这句代码后面加入mudder的整合代码
复制内容到剪贴板
代码:
//mudder passport --- begin
$dreferer = dreferer();
$result_sync = SyncMudder("-","-","logout",0);
$dreferer = $logout_forward !="" && $dreferer=="" ? $logout_forward : $dreferer;
//mudder passport --- end代码很简单,就是告诉服务器端,清空下mudder的Cookie。最后还有一点,把下面这句代码
复制内容到剪贴板
代码:
if($formhash != FORMHASH) {
showmessage('logout_succeed', dreferer());
}删除了,因为$formhash不需要了,然后修改一下
复制内容到剪贴板
代码:
showmessage('logout_succeed', dreferer());这句代码,修改为
复制内容到剪贴板
代码:
showmessage('logout_succeed', $dreferer);保存一下,好了!所有代码修改就全部完成。
---------------------------------------------------------
鉴于很多同学在整合的退出部分出错,我把退出部分的代码全部贴出来。复制内容到剪贴板
代码:
// $action == 'logout' && !empty($formhash)) -----> mudder modify
if($action == 'logout') {
if($_DCACHE['settings']['frameon'] && $_DCOOKIE['frameon'] == 'yes') {
$extrahead .= '<script>if(top != self) {parent.leftmenu.location.reload();}</script>';
}
//mudder passport --- begin
$result_sync = SyncMudder("-","-","logout",0);
//mudder passport --- end
/*
if($formhash != FORMHASH) {
showmessage('logout_succeed', dreferer());
}
*/
clearcookies();
$groupid = 7;
$discuz_uid = 0;
$discuz_user = $discuz_pw = '';
$styleid = $_DCACHE['settings']['styleid'];
if($passport_status == 'shopex' && $passport_shopex && $_DSESSION['adminid'] != 1) {
$dreferer = dreferer();
$verify = md5('logout'.$dreferer.$passport_key);
showmessage('logout_succeed', 'api/relateshopex.php?action=logout&forward='.rawurlencode($dreferer).'&verify='.$verify);
} else {
showmessage('logout_succeed', dreferer());
}
} elseif($action == 'login') {---------------------------------------------------------
下面一个步骤很轻松,进入mudder后台,来到基本设置->通行证(反向整合),打开整合功能,写上对应参数,参数不会写?可以打开这个页面
http://www.mudder.com.cn/bbs/thread-128-1-1.html 找到discuz部分,已经写好了各个操作的地址,修改一下前面的discuz的地址就好了。提交保存。
这样整合就全部做好了。举一反三一下,其他的系统,不管是CMS还是BBS,只要找到他们的会员注册,登录和注销的文件,按照这个原理同样可以做到整合。如果你想整合CMS+Mudder+BBS,根据本人了解,知名的CMS的反向整合和mudder是一样的,所以要做到3套系统整合,例如你要在bbs里完成所有统一登录,只需要把cms和mudder的整合代码统一加入到bbs的注册,登录和注销的文件里。
好累,就写这些吧。以后再写其他教程。
-------------------------------------------------------
还有一点,关于从modoer点击登录,跳转到dz登录,登录后无法返回modoer的问题,主要的原因是dz的dreferer()的问题,这里整合部分没有任何问题。