[ad#content]对于Uenter的初学者来说,经常会遇到的问题就是在添加新应用的时候,出现“通信失败”,查来查去也找不到具体的原因。其实导致“通信失败”的原因特别多,比如说Key值不匹配,或者配置接口地址有误。还有一些可能是服务端与客户端时间不匹配等等好多原因,这里将给大家介绍通信机制的原理,带领大家找出具体的问题所在!
对于已出现“通信失败”问题的用户,建议你还是先阅读《UCenter如何整合自建应用》重新配置一次,或者检查一下应用配置,如果问题依然存在,那么可以按照下面的步骤来查找问题。
首先我们应该清楚这个“通信失败”是从什么地方得来的,在应用管理页面,我们可以通过Firebug来做到这一步,如果您没有安装Firebug,可以参考这个URL:
- 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
- function onping() {
- $ip = getgpc('ip');
- $url = getgpc('url');
- $appid = intval(getgpc('appid'));
- $app = $_ENV['app']->get_app_by_appid($appid);
- $status = '';
- if($app['extra']['apppath'] && @include $app['extra']['apppath'].'./api/'.$app['apifilename']) {
- $uc_note = new uc_note();
- $status = $uc_note->test($note['getdata'], $note['postdata']);
- } else {
- $this->load('note');
- $url = $_ENV['note']->get_url_code('test', '', $appid);
- $status = $_ENV['app']->test_api($url, $ip);
- }
- if($status == '1') {
- 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();';
- } else {
- 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();';
- }
- }
这里有一个函数:如果$status为1能信才成功,其他的都是失败,在这里我们可以把变量$url和$status打印出来,$url地址就是客户端的接口地址。搞清楚这一点就好办了,我们可以直接在地址栏访问这个地址,如果他返回1,说明就通信成功了!我这里的测试地址是:
- http://localhost/examples/api/uc.php?code=a632n0LfAIbjl5qJHiMu7C4txDVOnCbZeBgQeQUJLub8Q1w7LAWP0Zb9tI%2FOTekdMuXHprfAHag
如果返回错误提示,我们可以按照提示来寻找错误,如果什么都没有返回,可能是文件里缺少一些变量,这里的例子(UCenter自带例子)里就有一个失误,在包含数据库类文件的时候忘记定义了$database这个变量,应该是$database=‘mysql’,这个很不起眼的失误给很多开发者造成了疑惑,所以大家在查看代码时也一定要小心,不要放过任何一点可疑之处。
- require_once DISCUZ_ROOT.'./include/db_'.$database.'.class.php';
范围缩小了,我们可以打开这个文件看看它都负责做什么,首先从URL里获取code,然后给它解密,获取真实的参数,这些参数分别是来判断超时和请求类型的,然后根据请求类型连接数据库,怎么样?经过这么一圈分析,是不是感觉很容易就能找到错误的原因!希望你已经成功配置了新建应用,如果还有什么问题请在这里留言。
我曾经遇过,已经装了一个整合包,又去装了个ucenter,导致discuz ss uchome始终不能整合
现在正常了吗 ?
博客内容 实在是 太强大了。
测试地址返回Authracation has expiried
$get['time']为空.
请问这是什么原因啊?望解惑,不胜感激!
你好啊。这两天我帮朋友的公司做一个网站的升级他们的论坛是discuz的。但是需要做一个个人的用户空间。我就帮他们单独开发一个后来遇到问题了。不知道怎么整合!以前我在公司开发一个视频网站时做的是在logging里面加了一些自己定义的session暂时能解决登录和退出的问题,但是其他一些用户发帖积分和头像修改我没法同步了。很郁闷。现在又是遇到这个问题。我想请教高手我这个该怎么解决。具体流程是先从论坛首页登录–>用户点击个人管理中心进入自己的个人中心–>就遇到登录的问题了。登录和同步退出我不知道用ucenter怎么解决。还想问一下。是不是我的个人管理中心也要做一个登录呢?然后根据这个去ucenter里面配置呢?我的QQ是383220367!希望高手能早日给我回复。帮我解决这个问题。非常感谢!2010.7.16 北京
已经联系QQ
我的通信还是失败,请您给指点一下。谢谢
你好,没有具体描述你的问题是什么,你可以给我发邮件,希望可以帮到你!
按照您说的操作,我的$status 变量也是为空, 你说是 ‘包含数据库类文件的时候忘记定义了$database这个变量’的问题,请问下 $database=‘mysql’ 这个应该放在那里 。谢谢
放在你应用文件夹下的的/api/uc.php 文件中,因为这个在这个文件中要用很多次,所以你最好放在这个页面的最上面就可以了
您好, 我直接访问 $url 地址 结果为1 可$status 还是为空呢
你是用Ucenter例子做的测试吗?
嗯,找到原因啦。是因为 服务器防火墙的问题, fsockopen 无法连结
呵呵~那就好
网上唯一一篇分析UC通信失败的详细原因的文章!
但小生完全没有程序基础,很多地方都不明白。目前全新安装的论坛都无法通信,希望博主能够帮忙!
我的QQ: 734200882
感谢!!
已经联系了!是服务器设置了301跳转的原因
博主你好,最近dz出现一点问题,小弟把dz卸载后重装一次,导致UC无法通信.急切想要解决,希望博主大哥能帮助一下!qq:515562121 谢谢!!
官方例子,整合后功能完整、正确运行,但显示通讯失败,通讯状态返回值不等于1,也未包含任何报错内容,实际上是返回了空值,但不等于1,就显示为通讯失败?编码问题?
博主你好,我用ucenter-integration插件整合wordpress3.2.1和dizcuz x2,通信失败。但也不能说完全失败,偶尔登陆论坛后,打开wp,是同步登陆的,但大多数时候不行。是否与上面某位朋友说的301跳转有关。我的网站xxxx.com是设置为301自动跳转到www.xxxx.com上的。我的QQ594422600,急盼博主帮忙解决。