出处:bbs.phpchina/thread-109395-1-1.html
整合一个【测试应用】

1、下载Discuz_7.0.0_SC_UTF8.zip    UCenter_1.5.0_SC_UTF8.zip wwwsenz/downloads/install

   其中的DZ是为了测试整合了自己的应用后,同步登陆之类的。。

2、安装(这个不用说详了吧)

安装官方安装后,会自动把ucenterdz打通的,如图

111.jpg (21.53 KB)
2009-3-20 19:14



3、添加自己的新的应用

点添加新应用,然后选自定义,然后如图(根据你自己的更改)输入
222.jpg (86.04 KB)
2009-3-20 19:18


4、创建自己的测试环境

UCenter_1.5.0_SC_UTF8(1)\advanced\examples拷贝到你的测试目录,并把advanced中的uc_client放到examples目录下~~

1)修改config.inc.php为自己本机的配置,如下是我的,可参考
复制PHP内容到剪贴板
PHP代码:

<?php
define('UC_CONNECT''mysql'discuz还有人用吗);    // 连接 UCenter 的方式: mysql/NULL, 默认为空时为 fscoketopen()
           // mysql 是直接连接的数据库为了效率建议采用 mysql
//数据库相关 (mysql 连接时并且没有设置 UC_DBLINK 需要配置以下变量)
define('UC_DBHOST''localhost');   // UCenter 数据库主机
define('UC_DBUSER''root');    // UCenter 数据库用户名
define('UC_DBPW''');     // UCenter 数据库密码
define('UC_DBNAME''ps_ucenter');    // UCenter 数据库名称
define('UC_DBCHARSET''utf8');    // UCenter 数据库字符集
define('UC_DBTABLEPRE''ps_ucenter.uc_');   // UCenter 数据库表前缀
//通信相关
define('UC_KEY''example2');    //  UCenter 的通信密钥要与 UCenter 保持一致
define('UC_API''localhost/project/passport/ucenter_1.5.0_sc_utf8(1)/upload');// UCenter  URL 地址在调用头像时依赖此常量
define('UC_CHARSET''utf8');    // UCenter 的字符集
define('UC_IP''');     // UCenter  IP,  UC_CONNECT 为非 mysql 方式时并且当前应用服务器解析域名有问题时请设置此值
define('UC_APPID'4);     // 当前应用的 ID
//ucexample_2.php 用到的应用程序数据库连接参数
$dbhost 'localhost';   // 数据库服务器
$dbuser 'root';   // 数据库用户名
$dbpw '';    // 数据库密码
$dbname 'ps_example';   // 数据库名
$pconnect 0;    // 数据库持久连接 0=关闭, 1=打开
$tablepre 'example_';     // 表名前缀同一数据库安装多个论坛请修改此处
$dbcharset 'utf8';   // MySQL 字符集可选 'gbk', 'big5', 'utf8', 'latin1', 留空为按照论坛字符集设定
//同步登录 Cookie 设置
$cookiedomain '';    // cookie 作用域
$cookiepath '/';   // cookie 作用路径
这个是我的,注意,其中的数据库配置,还有UC_KEY之类的,一定要和自定义的相同。。。

这时再去Ucenter的应用管理去看一下,如果出现如下,说明配置正确,然后再进行下面的步骤

555.jpg (7.95 KB)
2009-3-20 19:32


2)创建测试数据库ps_example,并建立如下表
复制PHP内容到剪贴板
PHP代码:
CREATE TABLE `example_members` (
   `uidint(11NOT NULL COMMENT 'UID',
   `usernamechar(15) default NULL COMMENT '用户名',
   `admintinyint(1) default NULL COMMENT '是否为管理员',
   PRIMARY KEY  (`uid`)
TYPE=MyISAM;
3)然后进入example目录中,打开ucexample_1.phpucexample_2.php进行测试吧~~~

如果顺利,应该可以看到如下(一下是运行ucexample_2.php的截图)

333.jpg (10.64 KB)
2009-3-20 19:30

------------------------------------------------------------------------------------
444.jpg (3.05 KB)
2009-3-20 19:30
(出现这个,基本可以说明打通成功了)
注册
还是继续那UC的提供的例子来分析一下

1、当你在你站点下的【某一个应用】下注册的时候,第一步首先是去ucenter下注册的
复制PHP内容到剪贴板
PHP代码:
$uid uc_user_register($_POST['username'], $_POST['password'], $_POST['email']);
  if($uid <= 0) {
   if($uid == -1) {
    echo '用户名不合法';
   } elseif($uid == -2) {
    echo '包含要允许注册的词语';
   } elseif($uid == -3) {
    echo '用户名已经存在';
   } elseif($uid == -4) {
    echo 'Email 格式有误';
   } elseif($uid == -5) {
    echo 'Email 不允许注册';
   } elseif($uid == -6) {
    echo ' Email 已经被注册';
   } else {
    echo '未定义';
   }
  } else {
   $username $_POST['username'];
  }
其中的这个uc_user_register又调用usercontrol类的onregister方法,如下
复制PHP内容到剪贴板
PHP代码:
function onregister() {
  $this->init_input();
  $username $this->input('username');
  $password $this->input('password');
  $email $this->input('email');
  $questionid $this->input('questionid');
  $answer $this->input('answer');
  if(($status $this->_check_username($username)) < 0) {
   return $status;
  }
  if(($status $this->_check_email($email)) < 0) {
   return $status;
  }
  $uid $_ENV['user']->add_user($username$password$email0$questionid$answer);
  return $uid;
}
其中又调用usermodeladd_user方法
复制PHP内容到剪贴板
PHP代码:
function add_user($username$password$email$uid 0$questionid ''$answer '') {
  $salt substr(uniqid(rand()), -6);
  $password md5(md5($password).$salt);
  $sqladd $uid "uid='".intval($uid)."'," '';
  $sqladd .= $questionid " secques='".$this->quescrypt($questionid$answer)."'," " secques='',";
  $this->db->query("INSERT INTO ".UC_DBTABLEPRE."members SET $sqladd username='$username', password='$password', email='$email', regip='".$this->base->onlineip."', regdate='".$this->base->time."', salt='$salt'");
  $uid $this->db->insert_id();
  $this->db->query("INSERT INTO ".UC_DBTABLEPRE."memberfields SET uid='$uid'");
  return $uid;
}
可见,执行这个操作后,UC_DBTABLEPRE."members 表中就会多条用户记录了

2、在自己的应用中注册
复制PHP内容到剪贴板
PHP代码:
if($username) {
  $db->query("INSERT INTO {$tablepre}members (uid,username,admin) VALUES ('$uid','$username','0')");
  //注册成功,设置 Cookie,加密直接用 uc_authcode 函数,用户使用自己的函数
  setcookie('Example_auth'uc_authcode($uid."\t".$username'ENCODE'));
  echo '注册成功<br><a href="'.$_SERVER['PHP_SELF'].'">继续</a>';
  exit;
}
这样之后,example_members表中也就有条用户记录了。。

至此实现了,【同步注册】了。。。

3、不过还没完。。。虽然我们在ucenter和当前应用中都注册了用户了。。。那么【其它应用】咋办呢??

呵呵,别急,还有【激活】没讲呢。。

当你在别的网站,用这个账号第一次登陆的时候,会请求
复制PHP内容到剪贴板
PHP代码:
list($uid$username$password$email) = uc_user_login($_POST['username'], $_POST['password']);
如果$uid > 0的话,会显示让你激活的链接,而通过这个激活链接点过去之后,就会绕过uc_user_register,而只在本应用的数据库插入一条用户记录。。。

什么,激活的细节还不是很明白。。。别急,下面会专门讲登陆的,到时结合起来就明白多了。。。
登陆
复制PHP内容到剪贴板
PHP代码:
//通过接口判断登录帐号的正确性,返回值为数组
list($uid$username$password$email) = uc_user_login($_POST['username'], $_POST['password']);
setcookie('Example_auth''', -86400);
if($uid 0) {
  if(!$db->result_first("SELECT count(*) FROM {$tablepre}members WHERE uid='$uid'")) 
{
   //判断用户是否存在于用户表,不存在则跳转到激活页面
   $auth rawurlencode(uc_authcode("$username\t".time(), 'ENCODE'));
   echo '您需要需要激活该帐号,才能进入本应用程序<br><a href="'.$_SERVER['PHP_SELF'].'?example=register&action=activation&auth='.$auth.'">继续</a>';
   exit;
  }
  //用户登陆成功,设置 Cookie,加密直接用 uc_authcode 函数,用户使用自己的函数
  setcookie('Example_auth'uc_authcode($uid."\t".$username'ENCODE'));
  //生成同步登录的代码
  $ucsynlogin uc_user_synlogin($uid);
  echo '登录成功'.$ucsynlogin.'<br><a href="'.$_SERVER['PHP_SELF'].'">继续</a>';
  exit;
} elseif($uid == -1) {
  echo '用户不存在,或者被删除';
} elseif($uid == -2) {
  echo '密码错';
} else {
  echo '未定义';
}
1、首先是到ucenter登陆,代码如下:
复制PHP内容到剪贴板
PHP代码:
function uc_user_login($username$password$isuid 0$checkques 0$questionid ''$answer '') {
$isuid intval($isuid);
$return call_user_func(UC_API_FUNC'user''login', array('username'=>$username'password'=>$password'isuid'=>$isuid'checkques'=>$checkques'questionid'=>$questionid'answer'=>$answer));
return UC_CONNECT == 'mysql' $return uc_unserialize($return);
}
它调用了usercontrol类的onlogin方法
复制PHP内容到剪贴板
PHP代码:
function onlogin() {
  $this->init_input();
  $isuid $this->input('isuid');
  $username $this->input('username');
  $password $this->input('password');
  $checkques $this->input('checkques');
  $questionid $this->input('questionid');
  $answer $this->input('answer');
  if($isuid) {
   $user $_ENV['user']->get_user_by_uid($username);
  } else {
   $user $_ENV['user']->get_user_by_username($username);
  }
  $passwordmd5 preg_match('/^\w{32}$/'$password) ? $password md5($password);
  if(empty($user)) {
   $status = -1;
  } elseif($user['password'] != md5($passwordmd5.$user['salt'])) {
   $status = -2;
  } elseif($checkques && $user['secques'] != '' && $user['secques'] != $_ENV['user']->quescrypt($questionid$answer)) {
   $status = -3;
  } else {
   $status $user['uid'];
  }
  $merge $status != -&& !$isuid && $_ENV['user']->check_mergeuser($username) ? 0;
  return array($status$user['username'], $password$user['email'], $merge);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。