最近闲来无事,打算用discuz 和phpcms 做站,里面涉及到 discuz ,phpcms,ucenter 相互通信的问题,本人做个小教程供大家参考,水平有限,请多包涵^_^。
本次测试使用的是Discuz X3.2,Phpcms v9.5.9和ucenter,因考虑到以后的扩展,所以单独把ucenter独立安装,如果没有其他考虑的话可以不用独立安装ucenter,可直接使用discuz内置的ucenter.
<——————- 此处高手可忽略 start———————–>
安装这3样以后在ucenter 的应用管理内添加phpcms应用
然后
应用类型选择“其他”
应用名称:phpsso //此处可以自定义
应用的主URL: http://你的域名/phpsso_server //注意又要多朋友粗心会忘记在域名后加phpsso_server导致通信失败
是否开启同步登陆和是否接受通知全部选“是” 然后提交
你会得到一个通信秘钥,
<——————- 此处高手可忽略 end———————–>
第一步会发先phpcms与ucenter通信失败。
解决方法:登陆phpcms的phpsso——>系统配置——–>UCenter配置
是否启用: 选择“是”
Ucenter api 地址:http://你的域名 //不要带反斜杠 “/”该地址为ucenter的根目录可以根据需求修改,如果你的UCenter 是直接内置discuz里面那么地址为 http://论坛地址/ucenter
其他的数据库主机名,用户名,密码 ,按自己的实际情况正常填写
注意:Ucenter 数据库表名前缀 不能直接写表名前缀,例如:我的数据库名为 zhudo ,ucenter的表面前缀为uc_ 那么Ucenter 数据库表名前缀 填写为 `zhudo`.uc_ , `zhudo` 的单引号为英文返单引号 在横排数字键盘1 的左边。
最后填写 应用id (APP ID) 和UCenter 通信秘钥 ,这两项可以在UCenter 应用管理里面获取。
第二步
你会发现 phpcms登陆 可以同步到 discuz
Phpcms退出 无法同步到discuz
Discuz登陆 无法同步到phpcms
Discuz退出 无法同步到phpcms
解决办法:
- Phpcms退出 无法同步到discuz 在phpcms的phpsso_server/phpcms/modules/phpsso/classes/phpsso.class.php 文件的__construct 函数里面, 由于解析出来post[data]为空情况下的直接的exit操作,导致javascript语句无法输出,简单的做法只要注释掉 exit
示例如下:
if(isset($_POST[‘data’])) {
parse_str(sys_auth($_POST[‘data’], ‘DECODE’, $this->applist[$this->appid][‘authkey’]), $this->data);
if(empty($this->data) || !is_array($this->data)) {
// exit(‘0’); //就是修改这里
}
} else {
exit(‘0’);
}
通过以上操作phpcms退出就可以同步到discuz了
第三步:
目前状态 phpcms登陆 可以同步到 discuz
Phpcms退出 可以同步到discuz
Discuz登陆 无法同步到phpcms
Discuz退出 无法同步到phpcms
解决方法:
修改 Discuz!
1、修改 template\default\member\login.htm 第 36 行,删除
onsubmit=”{if $this->setting[‘pwdsafety’]}pwmd5(‘password3_$loginhash’);{/if}pwdclear = 1;ajaxpost(‘loginform_$loginhash’, ‘returnmessage_$loginhash’, ‘returnmessage_$loginhash’, ‘onerror’);return false;”
2、修改 template\default\member\login_simple.htm 第 3 行,删除
onsubmit=”{if $_G[‘setting’][‘pwdsafety’]}pwmd5(‘ls_password’);{/if}return lsSubmit();”
注意:记得把最后面的那个 ” 也要去掉,本人之前就是因为没有去掉 ” 号而是直接删除到 ;就结束了,从而而导致第一第二步discuz的操作无效。
3、修改 /source/function/function_message.php 第 78 行,查找
$param[‘header’] = true;
替换为:
$param[‘header’] = false;
找到dz文件夹下的uc_client\data\cache\apps.php。找到该文件,看看是否只有一个数组,只有一个的话我们就把phpcms的数组给添加进去
<?php
$_CACHE[‘apps’] = array (
1 => //这是第一个数组,discuz的数组
‘appid’ => ‘1’,
‘type’ => ‘DISCUZX’,
‘name’ => ‘Discuz!’,
‘url’ => ‘http://b.com’, //这里填写你的论坛地址
‘ip’ => ”,
。。。。。。此处省略
‘allowips’ => ”,
),
2 => //这是第二个数组,phpcms的数组
array (
‘appid’ => ‘2’,
‘type’ => ‘OTHER’,
‘name’ => ‘PHPSSO’,
‘url’ => ‘http://你的域名/phpsso_server’, //这里是关键
‘ip’ => ”,
‘viewprourl’ => ”,
‘apifilename’ => ‘uc.php’,
‘charset’ => ”,
‘dbcharset’ => ”,
‘synlogin’ => ‘1’,
‘recvnote’ => ‘1’,
‘extra’ => false,
‘tagtemplates’ => ‘<?xml version=”1.0″ encoding=”ISO-8859-1″?>
<root>
<item id=”template”><![CDATA[]]></item>
</root>’,
‘allowips’ => ”,
),
);
?>
修改完后保存,如果还是无效的话,就把discuz里面的整个uc_client 复制到phpsso_server/api/ 下,覆盖原来的 uc_client 。
最后:有网友反映说在phpcms注册的会员,在第一次登陆discuz的时候要激活一次,这个问题可以在discuz的后台里面解决: discuz后台—-> 站长—–>UCenter设置,拉到最后面有一个 “是否允许其他应用的会员在站点激活” 和一个是否允许直接激活,两个全部选“是” 然后提交
修改完这些后测试,discuz同步登陆到phpcms,本地无效,但是在线上服务器上却有效 ,这一点无需担心,那可能使缓存所导致的原因,因为本人在测试的时候多次刷新无果,后来切换本地服务器环境的时候发现竟然登陆上来,此后每次 双向登陆退出口成功完成。
本文为了让新手更好的了解问题,所以写的比较啰嗦^_^,如发现不到之处,请多包涵
文章仅供学习交流,转载请注明源文链接,
时隔两年再来编辑这部片文章,觉得还是不要用这些N年不更新的系统了,想进步的话就自己手写,自己开发,哪怕写的再渣渣,那也是经过了思考也是一种积累。
谢谢楼主!终于解决了一个困恼已久的问题