一、UC通信原理

我们用火狐可以看到,UCENTER跟应用通信的地址如下http://bbs.zhiyin.cn/ucenter/admin.php?m=app&a=ping&inajax=1&url=http%3A%2F%2Fapp.zhiyin.cn&ip=192.168.193.64&appid=33&random=1789609938&sid=d6c6MilHehc1GRqHPB14s6eyWNVp84nE3wbbjmf9MBnGQjsqRRnzY%2Fh2w9y1ZXMxvyeT7cSMsJRUaw

我们调试的时候用火狐可以在“应用管理”菜单中右侧右键点击,然后此框架在新标签页打开,这样在火狐firebug中可以清晰看到get过来的东西,其实也就是html中看到的testlink的地址,只不过加了个随机码而已。

其实请求的是uc服务端的/control/admin/app.php的onping方法(一般情况下会进入如下红色的那段的,而不是上面那个IF),代码如下

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);

//$this->writelog('ping_url', $url);//如果需要看实际的URL为什么,可以在这里写日志后然后去data/logs里面去看url,其实是url/api/uc.php?code=XXXX,code解密后就是action跟time数组,也是后面提到的东西。

$status = $_ENV['app']->test_api($url, $ip);

}

if($status == 1) {

echo 'document.getElementById(\'status_'.$appid.'\').innerHTML = "'.$this->lang['app_connent_ok'].'";testlink();';

} else {

echo 'document.getElementById(\'status_'.$appid.'\').innerHTML = "'.$this->lang['app_connent_false'].'";testlink();';

}

}

请求的是model/app.php的test_api方法

function test_api($url, $ip = '') {

$this->base->load('misc');

if(!$ip) {

$ip = $_ENV['misc']->get_host_by_url($url);

}

if($ip < 0) {

return FALSE;

}

return $_ENV['misc']->dfopen($url, 0, '', '', 1, $ip);

}

请求的是model/misc.php的dfopen方法,这个方法就不贴了,其实就是一个跟远程端通信,看返回的是不是字符串1,是1就通信成功,0就是通信失败,通信的url是什么呢,

其实地址是用get_url_code方法获取的(可以在前面的ONPING方法里面看到是通过$_ENV['note']->get_url_code('test', '', $appid);获取的),在model/note里面

function get_url_code($operation, $getdata, $appid) {

$app = $this->apps[$appid];

$authkey = $app['authkey'];

$url = $app['url'];

$apifilename = isset($app['apifilename']) && $app['apifilename'] ? $app['apifilename'] : 'uc.php';

$action = $this->operations[$operation][1];

$code = urlencode($this->base->authcode("$action&".($getdata ? "$getdata&" : '')."time=".$this->base->time, 'ENCODE', $authkey));

return $url."/api/$apifilename?code=$code";

}

可以看出来是与在应用中填写的地址的api目录的appfilename通信,不修改的话将是uc.php

其实如上只是叙述逻辑,真正的UC通信失败大多是因为数据库链接没写正确,服务器时间没有设置对,客户端没有权限链接服务端数据库,而都可以通过如下几个方式来排查错误。

所以

1、UCENTER是否支持内网通信(可以在model/misc.php中的dfopen方法中//$this->writelog('fp', $fp);中看结果,返回资源id则表示本身跟客户端通信成功,是客户端返回错误)

绝对支持的,我们平常的通信失败一般都是客户端这块写错了,因此我们可以在客户端的api目录里面写一个uc2.php,内容为<?php echo 1;?>,同时在uc应用中将接口文件名换成uc2.php,如果能通信成功则表示UC服务端跟客户端通信没问题,是你的uc.php写错了,问题排查要在这里排查。如果不能通信,则是UC服务端无法通过fsockopen访问客户端,可能是域名解析问题,也可能是你填写的IP问题,有IP的话服务端会优先用IP跟客户端通信的。

2、UCENTER中填不填IP以及IP的作用

其实填写IP后的通信速度要比填域名快,这个应用地址其实只是起个域名解析的作用的,最终依然会与客户端的这个应用的IP进行通信,也就是api里面的uc.php通信。如果你的应用没上线之前是可以填写个局域网的IP用于测试的,不过要保证UC的服务端能跟客户端的这个IPfsckopen,否则也是会失败的,检测方法见第一条。

3、UCENTER通信是否需要客户端的数据库填写正确以及UC的参数填写正确(其实UC应用管理里面生成的数据库链接参数并不一定在客户端有权限链接UC的数据库服务器,这也是导致UC通信失败的主要原因。具体排查方式如下。)

uc.php一般会通过数据库连接的方式跟uc的数据库表通信,UC在跟客户端通信的时候会发送一个code参数给客户端,

$code = @$_GET['code'];

parse_str(_authcode($code, 'DECODE', UC_KEY), $get);

if(MAGIC_QUOTES_GPC) {

$get = _stripslashes($get);

}

这个code包含了两部分的参数,一部分是time,一部分是action,都会放到$get数组里面,因此我们在调试uc.php的时候,需要自己写类似如下代码模拟从uc发过来的数据

$timestamp = time();

$get['time']=time();//新增行

$get['action']='test';//新增行

if($timestamp - $get['time'] > 3600) {

exit('Authracation has expiried');

}

这样浏览器直接访问http://app.zhiyin.cn/api/uc.php就可以准确反映ucenter跟uc.php的通信结果

4、终极杀招,服务器时间没有设置对导致通信失败,TMD搞了我一上午。

我一步步调试最终到了model/misc.php的dfopen方法中,我在最后一行@fclose($fp);中加入一行$this->writelog('return', $return);因为misc.php中没有writelog方法,这个方法直接从model/admin.php中提取即可,然后将客户端的uc.php中加入一行

$timestamp = time();

/*$get['time']=time();

$get['action']='test';

*/

exit($get['time'].'|'.$timestamp.$get['action']);

if($timestamp - $get['time'] > 3600) {

exit('Authracation has expiried');

}

其实是因为我看/bbs/ucenter/data/logs/中写的日志中有Authracation has expiried我才想到可能是UC的服务器跟客户端的服务器不是一台服务器,两台服务器环境不同,取到的时间不同导致超时造成“假冒”的通信失败,这个通信失败是人为的访问客户端http://app.zhiyin.cn/api/uc.php发现不了的,因为你肯定是给time以及action赋值了来看是否是客户端uc.php书写错误导致通信失败。但UC服务端实际发送过程中的时间跟客户端取到的时间不一致直接报超时。这个通信失败我告诉你,一般人是绝对发现不了这个问题的。

uc通讯不成功php版本过高,UC应用通信失败问题排查相关推荐

  1. uc通讯不成功php版本过高,Ucenter通信失败排查方法

    定位错误来源: 1. 使用firebug或类似于firebug的工具审查"通信失败"这几个字 2. 会发现包含这几个字的div的同级下方有个script标签,复制该script标签 ...

  2. UC整合团购,商城,论坛等莫名其妙“通信失败”的解决办法

    今天把UC和团购整合起来,安装说明一步一步配置,怎么弄都失败 后来偶尔发现把 uc生成的配置信息 存储为config.php的时候,要用记事本打开,然后另存为的格式要选择"ANSI" ...

  3. uc浏览器TV版最新版本功能简介

    uc浏览器TV版最新版本功能简介 UC浏览器TV版怎么样?提起UC很多人都知道,不就是那款在手机上很火的浏览器么?而要说到UC电视版,知道的人就不多了.本月初,UC发布了旗下首款PC版浏览器,网友们试 ...

  4. suse glibcxx版本过高问题

    实际开发中发现,suse11虽然glibc版本很低,只有2.11.3,但是glibcxx版本很高,达到了3.4.19.这里我需要降低glibcxx版本.所谓glibcxx版本,即libstdc++.s ...

  5. webpack对css文件打包:css-loader和style-loader版本过高问题

    webpack对css文件打包:css-loader和style-loader版本过高问题 问题描述 安装css-loader:npm install --save-dev css-loader和st ...

  6. ipad4、ipad3与微信等版本过高的软件不兼容解决办法

    ipad4.ipad3与微信等版本过高的软件不兼容解决办法 1.先对平板进行越狱 在爱思助手中点击一键越狱,即可在平板上出现h3lix和Cydia,说明越狱成功. 2.添加源:打开cydia, 点底部 ...

  7. 如何将高版本服务器系统转为低版本,iOS高版本备份恢复到低版本系统的方法

    一般来说,在更新iOS系统的时候我们都会建议大家先用iTunes对系统进行完整备份.但时不时都会有人偷懒,或者使用手机OTA升级而没有对系统备份,最终导致不满意新系统了,想降级却无备份可以恢复的尴尬局 ...

  8. SpringBoot集成Kafka低版本和高版本

    SpringBoot集成Kafka低版本和高版本 说明 地址 低版本SpringBoot集成Kafka代码 代码 kafka生产者配置 kafka消费者配置 发送消息给kafka的Controller ...

  9. 揭秘硅谷进化历程:机遇无穷 成功需付出更高代价

    揭秘硅谷进化历程:机遇无穷 成功需付出更高代价 [摘要]作为美国第一家市值高达1万亿美元的上市科技公司,苹果为硅谷的创新奠定了基础,并继续扩大其影响力. 腾讯科技讯 1月12日消息,据外媒报道,停车场 ...

最新文章

  1. 网络营销专员浅析网络营销过程中如何做好网站权重流量的优化
  2. 审批流_怎样让审批工作流和应用数据分离?
  3. mysql5.7免安版配置_mysql5.7免安装版配置
  4. 基于注解方式@AspectJ的AOP
  5. 经典排序算法总结与Python实现(上)
  6. farm 二维树桩数组数很大,数组存不下,怎么搞?区间更新
  7. linux中 ECShop的文件不能写
  8. 12 个开源后台管理系统
  9. HTML5超炫3D雷达扫描地图玩法
  10. JAVA查搜索文件内容
  11. 软件实施过程、软件实施工程师职责
  12. 没有安装拼多多却总是弹出拼多多的广告
  13. 基于树莓派语音合成小白避坑
  14. Slidev 一种快速制作PPT的奇淫技巧
  15. 怎么把多个excel表格合成一个_快速将多个Excel表格合并为1个,你会吗?
  16. 学好单片机好找工作吗?单片机学到什么程度可以找工作?
  17. LJ2200部分软件空白打印问题解决
  18. 后端程序员学习前端篇(一)
  19. Xilinx 官方论坛帖子、AR记录
  20. VMware虚拟机安装Ubuntu22.04并配置网络

热门文章

  1. Ubuntu没法联网怎么办[设置教程]
  2. Allegro基本元器件库路径
  3. ExtJS教程(7)---Ext.data.Store中事件的应用
  4. vue中常用的数组方法
  5. iOS AI智能对话项目(一边设备开外放声音,一边录音降噪)
  6. lte 在网络覆盖方面应该注意哪些问题_TD-LTE网络深度覆盖解决方法分析
  7. Ethercat学习-从站FOE固件更新(TwinCAT主站)
  8. CAN FD的一致性测试
  9. JS循环做简易ATM机
  10. DrugnomeAI: 靶标成药性预测模型