ucenter同步问题(整合iwebshop或者thinkphp)
2011-09-24 11:29
465 查看
对于这个同步问题,纠结了很久,今天终于可以停下来总结一下了!
首先看看官方的例子,以下是示例的文件夹结构:
要注意的是api文件夹的名称不能修改,改过之后就会有意想不到的效果(页面出不来)。对于同步,需要关注几个文件夹或者文件:首先是api(底下uc.php文件),uc_client(这个是客户端),uc_server(ucenter的服务端),数据库操作类db_mysql.class.php(这个文件有的程序是把它融合到其他地方了),config.inc.php(同步的配置文件),在ucenter添加应用,通信成功后,与ucenter的同步就建成了!也就是说例子就可以运行了。
没有怎么修改什么代码,就实现了同步!例子是能运行了,但是关键要能在自己的项目里运行,这才是关键,将这修代码融合到自己的代码里,才能算初步的成功!下面结合iwebshop同步,来说说说这个问题!
1. 首先得安装一个ucenter的服务端,这里装的是最新版的UCenter_1.6.0_SC_UTF8,也可以使用discuz中嵌入的ucenter。将uc_client文件夹,api文件夹,db_mysql.class.php,config.inc.php导入到项目中。这里需要注意的一点是:由于一般的框架都使用了url重写规则,所以在引用文件的时候要注意路径的规则,不能按照一般路径规则来引用了(这个地方也卡了好长时间:()。
2.通信。在ucenter中设置通信信息。配置config.inc.php文件
一般配好这个,通信就能够成功(注:uc_client文件一定要放在正确的目录下,否则通讯也不会成功!通讯是否成功比较关键的一部是检查uc.php中的引用路径问题)。
3.页面同步代码的嵌入。(哎,这一步也是比较痛苦的,查找了很多资料。也问了一些人,大多没有什么结果,就一个叫李智芸姑娘早些时候写了一篇关于ucenter同步的文章,在qq留言,还讨论了一下,其他的一些人都没什么回应。不过现在终于也自己弄得差不多了,感觉真是漫长!)
做好之前的同步准备工作之后,现在要做的就是整合。要导入3个文件,由于iwebshop的目录重写到index.php的目录,一下3个文件都与index.php同目录。
include 'config.inc.php';
include 'lib/db_mysql.class.php';
include 'uc_client/client.php';
如果页面存在乱码情况,可加入一行:header("Content-Type: text/html; charset=utf-8");
1)首先是注册同步
2)登录同步
-------------------------------------------------2012年2月24日----------------------------------------------------------------------------------
有关ucenter与thinkphp的同步整合:
基本步骤和上面的差不多,但 要注意以下几点:
1.uc_client与thinkphp有几个类命名有冲突,但在UCenter_1.6下,貌似已经改掉,基本上也不需要怎么改
2.自己网站的module命名最好不要和uc_client中的命名重复,(比如我做的那个网站和uc_client有个usermodule重复了,开始想把uc_client中的user改一下,结果注册同步时是可以的,但同步登陆时就遇到问题,想了半天也没有解决------这其中还牵涉到uc_center中的类的修改,修改完了之后还是不行。。。。。。)
3.登录、注册方法里增加了同步代码以后,succes、display方法使用之后,跳转会有问题,最后只好用redirect方法---之前的代码又得改了。后来发现succes方法又可以使用了(不知道开始为什么一直不能用。。。。。很郁闷,开始一用就报错:)(::):()
之前同步一直是单相同步,uchome和discuz上的双向同步没看明白,想了很久,暂时写了一个替代的方法(在thinkphp框架下写的),基于这样的思路:ucenter同步时会把通讯中的各个项目都生成一个xxx_auth,根据自己网站上的cookie判断,当先登录uchome时,是可以找到cookie---Example_auth的,但是自己网站还是登陆不上。如果有cookie,说明其他同步的账号已经登录了,这时网站可以不用判断直接登录了,这里还有一个情况,就是自己网站已经登陆后也会有cookie,这就再要判断一下了,之前登陆时是设置的session的,就根据session判断是否登录,有session说明已经登录就不用再登录,如果没有session,但是有cookie,就说明网站没有登录,直接设置session登录。
另外,删除同步和修改密码同步可以使用uc_user_delete()和uc_user_edit()方法,主要是在删除或者修改自己的数据时,要修改ucenter中的数据,这样才能做到同步。另外,要想uchome等的修改密码,与删除同步到自己的网站还要做一番修改,暂时草率的用了个简陋的方法:判断未登录状态下,在登录的时候1,本站有相关用户,ucenter没有,删除本站用户。2,本站没有用户,ucenter有,则激活用户,即本站新增用户。3,本站用户密码与ucenter用户密码不一致,则修改本站用户密码;在以登录状态下,判断,1,本站有用户,ucenter没有,删除本站用户,退出。2,本站用户密码与ucenter密码不一致,退出重新登录。有关参考信息也可看看这个网站。
http://x.discuz.net/forum.php?mod=viewthread&tid=2289453
http://x.discuz.net/forum.php?mod=viewthread&tid=2250001
http://x.discuz.net/forum.php?mod=viewthread&tid=2400397
http://www.discuz.net/thread-2477841-1-1.html
http://witmax.cn/uchome-index.html
首先看看官方的例子,以下是示例的文件夹结构:
要注意的是api文件夹的名称不能修改,改过之后就会有意想不到的效果(页面出不来)。对于同步,需要关注几个文件夹或者文件:首先是api(底下uc.php文件),uc_client(这个是客户端),uc_server(ucenter的服务端),数据库操作类db_mysql.class.php(这个文件有的程序是把它融合到其他地方了),config.inc.php(同步的配置文件),在ucenter添加应用,通信成功后,与ucenter的同步就建成了!也就是说例子就可以运行了。
没有怎么修改什么代码,就实现了同步!例子是能运行了,但是关键要能在自己的项目里运行,这才是关键,将这修代码融合到自己的代码里,才能算初步的成功!下面结合iwebshop同步,来说说说这个问题!
1. 首先得安装一个ucenter的服务端,这里装的是最新版的UCenter_1.6.0_SC_UTF8,也可以使用discuz中嵌入的ucenter。将uc_client文件夹,api文件夹,db_mysql.class.php,config.inc.php导入到项目中。这里需要注意的一点是:由于一般的框架都使用了url重写规则,所以在引用文件的时候要注意路径的规则,不能按照一般路径规则来引用了(这个地方也卡了好长时间:()。
2.通信。在ucenter中设置通信信息。配置config.inc.php文件
define('UC_CONNECT', 'mysql'); define('UC_DBHOST', 'localhost'); define('UC_DBUSER', 'root'); define('UC_DBPW', '123456789'); define('UC_DBNAME', 'ucenter'); define('UC_DBCHARSET', 'utf8'); define('UC_DBTABLEPRE', '`ucenter`.uc_'); define('UC_DBCONNECT', '0'); define('UC_KEY', '8ccb9C0qxTpP7MB+mprolLoc2bXEf6k+EaJcHYU');//这个是通信密钥,这个要和ucenter的一样 define('UC_API', 'http://localhost/ucenter'); define('UC_CHARSET', 'utf-8'); define('UC_IP', ''); define('UC_APPID', '1'); define('UC_PPP', '20'); 上面一部分配置信息,是从ucenter配置通信的时候生成的一段代码,直接拷过来就行。以上主要配置的是ucenter的相关信息。 有时配置成功了,但会报错:Unknown column 'app2' in 'where clause' 则有可能是配置文件中的UC_APPID与ucenter中的编辑应用的ID不一致,修改一下就好了
下面是配置的应用程序的信息,比如iwebshop //ucexample_2.php 用到的应用程序数据库连接参数 $dbhost = 'localhost'; // 数据库服务器 $dbuser = 'root'; // 数据库用户名 $dbpw = '12345678'; // 数据库密码 $dbname = 'ucenter'; // 数据库名 $pconnect = 0; // 数据库持久连接 0=关闭, 1=打开 $tablepre = 'example_'; // 表名前缀, 同一数据库安装多个论坛请修改此处 $dbcharset = 'utf8'; // MySQL 字符集, 可选 'gbk', 'big5', 'utf8', 'latin1', 留空为按照论坛字符集设定 //同步登录 Cookie 设置 $cookiedomain = ''; // cookie 作用域 $cookiepath = '/'; // cookie 作用路径
一般配好这个,通信就能够成功(注:uc_client文件一定要放在正确的目录下,否则通讯也不会成功!通讯是否成功比较关键的一部是检查uc.php中的引用路径问题)。
3.页面同步代码的嵌入。(哎,这一步也是比较痛苦的,查找了很多资料。也问了一些人,大多没有什么结果,就一个叫李智芸姑娘早些时候写了一篇关于ucenter同步的文章,在qq留言,还讨论了一下,其他的一些人都没什么回应。不过现在终于也自己弄得差不多了,感觉真是漫长!)
做好之前的同步准备工作之后,现在要做的就是整合。要导入3个文件,由于iwebshop的目录重写到index.php的目录,一下3个文件都与index.php同目录。
include 'config.inc.php';
include 'lib/db_mysql.class.php';
include 'uc_client/client.php';
如果页面存在乱码情况,可加入一行:header("Content-Type: text/html; charset=utf-8");
1)首先是注册同步
//用户注册 导入之类的略去。。。。。 建立数据库操作对象,之后要用到。
$db = new dbstuff; $db->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect); unset($dbhost, $dbuser, $dbpw, $dbname, $pconnect); //验证信息代码略去。。。。 验证成功后,向自己的数据库插入数据,表名(members)是可以更改的,以及字段的内容(uid,username,admin)都可以更改,values里面就是注册页面传过来的值。插入之后,就设置cookies,注册到这里就差不多了!这里去掉了验证激活的功能。
$db->query("INSERT INTO {$tablepre}members (uid,username,admin) VALUES ('$uid','$username','0')"); setcookie('pj_auth', uc_authcode($uid."\t".$username, 'ENCODE'));
2)登录同步
//用户登录 之前的验证都省去。。。 list($uid, $username, $password, $email) = uc_user_login($_POST['username'], $_POST['password']);//判断登录帐号的正确性,不过这一步可以被iwebshop的代码代替
判断成功后就是设置cookie了 setcookie('Spj_auth', '', -86400);(首先清空之前的cookie) setcookie('Spj_auth', uc_authcode($uid."\t".$username, 'ENCODE'));
//生成同步登录的代码 $tongbukey="40bd001563085fc35165329ea1ff5c5ecbdbbeef"; $ucsynlogin = uc_user_synlogin($uid);(//生成同步代码只有这一句,其他的代码是对同步生成的javascript进行加密,而且这段js代码需要打印出来,不然就无效) $crypttext = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($tongbukey), $ucsynlogin, MCRYPT_MODE_CBC, md5(md5($tongbukey)))); $encryptedtb =trim(Mailer::safe_b64encode($crypttext));
//跳转 由于iwebshop跳转时是不带参数的,硬加了带参数之后,就破坏了iwebshop原来的效果,结果跳转的时候不能及时返回参数,头部信息都为空,要刷新一下才能出来。如果不用层隐藏打印,页面也会乱掉//echo "<div style='display:none'>".$ucsynlogin."</div>";
几经折磨之后,只好将同步的js代码作为参数传递,再在前台页面获得打印
$this->redirect($callback."?tongbu=".$encryptedtb); 前台同步打印代码:获得js同步信息,解析并打印
{set:$tongbukey="40bd001563085fc35165329ea1ff5c5ecbdbbeef"} {set:$tongbu=$_GET['tongbu']} {set:$crypttexttb=Mailer::safe_b64decode($tongbu)} {set:$decryptedtb = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($tongbukey), base64_decode($crypttexttb), MCRYPT_MODE_CBC, md5(md5($tongbukey))), "\0")}
打印的时候要做一下判断,不然页面会乱掉
{if:($_GET['tongbu'])} <div style="display:none">{$decryptedtb}</div> {else:}{/if}
到此通部登录就差不多了。
3)同步退出
<p>//退出登录</p><p>清空cookie setcookie('Spj_auth', '', -86400); //生成同步退出的代码 $ucsynlogout = uc_user_synlogout();</p><p>其他的和同步登陆差不多! //echo $ucsynlogout; $tongbukey="40bd001563085fc35165329ea1ff5c5ecbdbbeef"; $crypttext = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($tongbukey), $ucsynlogout, MCRYPT_MODE_CBC, md5(md5($tongbukey)))); $encryptedtb =trim(Mailer::safe_b64encode($crypttext)); $this->redirect('login?tongbu='.$encryptedtb); //echo "<div style='display:none'>".$ucsynlogout."</div>"; } </p>到这里,只是完成了iwebshop与ucenter的同步,还需要iwebshop与discuz同步,者只需在ucenter里加入discuz的通信就行了,不过有一点不足的是,从iwebshop登录可以同步到discuz,但是从discuz登录却不能同步到iwebshop。或许以后的某个时间可以解决这个问题吧,暂时是没有时间了!
-------------------------------------------------2012年2月24日----------------------------------------------------------------------------------
有关ucenter与thinkphp的同步整合:
基本步骤和上面的差不多,但 要注意以下几点:
1.uc_client与thinkphp有几个类命名有冲突,但在UCenter_1.6下,貌似已经改掉,基本上也不需要怎么改
2.自己网站的module命名最好不要和uc_client中的命名重复,(比如我做的那个网站和uc_client有个usermodule重复了,开始想把uc_client中的user改一下,结果注册同步时是可以的,但同步登陆时就遇到问题,想了半天也没有解决------这其中还牵涉到uc_center中的类的修改,修改完了之后还是不行。。。。。。)
3.登录、注册方法里增加了同步代码以后,succes、display方法使用之后,跳转会有问题,最后只好用redirect方法---之前的代码又得改了。后来发现succes方法又可以使用了(不知道开始为什么一直不能用。。。。。很郁闷,开始一用就报错:)(::):()
之前同步一直是单相同步,uchome和discuz上的双向同步没看明白,想了很久,暂时写了一个替代的方法(在thinkphp框架下写的),基于这样的思路:ucenter同步时会把通讯中的各个项目都生成一个xxx_auth,根据自己网站上的cookie判断,当先登录uchome时,是可以找到cookie---Example_auth的,但是自己网站还是登陆不上。如果有cookie,说明其他同步的账号已经登录了,这时网站可以不用判断直接登录了,这里还有一个情况,就是自己网站已经登陆后也会有cookie,这就再要判断一下了,之前登陆时是设置的session的,就根据session判断是否登录,有session说明已经登录就不用再登录,如果没有session,但是有cookie,就说明网站没有登录,直接设置session登录。
if(isset($_COOKIE["Example_auth"])){ echo "cookie没过期!"; if($_SESSION['username']){ echo "有session!"; }else{ list($uid,$username)=explode("\t",uc_authcode($_COOKIE['Example_auth'], 'DECODE')); $preurl=$_SERVER["HTTP_REFERER"]; $User=D('tb_user'); $preurl=$_POST['preurl']; $condition['username'] = $username; $info=$User->where($condition)->select(); Session::set('username',$username); Session::set('email',$info[0]['email']); $this->assign('jumpurl',$preurl); $this->assign('username',$username); $this->assign('waitSecond',3); $this->success(); echo "没有session!"; } }else { echo "cookie过期!"; //cookie过期直接调用退出方法 }
另外,删除同步和修改密码同步可以使用uc_user_delete()和uc_user_edit()方法,主要是在删除或者修改自己的数据时,要修改ucenter中的数据,这样才能做到同步。另外,要想uchome等的修改密码,与删除同步到自己的网站还要做一番修改,暂时草率的用了个简陋的方法:判断未登录状态下,在登录的时候1,本站有相关用户,ucenter没有,删除本站用户。2,本站没有用户,ucenter有,则激活用户,即本站新增用户。3,本站用户密码与ucenter用户密码不一致,则修改本站用户密码;在以登录状态下,判断,1,本站有用户,ucenter没有,删除本站用户,退出。2,本站用户密码与ucenter密码不一致,退出重新登录。有关参考信息也可看看这个网站。
http://x.discuz.net/forum.php?mod=viewthread&tid=2289453
http://x.discuz.net/forum.php?mod=viewthread&tid=2250001
http://x.discuz.net/forum.php?mod=viewthread&tid=2400397
http://www.discuz.net/thread-2477841-1-1.html
http://witmax.cn/uchome-index.html
相关文章推荐
- ucenter同步问题(整合iwebshop或者thinkphp)
- ucenter同步问题(整合iwebshop或者thinkphp)
- ecshop 通过UCenter 与 Discuz! x2整合时 ECSHOP接口的同步登出问题
- Thinkphp整合ucenter同步登录注册退出
- Ucenter整合Thinkphp 双向同步登录退出
- ucenter 整合同步登录的内部实现原理及thinkphp整合ucenter
- Thinkphp整合ucenter同步登录注册退出
- asp.net与Discuz-UCenter整合(3):UCenter与应用同步
- ucenter thinkphp 整合
- discuz论坛整合ucenter免激活,同步登录,同步退出解决方案(附源码)
- ThinkPHP与UCenter整合详解
- cyask集成UCenter整合中文登录乱码问题
- Yii框架应用程序整合Ucenter实现同步注册、登录和退出等
- discuz x2.5论坛和其他系统整合反向数据同步问题
- Discuz X3整合ECShop同步登录登出问题解决方案
- Struts2整合Spring创建的Action同步问题
- ThinkPHP整合UCenter1.6(一)
- 关于应用UCenter同步修改密码问题?
- UCENTER 首次注册时,关联网站不会同步登陆问题
- 解决fckediter与ajax整合时编辑器中不能同步的问题