|
UCenter post 过来的通知,使用xml格式,使用CI控制器的话,input核心类 会把一些内容给过滤掉
| |
|
本帖最后由 ^淡如清风 于 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类(不建议) PHP复制代码 复制代码 修改为 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复制代码 $this->document['键名'] 没有做键名是否存在判断,如果php没有关闭错误提示,则由于键名不存在会出现php错误提示 导致UC 服务端获取到的数据,也会存在错误的提示字符,导致一些XML格式发送的通知失败 解决办法是: 1、CI的入口文件index.php 查找 PHP复制代码 复制代码 修改为 PHP复制代码 复制代码 也就是关闭错误提示(一般开发过程中必须设置为开发模式,即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); 欢迎大家补充更好的实现方法 | |
|
到dz的后台的ucenter设置那里,再提交一边,然后 uc 服务端的 的dz应用提交一次,再试试。
另外可以在uc.php文件写,file_put_content();,方式,看看$get获得的action是否有同步登录的那个action请求来多多调试 | |
|
收藏学习下,初学,最不擅长接口了,一定要拿下
| |