参考网站:
http://blog.163.com/zhaozunjie@126/blog/#m=0 ---这个163的博客,很多ucenter的文章~~~很多php的知识~~~~
http://www.thinkphp.cn/code/1843.html
http://blog.csdn.net/u011771214/article/details/41781643---------ucenter的安装。里面tp中除了uc的放置位置,都是直接用的;URL只要找到api的上面,里面的uc.php文件名不好更改
http://m.shanmao.me/index.php?s=/Index/acticle/tid/1755-----tp中操作都参考这个,discuz的方向操作不好参考,都直接复制的~~~
https://www.liudon.org/737.html
http://blog.sina.com.cn/s/blog_81827fc70100xaid.html----参考手册
http://blog.163.com/zhaozunjie@126/blog/static/1398240612010101855623646/----提到的几点都落实了,ucenter新添加应用的 配置注意问题;
http://blog.csdn.net/lwx2615/article/details/6817071----tp通信老失败,参考这文章才通信成功的,可以在本地新建一个小项目,
内容不多,调试成功了,可以逐步更改里面的配置,查看哪些和通信成功失败有关的,小项目不用是tp的;test项目小,没那么复杂,更改配置也比较容易;
ucenter手册:
http://m.shanmao.me/index.php?s=/Index/acticle/tid/1755
uc开发接口手册:
https://www.phpddt.com/manual/ucenter/html/user.htm## ------ ucenter自己网站的手册都不好下载看的,这里我见过最规范的uc文档~~~
参考博客和手册;
1.安装ucenter ,再安装discuz
在ucenter里添加应用~~~~安装配置就不写了,上面博客都有;
discuz安装时,注意配置ucenter的url接口。
discuz中应用,ucenter设置的时候,注意url,---我写成127.。。。的格式的,用域名好像不行~~~(这里测试了很久)
这样用域名访问discuz后台,上面栏目ucenter的点击,左边边框还出不来,
用ip方法discuz后台才可以;
也可以直接访问登录ucenter,左边就出来了,不过也左边不用也行,下面配置都用不到~~~
1.配置,确保通信成功~~~
1.discuz通信:
尤其注意:应用的主 URL:
链接到项目里的api前,会自动找uc.php
注意:通信密钥要和项目中config_ucenter.php中密钥一致!!!!
define('UC_KEY', 'a845N/eivvBpreT2sfhih7x5q19gvkj4VRNf5T4');//~~~要和项目中一样;
有时候项目更改了,该文件不会自动更改;----把原来添加的应用删除再添加,就出现这样的问题,UC_KEY不会自动更新;
2.配置tp项目:使得tp的通信成功
在ucenter中添加应用:url写到。。。。/uc (不要斜杆),会自定找api和下面的uc.php.
uc.php从ucenter文件中赋值过来,有$get['action'] $get['time'] 自己配置,如果没抓取到的时候,设置为test time(),
确保uc.php引用文件路径都找到---uc.php如果执行有错误的话,通信会失败;
client为ucenter复制过来的;
config.ini.php为ucenter添加应用时候,最下面生成的配置;----后续这里会添加tp项目的配置数据库,和cookie配置----这个里面数据库登录用户,密码等配置错误,----通信会失败(具体操作哪个数据库写错倒不会通信失败)
<?php define('UC_CONNECT', 'mysql'); define('UC_DBHOST', 'localhost'); define('UC_DBUSER', 'root'); define('UC_DBPW', '123456'); define('UC_DBNAME', '******'); define('UC_DBCHARSET', 'utf8'); define('UC_DBTABLEPRE', '`******`.uc_'); define('UC_DBCONNECT', '0'); define('UC_KEY', 'r1QbKaB099Z41b04Q968A715v9P092Pem5Tccah13bwfk021g2l2r740c152CdU5'); define('UC_API', 'http://127.0.0.1/b******/****'); define('UC_CHARSET', 'utf-8'); define('UC_IP', ''); define('UC_APPID', '8'); define('UC_PPP', '20'); /*discuz表格 前缀 photos登录discuz从ucenter用户表中抓取插入用户信息~~*/ define('DISCUZ_DANAME','*****'); define('DISCUZ_DBRRE','pre_'); //同步登录 Cookie 设置 $cookiedomain = 'local.****.****.net'; // cookie 作用域, 这里前面不能加http://,否则区域无效~~~,这个是uc.php接受链接来设置自己项目用的;这里填写所在羡慕的域名~~ $cookiepath = '/'; // cookie 作用路径 $dbhost = 'localhost'; // 数据库服务器 $dbuser = 'root'; // 数据库用户名 $dbpw = '****'; // 数据库密码 $dbname = '****'; // 数据库名 $pconnect = 0; // 数据库持久连接 0=关闭, 1=打开 $tablepre = 'tf_'; // 表名前缀, 同一数据库安装多个论坛请修改此处 $dbcharset = 'utf8'; // MySQL 字符集, 可选 'gbk', 'big5', 'utf8', 'latin1', 留空为按照论坛字符集设定
include 中有一个mysql的类文件,ucenter中赋值过来的;
url写到discuz,会自动去找api下的uc.php文件的;
config/config_ucenter.php文件中赋值,添加应用时,配置信息;
(client文件夹,可以从ucenter文件夹里复制过来``)
2.tp登录,确保discuz也登录~~同步登录,同步修改用户信息
tp这注册:确保ucenter也有数据查入,如果通信成功,配置好的话是这样的:
//ucenter注册操作;~~~需要事务吗 $uc_uid = uc_user_register($username, $password);//~~这里email不填写~~~后台屏蔽了验证; if($uc_uid <= 0) { if ($uc_uid == -1) { $json->setErr('0','已注册成功,用户同步到平台出错,用户名不合法'); $json->Send(); } elseif ($uc_uid == -2) { $json->setErr('0','已注册成功,用户同步到平台出错,包含要允许注册的词语'); $json->Send(); } elseif ($uc_uid == -3) { $json->setErr('0','已注册成功,用户同步到平台出错,用户名已经存在于平台上'); $json->Send(); } elseif ($uc_uid == -4) { $json->setErr('0','已注册成功,用户同步到平台出错,Email 格式有误'); $json->Send(); } elseif ($uc_uid == -5) { $json->setErr('0','已注册成功,用户同步到平台出错,Email 不允许注册'); $json->Send(); } elseif ($uc_uid == -6) { $json->setErr('0','已注册成功,用户同步到平台出错,Email 已经被注册'); $json->Send(); } else { $json->setErr('0','已注册成功,用户同步到平台出错,未定义'); $json->Send(); } }
默认注册只会玩uc数据库中插入数据,但这样,discuz中第一次登录要激活,discuz用户表中才会有数据,才可以登录;---我们把配置改了,确保注册,discuz表中的数据就上去~~
uc_client/module/user.php
参考博客:http://blog.csdn.net/iastro/article/details/52587643
function add_user($username, $password, $email, $uid = 0, $questionid = '', $answer = '', $regip = '') { $regip = empty($regip) ? $this->base->onlineip : $regip; $salt = substr(uniqid(rand()), -6); $password = md5(md5($password).$salt); $sqladd = $uid ? "uid='".intval($uid)."'," : ''; $sqladd .= $questionid > 0 ? " secques='".$this->quescrypt($questionid, $answer)."'," : " secques='',"; $this->db->query("INSERT INTO ".UC_DBTABLEPRE."members SET $sqladd username='$username', password='$password', email='$email', regip='$regip', regdate='".$this->base->time."', salt='$salt'"); $uid = $this->db->insert_id(); $this->db->query("INSERT INTO ".UC_DBTABLEPRE."memberfields SET uid='$uid'"); //added begin~~~discuz 数据表格拦截激活,先插入数据;~~~注意:这里如果ucenter已经加入了数据,discuz不会放入数据;(调试开发中会有这样漏洞) $discuz_dbname = DISCUZ_DANAME; $discuz_table_pre = DISCUZ_DBRRE; $table_info = $discuz_dbname.'.'.$discuz_table_pre; $this->db->query("INSERT INTO ".$table_info."common_member SET uid='$uid', username='$username', password='$password', email='$email', adminid='0', groupid='10', regdate='".$this->base->time."', credits='0', timeoffset='9999'"); $this->db->query("INSERT INTO ".$table_info."common_member_status SET uid='$uid', regip='$regip', lastip='$regip', lastvisit='".$this->base->time."', lastactivity='".$this->base->time."', lastpost='0', lastsendmail='0'"); $this->db->query("INSERT INTO ".$table_info."common_member_profile SET uid='$uid'"); $this->db->query("INSERT INTO ".$table_info."common_member_field_forum SET uid='$uid'"); $this->db->query("INSERT INTO ".$table_info."common_member_field_home SET uid='$uid'"); $this->db->query("INSERT INTO ".$table_info."common_member_count SET uid='$uid', extcredits1='0', extcredits2='0', extcredits3='0', extcredits4='0', extcredits5='0', extcredits6='0', extcredits7='0', extcredits8='0'"); //added end return $uid; }
注意user_add 的这个写法,ucenter里面如果已经有数据,就不管discuz中是否有数据,都不会再往里面放数据了~~调试的时候注意;
note:phpmyadmin,左侧边栏,展示数据表名是有限的,不一定会把所有的表格都展示出来,一开始,我看博客上有的表格是多余的,就没有添加~~~~点击dbname才会看到所有的表格,discuz的表格还是多的,都展开,浏览器不下拉都展示不了~~~~大概3 4页才都出来!!
这里用到2个常量,都是在config中定义的,discuz的表格名称和前缀~~~注意配置好了~~~
//2.ucenter实现登录~~~ //通过接口判断登录帐号的正确性,返回值为数组 list($uc_login_uid,$uc_login_username,$uc_login_password,$uc_login_email) = uc_user_login(trim($_POST['username']), trim($_POST['password'])); if ($uc_login_uid > 0){ //生成同步登录的代码 js代码。后面输出。 $ucsynlogin = uc_user_synlogin($uc_login_uid); $json->setAttr('ucsynlogin',$ucsynlogin); }elseif($uc_login_uid == '-1'){ $json->setErr('0','已登录成功,用户同步登录到平台用户不存在'); $json->Send(); }elseif($uc_login_uid == '-2'){ $json->setErr('0','已登录成功,用户同步登录到平台密码错误'); $json->Send(); }else{ $json->setErr('0','已登录成功,用户同步登录平台错误未知'); $json->Send(); }
$ucsynlogin----输出结果:
<script type="text/javascript" src="http://*******/discuz/api/uc.php?time=1503386589&code=c204c7bZe5hxoHmlwYe1yZKG8K7%2BbQ6VfvKT%2BPYYefGurOrZC9kQ1Oqqmibu%2BVcnnYcAK33phDTiTNYpxmegxjufcJqUiITmdm8nIMdPLJxpr8%2FEKABCg0PFmB9eW8f%2BKGL34e%2B8ptlG%2Bu%2BgJOOwupKl9b0%2BbNA1XJ0uxSfoyPhiZw" reload="1"></script>
<script type="text/javascript" src="http://local.photos.net/uc/api/uc.php?time=1503386589&code=66d11oXbvKbQptWZHTxzl8Y2lm64U1addkNVaiiMtUFMddxDfYq2Qax4NEenOBsRTxkstHkm86T5zTDyoMJwEEQw%2Fm6UsLTPvRgGpycynPowSA9ABBSnM5Ir7iaxJhUnW1K0styUM2gSLOimsPyy7ZqS000dvlx%2BpgxjY8b%2FqNpMjw" reload="1"></script>
确保里面链接,复制到浏览器可以正常实现~~~把这个script标签append到html页面,可以实现,远程刷新,设置cookie~~~
修改用户密码,确保同步
修改用户名,确保同步userrename没有封装好的方法可以直接用,我是自己构建方法,类似add_user,直接把uc discuz数据一起改了。
3.discuz登录,确保tp也登录~~~(discuz中的script代码没抓取出来,未实现,把discuz登录都拦截到tp项目中登录)
config_global.php配置cookiedomain cookiepath
apps.php 配置。
最后没实现,而是把discuz注册,登录,拦截到tp项目中去的,这样减少不少用户信息冲突~~~
(ucenter安装好discuz后,discuz 文件中的config配置,注意:同步discuz登录,需要修改discuz的cookie配置,该文件超级管理才有编辑权限~~~)
需要多用户登录~~~配置好apps.php ,这个是从ucenter文件中获取的,从ucenter/data/cache/apps.php,同步登录,这里必须最少数组内2个内容;
tp中是session登录的,discuz中script的src传递的是cookie全局设置的方法,需要把cookie的值判断再赋值给session,就可以了。注意:退出销毁2个;
2.discuz登录,tp如何可以和discuz也同步登录;
(见另外一个文章)