Archive

For the ucenter系列研究 category

discuz用户登录退出的时候不能通知其他应用的解决方法

No Comments

discuz用户登录退出的时候不能通知其他应用的解决方法

原因是在Ucenter中添加了应用discuz并不知道 在discuz后台清理一下缓存就可以了

ucenter通信失败源码分析

No Comments

原创  ucenter通信失败源码分析 收藏

以官方接口开发手册中的example为例 UCenter 1.5.0 Release 20081031

确定基本的配置无误

如:id,通信密钥必须与example中的config.inc.php相同,同时配置文件中数据库密码和编码等等也要核实一下

      应用的url,应用类型(其他),同步登陆(开启)需在ucenter的应用管理中修改

      ucexample_1.php中包含的文件路径要核实(将uc_client放在examples目录下)

     可以将ucexample_1.php 改成 index.php

源码分析:

通过firebug得到如下code   

admin.php?m=app&a=ping&inajax=1&url=http%3A%2F%2Flocalhost%2Fjbl&ip=&appid=2&random=7779&sid=e6cd2suSKdSVfcUxnAip9wp2nbeiDeZ6ptevMDmf%2FgRzMqnQx3xPHjb1leRHFPugRRWTn8m3kGrnMQ

解释一下: js执行上面的代码
这是在admin管理后台的功能,
代码是在/ucenter/control/admin/下
参数m=app表示是在/ucenter/control/admin/下的app.php
参数a=ping表示在在这个文件的的onping()函数
参数url就是请求的客户端的地址,参数ip指的是你在配置信息里的填写的ip,参数appid是这个应用的ID,sid指的是admin的ID
相关的代码所在文件:/ucenter/control/admin/app.php 这里面是个类 opping()是其中一个方法
代码中可知 $status为1时 通信成功 所以这边用语句输出部分变量看看结果
这里面的code不能直接echo 可以通过下面的方法
……
$this->load(‘note’);
   $url = $_ENV['note']->get_url_code(‘test’, ”, $appid);
   $status = $_ENV['app']->test_api($url, $ip);
   
   $fp = fopen(‘E:\phpfile\test.txt’, ‘w’);
   fwrite($fp, $url.’\t’.$status);
……
结果:SQL Error:Can not connect to MySQL server
数据库连接错误 在实例中连接数据库的文件是 examples/api/uc.php
……
require_once DISCUZ_ROOT.’./include/db_mysql.class.php’;
  $GLOBALS['db'] = new dbstuff;
  $GLOBALS['db']->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect, true, $dbcharset);
……
进入到db_mysql.class.php 调试后发现
$func = empty($pconnect) ? ‘mysql_connect’ : ‘mysql_pconnect’;
  if(!$this->link = @$func($dbhost, $dbuser, $dbpw)) {
   $halt && $this->halt(‘Can not connect to MySQL server’);
  }
执行错误
输出$dbhost, $dbuser, $dbpw 发现为空 问题就在这里
 examples/api/uc.php 中 require_once DISCUZ_ROOT.’./config.inc.php’
包含了examples中的配置文件
在config.inc.php中设置$dbhost, $dbuser, $dbpw, $dbname的值
测试 通信成功
注:也可以用预定义的常量将$dbhost, $dbuser, $dbpw, $dbname代替 不推荐这种方法,需要修改的地方会很多

UC接口开发手册里的例子1通信失败

No Comments

把api目录下面的uc.php

里面        require_once DISCUZ_ROOT.’./include/db_’.$database.’.class.php’; 59行的$database换成mysql

然后ajax就能正确返回1了

就显示通信成功了

ucenter整合系列研究

No Comments

ucenter压缩包解压里面的advanced-》uc_client目录是ucenter客户端的一系列核心函数库必须用

放在当前应用的根目录 这系列函数只是操作ucenter的数据库和循环通知各个应用的api/uc.php接口

他是类似这种方式循环通知ucenter下的各个应用

foreach($this->cache['apps'] as $appid => $app) {

if($app['synlogin'] && $app['appid'] != $this->app['appid']) {

$synstr .= ‘<script type=”text/javascript” src=”‘.$app['url'].’/api/uc.php?time=’.$this->time.’&code=’.urlencode($this->authcode(‘action=synlogin&username=’.$this->user['username'].’&uid=’.$this->user['uid'].’&password=’.$this->user['password'].”&time=”.$this->time, ‘ENCODE’, $app['authkey'])).’”></script>’;

}

当前应用的根目录下面建立一个api目录,里面放一个uc.php  这个uc.php相当于通信员 就是ucenter和各个应用通信的方式  他里面会定义不同的方法  通过ucenter传递过来的参数不同来调用它

比如同步登陆 同步删除 等等操作

ucenter 客户端的文件类似如下