//---------会一点补充一点,以后忘的时候可以翻文章
// 应用创建
// 应用分析
根据自带的例子,创建A,B项目,ucenter为用户中心.
1,先安装用ucenter,
复制upload目录,按提示进行安装.
ucenter 有2个部分 一个是Upload目录 ,是服务器的安装目录,一个是uc_client是客户端目录,
增加两个目录,在根目录创建项目project_a,project_b,把uc自带的例子里的文件放到A 和B 里各一份
然后把需要放到客户端的 目录 uc_client 也分别放在两个项目中
2,添加新应用A,
选择自定义安装,
应用的主url, 写自己的A项目的目录
应用类型 ,选择其他
是否开启同步登陆,选择是
确定提交
然后查看A应用提示通信失败,这是正常的,因为没取到正确配置, 右键编辑应用,
把
里面的配置信息复制.
3,打开A项目的 配置文件 , 用刚才复制的配置信息 替换掉默认的配置信息, 下面是一些数据库的配置 改好之后,返回查看是否通信成功
(通信失败原因很多,建议用firefox,的FireBug 查看返回值,为1的时候就表示通信成功,根据错误信息找原因,有时候为的1的时候提示也失败,你可以var_dump($status) 如果你看到的是string(4)"1" 就说明有Bom头信息, 网上很多Bom头的函数)
4,项目A通信成功 ,设置项目B ,步骤一样,
这样就完成用户集成了.
A注册 B能登录 B注册A能登录,
// 关于例子的功能实现
例子提供了很多功能 比如登录 ,注册,退出 ,
这是例子的主页,
加载了 3个重要文件,
通过$_GET['example'] 选择调取哪个PHP文件.
1,注册
<?php
if($_GET['action'] == 'activation') { // 如果有传参数 ,表示是登录过来需要激活的用户
echo '激活:';
list($activeuser) = explode("\t", uc_authcode($_GET['auth'], 'DECODE')); //解析
echo '<input type="hidden" name="activation" value="'.$activeuser.'">';
echo '<dl><dt>用户名</dt><dd>'.$activeuser.'</dd></dl>';
} else {
echo '注册:';
echo '<dl><dt>用户名</dt><dd><input name="username"></dd>';
echo '<dt>密码</dt><dd><input name="password"></dd>';
echo '<dt>Email</dt><dd><input name="email"></dd></dl>';
}
?>
否则正常流程 接收POST , 用函数 uc_get_user() 如果ucenter 用户表中有值,说明用户存在只需要在没登陆别的项目中激活
没有的话用函数 uc_user_register() 注册 , 返回uid,大于0,表示ucenter 用户注册成功,
同时在本项目中的用户表中 inset 用户,
设置cookie 注册成功
2, 登录
uc_user_login() 这是检查uc用户表中是否有数据, 如果有的话 ,在查询本项目中的用户表时候存在当前用户, 没有的话需要激活,返回给注册, 然后设置cookie
uc_user_synlogin() 生成同步登录代码//
这个函数在uc_client/client.php中,
<?php function uc_user_synlogin($uid) { $uid = intval($uid); if(@include UC_ROOT.'./data/cache/apps.php') { if(count($_CACHE['apps']) > 1) { //找$_CACHE['apps']下有几个应用大于1 就往下走 $return = uc_api_post('user', 'synlogin', array('uid'=>$uid)); } else { $return = ''; } } return $return; } ?>
其中用到了uc_api_post()函数
<?php function uc_api_post($module, $action, $arg = array()) { $s = $sep = ''; foreach($arg as $k => $v) { $k = urlencode($k); if(is_array($v)) { $s2 = $sep2 = ''; foreach($v as $k2 => $v2) { $k2 = urlencode($k2); $s2 .= "$sep2{$k}[$k2]=".urlencode(uc_stripslashes($v2)); $sep2 = '&'; } $s .= $sep.$s2; } else { $s .= "$sep$k=".urlencode(uc_stripslashes($v)); } $sep = '&'; } $postdata = uc_api_requestdata($module, $action, $s); return uc_fopen2(UC_API.'/index.php', 500000, $postdata, '', TRUE, UC_IP, 20); } ?>
发送到ucenter下control/user.php的onsynlogin()接口,返回一个js 直接输出,
例如
然后项目B ,在UC.PHP中根据参数的解析,调用到
function synlogin($get, $post) { $uid = $get['uid']; $username = $get['username']; 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"'); _setcookie('Example_auth2', _authcode($uid."\t".$username, 'ENCODE')); }
然后写上项目B的 设置cookie的信息 ,刷新项目B的页面就同步了
3. -- 待研究,
// 关于同步
用户登陆成功之后 会生成 uc_user_synlogin() ,同步登陆的代码,用firebug查看 登录成功会AJAX发送一个数据
数据是发给Uc.php
通过解析code参数,
返回一个 action动作, 并执行这个方法,
//mark 加载中..
// 应用创建