ucenter与其它应用结合时出现通信失败
ucenter是一个用户中心,多个应用可以使用ucenter,这样用户就有了通行证,不用一次一次地去注册不同的用户名了
现在的互联网的用户中心差不多就是腾讯的用户中心了,因为大家都有QQ号
但是自己做应用的时候如何加入ucenter这样的文章网上好多
自定义的应用,在加入应用列表后,ucenter会检测是否与应用通讯正常,有时会失败,
他的原理是去一个网址检测他的返回值,地址一般是这样的
testlink="admin.php?m=app&a=ping&inajax=1&url=http%3A%2F%2F192.168.0.89%3A5635&ip=&appid=3&random=14230"
回应这个链接的function 是/admin/app.php/中的onping这个函数
这个函数的作用是去访问你在配置应用时加入的参数,一般情况下这个地方的的网址是
http://192.168.0.89:5619/api/uc.php?code=28b4P9649Mub1wWGejarHl214enhA2Xt7vLkJPBskk50AwqDza8Ehx0T5%2FNwGtsBdB%2BmZ%2FTCibQ
这个code是一个加密的字符串,
到了api/uc.php中会对code进行解码,解码出来大体上就是这样的字符串
action=test&time=1321131313
包含两个参数,调用的函数与调用的时间,这样只返回值是1就可以了,就可以通讯成功了
$get = $post = array();
$code = strval(@$_GET['code']);
parse_str(uc_api_x_authcode($code, 'DECODE', UC_KEY), $get);
$timestamp = time();
if (empty($get))
{
die('Invalid Request');
} elseif ($timestamp - $get['time'] > 3600)
{
die('Authracation has expiried');
}
$action = $get['action'];
$post = xml_unserialize(file_get_contents('php://input'));
if (in_array($get['action'], array(
'test',
'renameuser',
'synlogin',
'synlogout',
'updatepw',
))
)
{
$funcname = "uc_api_{$get['action']}";
if (function_exists($funcname))
{
exit($funcname($get, $post));
}
}
exit(API_RETURN_FAILED);
/* communicate with ucenter */
function uc_api_test($get, $post) {
return API_RETURN_SUCCEED;
}
/**/
看一下服务端做了哪些操作,在每次打开应用列表时,遍历应用并向应用发onping测试,函数在
Ucenter中control/admin/app.php中的onping()函数
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);
//die($url);
//var_dump($_ENV['app']);die();
$status = $_ENV['app']->test_api($url, $ip);
}
如果调用返回结果为1那些显示成功,否则显示失败,test_api在model/app.php文件中
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);
}
去调用misc.php中的dfopen函数
dfopen函数使用php的底层函数fsockopen去与程序通信,将通信的结果返回onping函数,如果为1那么显示通信成功,否则显示失败
为了方便调试我们可以在dfopen中信息,将输入及输出的值记录到文件中,
error_log("[uc_server]\r\nurl: $url\r\npost: $post\r\n\r\n", 3, 'c:/log/php_fopen.txt');