|
发表于 2013-9-20 17:05:16
|
显示全部楼层
本帖最后由 ^淡如清风 于 2013-9-22 09:50 编辑
总的来说由于UC的客户端 uc_client 和 CI 本身的一些机制,会导致一些未知的错误,经过调式后,发现如下完善补充
问题一:完善UC XML格式数据的通知补充 POST XML
1、uc 客户端 的api/uc.php 控制器由于继承了ci的控制器,导致uc服务端发送XML通知时,会POST一个键名为 <?xml_version 的数据
2、另外,由于ci的input核心类只允许字母-数字(以及一些其它的)字符,所以当执行到核心input时,
会 exit('Disallowed Key Characters.'); 导致下面的程序不再执行
解决办法是:
由于该$_POST['<?xml_version'] POST在UC整合中不必用到(实际使用了 file_get_contents('php://input') 获取),所以可以放心unset掉,
加载 require_once BASEPATH.'core/CodeIgniter.php'; 之前,把这个键unset掉
PHP复制代码 //UC_Server fsockopen POST data to UC_Client
unset($_POST['<?xml_version']); 复制代码
或是修改核心input类(不建议)
修改为
if ($str != '<?xml_version' && ! preg_match("/^[a-z0-9:_\/-]+$/i", $str))
问题二:完善UC XML格式数据的通知补充 error_reporting(0);
由于uc客户端 uc_client\lib\xml.class.php在解析XML数据时的一个流程
没有做键名是否存在判断,如果php没有关闭错误提示,则由于键名不存在会出现php错误提示
导致UC 服务端获取到的数据,也会存在错误的提示字符,导致一些XML格式发送的通知失败
解决办法是:
1、CI的入口文件index.php
查找
PHP复制代码 define('ENVIRONMENT', 'development'); 复制代码
修改为
PHP复制代码 define('ENVIRONMENT', 'production'); 复制代码
也就是关闭错误提示(一般开发过程中必须设置为开发模式,即development)
2、或是在加载xml.class.php文件前,加上 error_reporting(0);,关闭该文件产生的错误提示。(建议修改方法)
该例子中可修改控制器api/uc.php
查找
PHP复制代码 public static function unserialize($xml, $htmlOn = 0)
{
if ( ! function_exists('xml_serialize'))
{
require APPPATH .'../uc_client/lib/xml.class.php';
}
return xml_unserialize ($xml, $htmlOn);
} 复制代码
修改为
PHP复制代码 public static function unserialize($xml, $htmlOn = 0)
{
error_reporting(0);
if ( ! function_exists('xml_serialize'))
{
require APPPATH .'../uc_client/lib/xml.class.php';
}
return xml_unserialize ($xml, $htmlOn);
} 复制代码
由于这里关闭了php错误提示,如果下面的执行还想开启错误提示,那么在需要的地方,再加上
error_reporting(E_ALL); 重新开启
3、或是修改uc_client\lib\xml.class.php,直接在顶部加上 error_reporting(0);
欢迎大家补充更好的实现方法
|
|