http://blog.sina.com.cn/s/blog_775f158f010135uz.html

失败是常见的。

对于初次接触Ucenter的人来讲,添加一个自己的应用最头疼的就是发现通信失败。

如果要解决这个问题,首先要了解Ucenter是如何和应用进行通信的。

只有知道了Ucenter和应用之间如何通信,我们才能找到通信失败的原因。

那让我们从源头找起吧!

如果用火狐来辅助查找通信失败的源头会更加简单一些【我可不是给火狐做广告啊!它真的是太好用了】。

我们先来看看是谁输出了通信失败四个字:

在火狐中右键->本帧->查看帧源代码【注意,要在“通信失败”附近】。如图:

然后在源代码中查找应用访问地址。找到通信失败所在位置。

请注意,通信失败四个字是有js生成的。直接查找通信失败是找不到的。

认真研究一番之后,我们发现通信失败是由类似如下代码生成的:

<div id="status_3"></div><script id="link_3" testlink="admin.php?m=app&a=ping&inajax=1&url=http://www.seinc.com/slight&ip=&appid=3&random=30773"></script><script>apps[2] = '3';</script>

看起来是通过admin.php对应用地址进行访问,根据访问结果判断是否通信成功。

从字面上来看应该是app里边ping动作。好像还是ajax来访问的。

既然找到了通信失败的原因那我们就到admin.php的app中去找一下ping时候究竟它访问了什么,根据什么样的结果来判断通信成功还是失败。

我们看一下Ucenter的目录。很明显,操作程序代码都在control目录里边。进入control目录,哇!果然有个app.php。

先别急!没看到还有个admin目录么。既然刚刚是通过admin.php调用app的那么这个动作当然是写在admin目录里了。

其实control目录下的app.php是常规操作app。如果你打开代码查找ping方法是找不到的。

好,我们进入admin目录,打开app.php,查找ping。嗯!找到了!如下图:



这个方法叫做onping。我们分析一下发现关键在这个地方:

if($status == '1') { echo 'document.getElementByIdx_x(\'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.getElementByIdx_x(\'status_'.$appid.'\').innerHTML = "<img src=\'images/error.gif\' border=\'0\' class=\'statimg\' \/><span class=\'red\'>'.$this->lang['app_connent_false'].'</span>";testlink();'; }

如果status的值是1就是ok,反之则false。再简单看一下上边的代码。我们注意到onping方法访问的地址其实是应用地址+/api/+$app['apifilename']。

那么用脚指头也明白了,其实访问的真是地址是应用目录api目录下的uc.php。

如果不是很相信,我们就把$url给输出来瞧一下。将代码作如下改动:

if($status == '1') { echo 'document.getElementByIdx_x(\'status_'.$appid.'\').innerHTML = "<img src=\'images/correct.gif\' border=\'0\' class=\'statimg\' \/><span class=\'green\'>'.$url.'</span>";testlink();'; } else { echo 'document.getElementByIdx_x(\'status_'.$appid.'\').innerHTML = "<img src=\'images/error.gif\' border=\'0\' class=\'statimg\' \/><span class=\'red\'>'.$url.'</span>";testlink();'; }

注意我们把输出的ok或者false替换成了上边的url。在管理后台查看一下应用列表:

呵呵,地址出来了!我们把失败的地址和成功的地址分别复制到地址栏进行访问。

洁白的页面上如果只有个1,就表示成功。如果是其他的东西就表示失败了!

既然我们知道了访问的真实地址,那么就去看看这个地址是如何告诉Ucenter通信成功还是失败的。

打开应用目录api里的uc.php之后我们注意到它首先对get过来的code进行解码,得到动作指令后进行响应:

$code = $_GET['code']; parse_str(authcode($code, 'DECODE', UC_KEY), $get);//先做解密,就是url?code后边那一长串。 if(MAGIC_QUOTES_GPC) { $get = dstripslashes($get); } //print_r($get); //exit; if(time() - $get['time'] > 3600) { exit('Authracation has expiried'); } if(empty($get)) { exit('Invalid Request'); } $action = $get['action'];//解码后得到action 就是Ucenter传过来的指令。Ucenter到底默认会传递什么指令过来?回到Ucenter的app.php里认真研究了onping我们发现默认传递的是test指令。

那我们就查找uc.php里的test。最终发现当默认连接时候执行的代码快。

根据个人情况的不同,这里的代码每个人可能得到的不一样。认真研究一下就会发现问题出在哪里。

如果比较懒,看不懂,那就直接deleted…然后echo 1;欺骗一下Ucenter。看到通信成功的小对勾,心里舒服多了吧。

个文章只是告诉你为什么会失败。如何获得成功的字眼。到底通信成功和失败会有什么影响不在本文讨论范围之内。

最后,我们再来清洗一下Ucenter和应用之间如何交互:

  • ucenter通过应用里的api/uc.php获得应用通信情况,发送指令信息。比如用户更新,用户删除之类的操作。在uc.php中有对应的方法。也就是说如果你在ucenter里进行了用户操作。而应用中要同步的话就指望uc.php了。ucenter每次重要操作都会发送指令给uc.php。而且会主动监测通信情况。
  • 应用则通过uc_client访问用户数据。比如登陆,注册等。这个我在ucenter与wordpress整合中曾经提到过。

如果无论你添加一个什么样的应用,都能得到一个“通信成功”的小对勾。那这个文章总算没白写。

关于Ucenter的其他东西请关注其他文章。

谢谢!

快乐源于分享!

当Ucenter和应用通信失败的更多相关文章

  1. UCenter 与 DIscuz 通信失败的解决方法

    问题状况:Discuz 用户无法成功修改头像且帖子中上传的图片无法保存.进入 Discuz 后台检查,一切正常:进入 UCenter 检查后发现在"应用管理"中与 Discuz 论 ...

  2. 当Ucenter和应用通信失败,DZ数据库备份恢复

    http://blog.sina.com.cn/s/blog_775f158f010135uz.html ucenter整合自己的项目 http://jingyan.baidu.com/article ...

  3. ucenter通信失败和不能登录的解决

    对于ucenter真是让人不省心,修改一下url,就通信失败了. 1.通信失败 然后后来怎么也改不好了,后来一步一步打log,发现是uc_server和uc_client不一致. 检查uc_serve ...

  4. 关于TransactionScope出错:“与基础事务管理器的通信失败”的解决方法总结

    遇到此问题先需确认几个问题: 1)MS DTC是否设置正确? 2)是否启用了防火墙?是否对DTC做了例外? 3)是否做了hosts映射?是否跨网域通信? 开发分布式事务,碰到一个错误“与基础事务管理器 ...

  5. entityframework分布式事务中遇到的 “与基础事务管理器的通信失败”的解决方法

    首先是ef的多数据库操作实现事务的方法 public int AddDifferenceDB(userinfo1 user1, userinfo user) { ; using (var test2D ...

  6. 51单片机的TXD、 RXD 既接了 232 又接了 485芯片 ,会导致通信失败!

    51单片机的TXD. RXD 既接了 232 又接了 485 ,会导致通信失败! 下面是绘制电路板用的部分电路图: 通信现象: 1.我使用了USB-232的下载模块,把它接到P4上,发现单片机只能发送 ...

  7. Netty TCP 通信失败

    前段时间,在搞Netty TCP 通信,踩了一些坑,今天就在这篇总结一下 Netty通信失败原因 Netty TCP 通信失败的可能原因: 1.服务端或客户端,其中一端没有正常启动 2.是否在正确的位 ...

  8. 关于 K210 MaixPy 的 I2C 读取设备,搜索不到设备,通信失败的一些原因以及解决方案。

    近来对 amigo 开发期间的遇到 I2C 问题做一下总结. 我们发现有一些 I2C 设备搜索不到,主要原因是 DATA 的信号衰减,也可能是 I2C 的总线被拉住了. 软件层面的问题 例如在实现 A ...

  9. discuz ucenter通信失败

    一般出现时2个问题,一个是目录出问题,改成你现在的目录就行 二个就是通信密钥不对,应该和config文件下的config_ucenter.php文件里的UC_KEY一致

随机推荐

  1. ZooKeeper 数据模型

    本文主要讲述ZooKeeper的数据模型,包括ZooKeeper的数据视图,节点的层次结构以及节点类型等基本属性.Zookeeper的视图结构类似标准的Unix文件系统,但是没有引入文件系统相关概念: ...

  2. Jenkins hash

    最早,Bob Jenkins提出了多个基于字符串通用Hash算法(搜Jenkins Hash就知道了),而Thomas Wang在Jenkins的基础上,针对固定整数输入做了相应的Hash算法.其64 ...

  3. asp.net 分布式探讨之Session共享问题

    ---恢复内容开始--- Session共享是分布式架构设计中的一大难点,尽管session共享的解决方案不少,但是.net 下的解决方案还是比较少,而且说明文档也很少. 之前尝试用memcached ...

  4. OpenLayers3的轨迹回放

    OpenLayers3实现轨迹回放需要动画操作,官网上的例子用的是postcompose,但是还可以使用javascript中setInterval和setTime. 我的例子是按官网上来的http: ...

  5. 你必须知道的261个Java语言问题

    1. Java语言的运行机制: Java既不是编译型语言也不是解释型语言,它是编译型和解释型语言的结合体.首先采用通用的java编译器将Java源程序编译成为与平台无关的字节码文件(class文件), ...

  6. Day5_递归_二分法

    递归调用: 在调用一个函数的过程中,直接或间接的调用函数本身. def func(): print('from func') 间接调用: def foo(): print('form foo') ba ...

  7. JavaScript验证和数据处理的干货(经典)

    在开发web项目的时候,难免遇到各种对网页数据的处理,比如对用户在表单中输入的电话号码.邮箱.金额.身份证号.密码长度和复杂程度等等的验证,以及对后台返回数据的格式化比如金额,返回的值为null,还有 ...

  8. Python中urllib.urlencode中文字符的一个问题

    Django项目在访问Restful service时调用urllib.urlencode编码中文字符串时碰到下面这个错误. v = quote_plus(str(v)) UnicodeEncodeE ...

  9. 关于期权池Option Pools与Vesting:码农创业防身必备法器

    之前又看到饿了么创始人团队纠纷的几篇文章,参考了百科.wiki.36Kr.虎嗅.知乎以及邵亦波老师的文章,对之前一直感兴趣的期权汇编初略总结了下 ,仍觉粗糙,对一些具体操作还是不甚了了,不过感觉在中国 ...

  10. QQ connect client request's parameters are invalid, invalid openid 问题的解决

    很多人的这个问题是POST的时候发生,我的也恰好在POST的时候发生.后来我发现可能是因为QQ的这个后端是采用类PHP的语言开发,在动态语言的获取参数时POST参数和GET参数是可以分开读取的,也就是 ...