解决UCenter通信失败的问题

[ad#content]对于Uenter的初学者来说,经常会遇到的问题就是在添加新应用的时候,出现“通信失败”,查来查去也找不到具体的原因。其实导致“通信失败”的原因特别多,比如说Key值不匹配,或者配置接口地址有误。还有一些可能是服务端与客户端时间不匹配等等好多原因,这里将给大家介绍通信机制的原理,带领大家找出具体的问题所在!

对于已出现“通信失败”问题的用户,建议你还是先阅读《UCenter如何整合自建应用》重新配置一次,或者检查一下应用配置,如果问题依然存在,那么可以按照下面的步骤来查找问题。

首先我们应该清楚这个“通信失败”是从什么地方得来的,在应用管理页面,我们可以通过Firebug来做到这一步,如果您没有安装Firebug,可以参考这个URL:

  1. http://localhost/discuz/ucenter/admin.php?m=app&a=ping&inajax=1&url=http%3A%2F%2Flocalhost%2Fexamples&ip=&appid=3&random=19859&sid=6a6cr%2BqjOqTa8khveXdPH9SmPwU2T0ICgg2S%2FBwrBZApLl26vJCRkH2o8l7d%2FexAckUYz4bhLORnEw

也许有人对这个地址的含义不是很清楚,我大体解释一下:因为这是在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

  1. function onping() {
  2. $ip = getgpc('ip');
  3. $url = getgpc('url');
  4. $appid = intval(getgpc('appid'));
  5. $app = $_ENV['app']->get_app_by_appid($appid);
  6. $status = '';
  7. if($app['extra']['apppath'] && @include $app['extra']['apppath'].'./api/'.$app['apifilename']) {
  8. $uc_note = new uc_note();
  9. $status = $uc_note->test($note['getdata'], $note['postdata']);
  10. } else {
  11. $this->load('note');
  12. $url = $_ENV['note']->get_url_code('test', '', $appid);
  13. $status = $_ENV['app']->test_api($url, $ip);
  14. }
  15. if($status == '1') {
  16. echo 'document.getElementById(\'status_'.$appid.'\').innerHTML = "<img src=\'images/correct.gif\' border=\'0\' class=\'statimg\' \/><span class=\'green\'>'.$this->lang['app_connent_ok'].'</span>";testlink();';
  17. } else {
  18. echo 'document.getElementById(\'status_'.$appid.'\').innerHTML = "<img src=\'images/error.gif\' border=\'0\' class=\'statimg\' \/><span class=\'red\'>'.$this->lang['app_connent_false'].'</span>";testlink();';
  19. }
  20. }

这里有一个函数:如果$status为1能信才成功,其他的都是失败,在这里我们可以把变量$url和$status打印出来,$url地址就是客户端的接口地址。搞清楚这一点就好办了,我们可以直接在地址栏访问这个地址,如果他返回1,说明就通信成功了!我这里的测试地址是:

  1. http://localhost/examples/api/uc.php?code=a632n0LfAIbjl5qJHiMu7C4txDVOnCbZeBgQeQUJLub8Q1w7LAWP0Zb9tI%2FOTekdMuXHprfAHag

如果返回错误提示,我们可以按照提示来寻找错误,如果什么都没有返回,可能是文件里缺少一些变量,这里的例子(UCenter自带例子)里就有一个失误,在包含数据库类文件的时候忘记定义了$database这个变量,应该是$database=‘mysql’,这个很不起眼的失误给很多开发者造成了疑惑,所以大家在查看代码时也一定要小心,不要放过任何一点可疑之处。

  1. require_once DISCUZ_ROOT.'./include/db_'.$database.'.class.php';

范围缩小了,我们可以打开这个文件看看它都负责做什么,首先从URL里获取code,然后给它解密,获取真实的参数,这些参数分别是来判断超时和请求类型的,然后根据请求类型连接数据库,怎么样?经过这么一圈分析,是不是感觉很容易就能找到错误的原因!希望你已经成功配置了新建应用,如果还有什么问题请在这里留言。

解决UCenter通信失败的问题》上有 19 条评论

  1. 你好啊。这两天我帮朋友的公司做一个网站的升级他们的论坛是discuz的。但是需要做一个个人的用户空间。我就帮他们单独开发一个后来遇到问题了。不知道怎么整合!以前我在公司开发一个视频网站时做的是在logging里面加了一些自己定义的session暂时能解决登录和退出的问题,但是其他一些用户发帖积分和头像修改我没法同步了。很郁闷。现在又是遇到这个问题。我想请教高手我这个该怎么解决。具体流程是先从论坛首页登录–>用户点击个人管理中心进入自己的个人中心–>就遇到登录的问题了。登录和同步退出我不知道用ucenter怎么解决。还想问一下。是不是我的个人管理中心也要做一个登录呢?然后根据这个去ucenter里面配置呢?我的QQ是383220367!希望高手能早日给我回复。帮我解决这个问题。非常感谢!2010.7.16 北京

  2. 按照您说的操作,我的$status 变量也是为空, 你说是 ‘包含数据库类文件的时候忘记定义了$database这个变量’的问题,请问下 $database=‘mysql’ 这个应该放在那里 。谢谢

  3. 网上唯一一篇分析UC通信失败的详细原因的文章!
    但小生完全没有程序基础,很多地方都不明白。目前全新安装的论坛都无法通信,希望博主能够帮忙!
    我的QQ: 734200882
    感谢!!

  4. 博主你好,最近dz出现一点问题,小弟把dz卸载后重装一次,导致UC无法通信.急切想要解决,希望博主大哥能帮助一下!qq:515562121 谢谢!!

  5. 官方例子,整合后功能完整、正确运行,但显示通讯失败,通讯状态返回值不等于1,也未包含任何报错内容,实际上是返回了空值,但不等于1,就显示为通讯失败?编码问题?

  6. 博主你好,我用ucenter-integration插件整合wordpress3.2.1和dizcuz x2,通信失败。但也不能说完全失败,偶尔登陆论坛后,打开wp,是同步登陆的,但大多数时候不行。是否与上面某位朋友说的301跳转有关。我的网站xxxx.com是设置为301自动跳转到www.xxxx.com上的。我的QQ594422600,急盼博主帮忙解决。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>