一、安装程序
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 参数的应用。