第一步:
1.使用新的uc_client文件,打开phpsso_server\api\ 目录修改原uc_client目录名称为uc_client_backup,然后将ucenter下面文件uc_client覆盖到该目录下。
第二步:
1.登录Discuz! X31后台,进入“UCenter”,点击“应用管理”后点击“添加新应用”进入应用添加界面,设置如下:
1、安装方式选择“自定义安装”
2、应用类型选择“其他”
3、应用名称填“phpsso”
4、应用的主 URL, 即phpsso_server的路径,视实际情况而定,注意最后不要带斜杠。如本教程填写为 http://127.0.0.1/phpsso_server
5、通信密钥,任意填写64字节以内的英文字母及数字,不过要记住,因为phpcms 的通信密钥必须与此设置保持一致,否则 phpsso 将无法与 UCenter 正常通信。如本教程设置通信密钥为:chinaz
6、应用IP、应用的物理路径、查看个人资料页面地址默认留空即可,而应用接口文件名称默认uc.php即可。
7、标签单条显示模板、标签模板标记说明两项默认留空即可。
8、是否开启同步登录:是。只有开启后,两款程序才能实现同步登录。
9、完成后提交,将生成新的应用ID。(记住这个应用ID,在”第三步“中将用到它。)
10、进入后台“站长”,“UCenter 设置”选项。"是否允许直接激活"一项,选择“是”。
下面去Phpcms v9中配置phpsso。
第三步:配置phpsso
登录Phpcms v9后台,进入“phpsso”,点击“系统设置”,进入“UCenter配置”设置界面,设置如下:
1、是否启用:是
2、Ucenter api 地址,即uc_server的路径,根据你的安装情况而定,注意最后不要带斜杠。如本教程填写为:http://localhost/bbs/uc_server
3、Ucenter 数据库信息:根据自己情况填写数据库的信息。其中数据库表前缀的格式为“`数据库名`.数据库前缀”,注意数据库名的不是单引号。
4、应用id(APP ID),即第二步创建的 phpsso 应用时自动生成的应用ID。
5、Ucenter 通信密钥,即第二步中设置的“通信密钥”,这两个值一定要确保一致,否则会导致无法通信。
第四步:查看通信状态
登录Discuz! X31后台,进入“UCenter”,点击“应用管理”查看第二步中创建的 phpsso 应用与 UCenter 通信是否成功。如果 通信失败,请检查“第二步”与“第三步”中的各项参数配置是否正确。
第五步:修改 Discuz! X31会员登录相关。
若不修改此处则在Phpcms v9登录后可以同步登录到Discuz! X31,但是在Discuz! X31登录却无法同步登录到Phpcms v9。修改步骤如下:
1、找到discuz目录下 template\default\member\login.htm,删除 (如一样可不做处理)
οnsubmit="{if $this->setting['pwdsafety']}pwmd5('password3_$loginhash');{/if}pwdclear = 1;ajaxpost('loginform_$loginhash', 'returnmessage_$loginhash', 'returnmessage_$loginhash', 'onerror');return false;"
2、找到discuz目录下 template\default\member\login_s imple.htm ,删除 (如一样可不做处理)
οnsubmit="{if $_G['setting']['pwdsafety']}pwmd5('ls_password');{/if}return lsSubmit();"
3、找到discuz目录下 /source/function/function_message.php ,查找 (如一样可不做处理)
$param['header'] = true;
替换为
$param['header'] = false;
第六步:
1. (注册提示错误:“验证码错误”) 修改如下:
文件位置:/phpcms/modules/member/index.php
2. (phpcmsv9登陆,“discuz不同步登陆错误”) 修改如下:
文件位置:/phpsso_server/api/uc_client/client.php
第七步:
找到discuz目录网站:
分析其主要原因是phpsso与ucenter通信成功后,XXX_ucenter_member表中的用户已经同步成功但是在 XXX_common_member中并没有此用户,所以只要在xxx_common_member中插入此用户就可以了,所以修改discuz/api /uc.php下找到function synlogin($get, $post)整段,修改为下面的内容:
function synlogin($get, $post) {
global $_G;
if(!API_SYNLOGIN) {
return API_RETURN_FORBIDDEN;
}
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
$cookietime = 31536000;
$uid = intval($get['uid']);
$query = DB::query("SELECT uid, username, password FROM ".DB::table('common_member')." WHERE uid='$uid'");
if ($member = DB::fetch($query))
{
dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
}else
{
$username = $get['username'];
$query = DB::query("SELECT uid, username, password, email FROM ".DB::table('ucenter_members')." WHERE username='$username'");
$member = DB::fetch($query);
$password = $member['password'];
$email = $member['email'];
$ip = $_SERVER['REMOTE_ADDR'];
$time = time();
$userdata = array(
'uid'=>$uid,
'username'=>$username,
'password'=>$password,
'email'=>$email,
'adminid'=>0,
'groupid'=>10,
'regdate'=>$time,
'credits'=>0,
'timeoffset'=>9999
);
DB::insert('common_member', $userdata);
$status_data = array(
'uid' => $uid,
'regip' => $ip,
'lastip' => $ip,
'lastvisit' => $time,
'lastactivity' => $time,
'lastpost' => 0,
'lastsendmail' => 0
);
DB::insert('common_member_status', $status_data);
DB::insert('common_member_profile', array('uid' => $uid));
DB::insert('common_member_field_forum', array('uid' => $uid));
DB::insert('common_member_field_home', array('uid' => $uid));
DB::insert('common_member_count', array('uid' => $uid));
DB::query('UPDATE '.DB::table('common_setting')." SET svalue='$username' WHERE skey='lastmember'");
$query = DB::query("SELECT uid, username, password FROM ".DB::table('common_member')." WHERE uid='$uid'");
if ($member = DB::fetch($query))
{
dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
}
}
}
至此完成。
上图为证:
注册也可以同步登陆。
不能配置成功的多检查下自身问题,呵呵
整合的前6步部分,按原帖走即可。出现问题请检查配置和缓存的更新,需要重点关注的几点地方是:
应用ID、密钥、以及UC的表名前缀(UC数据库表前缀的格式为“ `数据库名`.数据库前缀 ”,注意数据库名的不是单引号。是数字键1左边的`号)
对于第7步,对discuz/api/uc.ph 里function synlogin($get, $post)函数的修改,如下示例。
如果V9登陆而论坛没有同步登陆,请尝试下面的方法。
A. 如果UC的表前缀和DZ的表前缀不一致,可根据实际情况使用下面一行代码,替换下面函数里红色代码部分。( UC表名: 为你的UC的会员表名。要根据情况替换为你自己的UC会员表名)
$query = DB::query("SELECT uid, username, password, email FROM UC表名 WHERE username='$username'");
如我的UC表为 cdb_uc_members , 如图所示:
需要使用的代码如下:
$query = DB::query("SELECT uid, username, password, email FROM cdb_uc_members WHERE username='$username'");
function synlogin($get, $post) {
global $_G;
if(!API_SYNLOGIN) {
return API_RETURN_FORBIDDEN;
}
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
$cookietime = 31536000;
$uid = intval($get['uid']);
$query = DB::query("SELECT uid, username, password FROM ".DB::table('common_member')." WHERE uid='$uid'");
if ($member = DB::fetch($query))
{
dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
}else
{
$username = $get['username'];
$query = DB::query("SELECT uid, username, password, email FROM ".DB::table('ucenter_members')." WHERE username='$username'");
$member = DB::fetch($query);
$password = $member['password'];
$email = $member['email'];
$ip = $_SERVER['REMOTE_ADDR'];
$time = time();
$userdata = array(
'uid'=>$uid,
'username'=>$username,
'password'=>$password,
'email'=>$email,
'adminid'=>0,
'groupid'=>10,
'regdate'=>$time,
'credits'=>0,
'timeoffset'=>9999
);
DB::insert('common_member', $userdata);
$status_data = array(
'uid' => $uid,
'regip' => $ip,
'lastip' => $ip,
'lastvisit' => $time,
'lastactivity' => $time,
'lastpost' => 0,
'lastsendmail' => 0
);
DB::insert('common_member_status', $status_data);
DB::insert('common_member_profile', array('uid' => $uid));
DB::insert('common_member_field_forum', array('uid' => $uid));
DB::insert('common_member_field_home', array('uid' => $uid));
DB::insert('common_member_count', array('uid' => $uid));
DB::query('UPDATE '.DB::table('common_setting')." SET svalue='$username' WHERE skey='lastmember'");
$query = DB::query("SELECT uid, username, password FROM ".DB::table('common_member')." WHERE uid='$uid'");
if ($member = DB::fetch($query))
{
dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
}
}
}
1.使用新的uc_client文件,打开phpsso_server\api\ 目录修改原uc_client目录名称为uc_client_backup,然后将ucenter下面文件uc_client覆盖到该目录下。
第二步:
1.登录Discuz! X31后台,进入“UCenter”,点击“应用管理”后点击“添加新应用”进入应用添加界面,设置如下:
1、安装方式选择“自定义安装”
2、应用类型选择“其他”
3、应用名称填“phpsso”
4、应用的主 URL, 即phpsso_server的路径,视实际情况而定,注意最后不要带斜杠。如本教程填写为 http://127.0.0.1/phpsso_server
5、通信密钥,任意填写64字节以内的英文字母及数字,不过要记住,因为phpcms 的通信密钥必须与此设置保持一致,否则 phpsso 将无法与 UCenter 正常通信。如本教程设置通信密钥为:chinaz
6、应用IP、应用的物理路径、查看个人资料页面地址默认留空即可,而应用接口文件名称默认uc.php即可。
7、标签单条显示模板、标签模板标记说明两项默认留空即可。
8、是否开启同步登录:是。只有开启后,两款程序才能实现同步登录。
9、完成后提交,将生成新的应用ID。(记住这个应用ID,在”第三步“中将用到它。)
10、进入后台“站长”,“UCenter 设置”选项。"是否允许直接激活"一项,选择“是”。
下面去Phpcms v9中配置phpsso。
第三步:配置phpsso
登录Phpcms v9后台,进入“phpsso”,点击“系统设置”,进入“UCenter配置”设置界面,设置如下:
1、是否启用:是
2、Ucenter api 地址,即uc_server的路径,根据你的安装情况而定,注意最后不要带斜杠。如本教程填写为:http://localhost/bbs/uc_server
3、Ucenter 数据库信息:根据自己情况填写数据库的信息。其中数据库表前缀的格式为“`数据库名`.数据库前缀”,注意数据库名的不是单引号。
4、应用id(APP ID),即第二步创建的 phpsso 应用时自动生成的应用ID。
5、Ucenter 通信密钥,即第二步中设置的“通信密钥”,这两个值一定要确保一致,否则会导致无法通信。
第四步:查看通信状态
登录Discuz! X31后台,进入“UCenter”,点击“应用管理”查看第二步中创建的 phpsso 应用与 UCenter 通信是否成功。如果 通信失败,请检查“第二步”与“第三步”中的各项参数配置是否正确。
第五步:修改 Discuz! X31会员登录相关。
若不修改此处则在Phpcms v9登录后可以同步登录到Discuz! X31,但是在Discuz! X31登录却无法同步登录到Phpcms v9。修改步骤如下:
1、找到discuz目录下 template\default\member\login.htm,删除 (如一样可不做处理)
οnsubmit="{if $this->setting['pwdsafety']}pwmd5('password3_$loginhash');{/if}pwdclear = 1;ajaxpost('loginform_$loginhash', 'returnmessage_$loginhash', 'returnmessage_$loginhash', 'onerror');return false;"
2、找到discuz目录下 template\default\member\login_s imple.htm ,删除 (如一样可不做处理)
οnsubmit="{if $_G['setting']['pwdsafety']}pwmd5('ls_password');{/if}return lsSubmit();"
3、找到discuz目录下 /source/function/function_message.php ,查找 (如一样可不做处理)
$param['header'] = true;
替换为
$param['header'] = false;
第六步:
1. (注册提示错误:“验证码错误”) 修改如下:
文件位置:/phpcms/modules/member/index.php
2. (phpcmsv9登陆,“discuz不同步登陆错误”) 修改如下:
文件位置:/phpsso_server/api/uc_client/client.php
第七步:
找到discuz目录网站:
分析其主要原因是phpsso与ucenter通信成功后,XXX_ucenter_member表中的用户已经同步成功但是在 XXX_common_member中并没有此用户,所以只要在xxx_common_member中插入此用户就可以了,所以修改discuz/api /uc.php下找到function synlogin($get, $post)整段,修改为下面的内容:
function synlogin($get, $post) {
global $_G;
if(!API_SYNLOGIN) {
return API_RETURN_FORBIDDEN;
}
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
$cookietime = 31536000;
$uid = intval($get['uid']);
$query = DB::query("SELECT uid, username, password FROM ".DB::table('common_member')." WHERE uid='$uid'");
if ($member = DB::fetch($query))
{
dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
}else
{
$username = $get['username'];
$query = DB::query("SELECT uid, username, password, email FROM ".DB::table('ucenter_members')." WHERE username='$username'");
$member = DB::fetch($query);
$password = $member['password'];
$email = $member['email'];
$ip = $_SERVER['REMOTE_ADDR'];
$time = time();
$userdata = array(
'uid'=>$uid,
'username'=>$username,
'password'=>$password,
'email'=>$email,
'adminid'=>0,
'groupid'=>10,
'regdate'=>$time,
'credits'=>0,
'timeoffset'=>9999
);
DB::insert('common_member', $userdata);
$status_data = array(
'uid' => $uid,
'regip' => $ip,
'lastip' => $ip,
'lastvisit' => $time,
'lastactivity' => $time,
'lastpost' => 0,
'lastsendmail' => 0
);
DB::insert('common_member_status', $status_data);
DB::insert('common_member_profile', array('uid' => $uid));
DB::insert('common_member_field_forum', array('uid' => $uid));
DB::insert('common_member_field_home', array('uid' => $uid));
DB::insert('common_member_count', array('uid' => $uid));
DB::query('UPDATE '.DB::table('common_setting')." SET svalue='$username' WHERE skey='lastmember'");
$query = DB::query("SELECT uid, username, password FROM ".DB::table('common_member')." WHERE uid='$uid'");
if ($member = DB::fetch($query))
{
dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
}
}
}
至此完成。
上图为证:
注册也可以同步登陆。
不能配置成功的多检查下自身问题,呵呵
整合的前6步部分,按原帖走即可。出现问题请检查配置和缓存的更新,需要重点关注的几点地方是:
应用ID、密钥、以及UC的表名前缀(UC数据库表前缀的格式为“ `数据库名`.数据库前缀 ”,注意数据库名的不是单引号。是数字键1左边的`号)
对于第7步,对discuz/api/uc.ph 里function synlogin($get, $post)函数的修改,如下示例。
如果V9登陆而论坛没有同步登陆,请尝试下面的方法。
A. 如果UC的表前缀和DZ的表前缀不一致,可根据实际情况使用下面一行代码,替换下面函数里红色代码部分。( UC表名: 为你的UC的会员表名。要根据情况替换为你自己的UC会员表名)
$query = DB::query("SELECT uid, username, password, email FROM UC表名 WHERE username='$username'");
如我的UC表为 cdb_uc_members , 如图所示:
需要使用的代码如下:
$query = DB::query("SELECT uid, username, password, email FROM cdb_uc_members WHERE username='$username'");
function synlogin($get, $post) {
global $_G;
if(!API_SYNLOGIN) {
return API_RETURN_FORBIDDEN;
}
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
$cookietime = 31536000;
$uid = intval($get['uid']);
$query = DB::query("SELECT uid, username, password FROM ".DB::table('common_member')." WHERE uid='$uid'");
if ($member = DB::fetch($query))
{
dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
}else
{
$username = $get['username'];
$query = DB::query("SELECT uid, username, password, email FROM ".DB::table('ucenter_members')." WHERE username='$username'");
$member = DB::fetch($query);
$password = $member['password'];
$email = $member['email'];
$ip = $_SERVER['REMOTE_ADDR'];
$time = time();
$userdata = array(
'uid'=>$uid,
'username'=>$username,
'password'=>$password,
'email'=>$email,
'adminid'=>0,
'groupid'=>10,
'regdate'=>$time,
'credits'=>0,
'timeoffset'=>9999
);
DB::insert('common_member', $userdata);
$status_data = array(
'uid' => $uid,
'regip' => $ip,
'lastip' => $ip,
'lastvisit' => $time,
'lastactivity' => $time,
'lastpost' => 0,
'lastsendmail' => 0
);
DB::insert('common_member_status', $status_data);
DB::insert('common_member_profile', array('uid' => $uid));
DB::insert('common_member_field_forum', array('uid' => $uid));
DB::insert('common_member_field_home', array('uid' => $uid));
DB::insert('common_member_count', array('uid' => $uid));
DB::query('UPDATE '.DB::table('common_setting')." SET svalue='$username' WHERE skey='lastmember'");
$query = DB::query("SELECT uid, username, password FROM ".DB::table('common_member')." WHERE uid='$uid'");
if ($member = DB::fetch($query))
{
dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
}
}
}