ucenter base.php,UCenter之应用通信分析(一)

一、安装程序

1、安装 UCenter

这里没什么可以说的,就一路 Next 安装吧~~

2、安装 Discuz 7.2

这里也没什么可以说的,就一路 Next 安装吧~~

注意:这里要填写 UCenter 的 URL 地址,最后不要以 / 结尾。

附:这里可能是由于UCenter版本的问题,安装成功后会提示找不到 uc_pms

表,百度找到该表结构后直接执行SQL添加即可。

二、UCenter 应用的通信分析

1、登陆 UCenter 管理后台

查看【应用管理】,Discuz! 已经是通信成功

2、使用 Firebug 或者其它方法,查看【通信成功】标签下的 HTML 代码

得到一个 script 标签的代码,然后复制 src 属性的连接,如下:

admin.php?m=app&a=ping&inajax=1&url=http://os/comsenz/discuz&ip=&appid=1&random=3564&sid=0e5ey6uJA9qy1SG4wgjP2wJnUPLajMDeVZfikFG7hbAU+gKRhRO4RReiEC5/4WaxFYi/0zz4a2/pEw

复制代码

接上

UCenter 的 URL 组成完整的访问地址,通过浏览器直接访问该页面,页面内容如下:

document.getElementByIdx_x_x('status_4').innerHTML = "通信成功

";testlink();

复制代码

可知判断是否能够成功通信的关键在【admin.php】页面,并且通过

GET 方式传递数据。

3、打开 UCenter 目录下的admin.php

阅读代码,前面基本是定义一些常量,但在 32行处引入了几个文件,如下:

require

UC_ROOT.'model/base.php'; //

34行,后面会用到

require UC_ROOT.'model/admin.php';

复制代码

继续往下查看代码,发现:

$m = getgpc('m'); //

37行

$a = getgpc('a');

复制代码

(getpc

-- 用户自定义函数,获取 GET/POST/COOKIE的值)

到这里可以知道,$m

= 'app'和$a

= 'ping',也就是直接通过前面取得的

URL 传递过来的值。

继续往下看:

include UC_ROOT."control/admin/$m.php"; // 45行

$control = new control();

$method = 'on'.$a;

$control->$method(); // 48行

复制代码

嘿嘿,关键的地方了,这里加载了control/admin/app.php并且实例化,调用

onping() 方法。我们打开 app.php 文件继续深入查看。

4、查看 control/admin/app.php文件

通过前面的分析,我们已经知道他是调用 onping() 方法,直接定位到该方法(117行)。

在这里有一个 if-else 结构,调试后发现其执行 else 部分,代码如下:

$this->load('note'); //

127行

$url = $_ENV['note']->get_url_code('test', '',

$appid);

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

$ip); //

app实例在control的构造函数中已实例化

复制代码

继续往下分析代码,知道关键的判断通信成功的条件为$status

== ‘1’,而

$status 是前面的 test_api() 方法返回的,因此,真正的核心就在此了。

这里通过 load() 方法加载了 note 模块,但是在当前的 control

类中根据没有该方法。

通过分析,知道 load() 方法在父类 base 中。(顺着继承找,在 admin.php

中包含的两个文件中能找到)。

分析 load() 方法,可知是根据传递的参数实例化 model/ 目录下的模型,并且直接通过 $_ENV

全局变量调用。

因此,$this->load('note'); 其实就是实例化 note 模型,并将对象存储在 $_ENV

全局数组。

5、查看 model/note.php文件

直接定位到 get_url_code() 方法,如下:

functionget_url_code($operation, $getdata, $appid) { … } //

208行

复制代码

分析代码,可知通过

$appid 获取相应的配置,加密传递的数据,

并通过 URL 的 code 参数传递数据,我们把 return 的内容改为 echo

一下,结果如下:

http://os/comsenz/discuz/api/uc.php?code=78e2xIlqskz4Nw2WbPBJOcvSftWkLC9JzzYa9nX/yPFhVQiPL6kFbUDGwpTV6PZakjxzuSYcQhs

复制代码

将返回的

$url 传递给 $_ENV['app']->test_api() 方法。让我们看看 test_api

究竟干了些什么。。。。

6、查看model/app.php 文件

直接定位到 test_api() 方法,如下:

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

} // 79行

复制代码

分析代码,可知实例化

model/misc.php文件中的 misc 模型,并调用 dfopen() 方法,

按 $url 路径和远端程序建立 socket 连接进行通信的,而通过 $url

知道远端的接收页面为:

http://os/comsenz/discuz/api/uc.php

复制代码

因此,我们只需要在远端程序建立

api/uc.php 页面,并使其在页面输出一个1,即可判断应用通信成功。

注:暂时先分析到这里,传递过来的 code参数的数据下回再继续分析。

三、验证应用的通信方法

1、在 UCenter 同一级目录下新建:myapp/api/uc.php

2、uc.php 的代码为:

复制代码

3、在

UCenter 中添加新应用(名称、URL、最后两个都选“是”,其它为空)

4、呵呵,myapp新应用通信成功。

后话:

简单的通信分析到这里结束了,第一回写这样的文章,希望不会太差~~~

下回再继续分析传递过来的 code 参数的应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值