blcygzs 发表于 2013-9-13 17:31:47

Hex 发表于 2013-9-13 13:51 static/image/common/back.gif
错误已经解决,请重新复制例子代码。

我用自己的方法结合了,谢谢您,也谢谢作者!

^淡如清风 发表于 2013-9-16 23:38:46

UCenter post 过来的通知,使用xml格式,使用CI控制器的话,input核心类 会把一些内容给过滤掉

^淡如清风 发表于 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掉

//UC_Server fsockopen POST data to UC_Client
      unset($_POST['<?xml_version']);

或是修改核心input类(不建议)
if ( ! preg_match("/^+$/i", $str))
修改为
if ($str != '<?xml_version' && ! preg_match("/^+$/i", $str))



问题二:完善UC XML格式数据的通知补充 error_reporting(0);
由于uc客户端 uc_client\lib\xml.class.php在解析XML数据时的一个流程
$this->document['键名']
没有做键名是否存在判断,如果php没有关闭错误提示,则由于键名不存在会出现php错误提示
导致UC 服务端获取到的数据,也会存在错误的提示字符,导致一些XML格式发送的通知失败

解决办法是:
1、CI的入口文件index.php
查找
define('ENVIRONMENT', 'development');
修改为
define('ENVIRONMENT', 'production');
也就是关闭错误提示(一般开发过程中必须设置为开发模式,即development)

2、或是在加载xml.class.php文件前,加上 error_reporting(0);,关闭该文件产生的错误提示。(建议修改方法)
该例子中可修改控制器api/uc.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);
}
修改为
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);

欢迎大家补充更好的实现方法

aslinger 发表于 2013-9-20 20:50:52

^淡如清风 发表于 2013-9-20 17:05 static/image/common/back.gif
总的来说由于UC的客户端 uc_client 和 CI 本身的一些小问题,会导致一些未知的错误,经过调式后,发现如下 ...

感谢你的分享,按照你的方法修改后,通知成功了。
但是还是不能同步,dz那边已经登录,CI这里还是提示未登录。不知道是什么原因了。

^淡如清风 发表于 2013-9-20 21:30:29

到dz的后台的ucenter设置那里,再提交一边,然后uc 服务端的 的dz应用提交一次,再试试。
另外可以在uc.php文件写,file_put_content();,方式,看看$get获得的action是否有同步登录的那个action请求来多多调试

aslinger 发表于 2013-9-20 22:07:05

^淡如清风 发表于 2013-9-20 21:30 static/image/common/back.gif
到dz的后台的ucenter设置那里,再提交一边,然后uc 服务端的 的dz应用提交一次,再试试。
另外可以在uc.p ...

非常感谢你的帮助。成功了。
奇怪的是,我只不过在synlogin那里加了个file_put_contents()之后就行了...然后再把这个file_put_contents()删除,现在正常...
非常感谢!

^淡如清风 发表于 2013-9-20 23:08:00

aslinger 发表于 2013-9-20 22:07 static/image/common/back.gif
非常感谢你的帮助。成功了。
奇怪的是,我只不过在synlogin那里加了个file_put_contents()之后就行了...然 ...

UC服务端,添加新的客户端应用后,貌似要关闭干净浏览器,然后重新打开浏览器登录才能实现P3P的那个啥技术,原理不清楚

a541127852 发表于 2013-9-21 20:27:43

收藏学习下,初学,最不擅长接口了,一定要拿下

byhe 发表于 2013-9-28 19:34:29

kinwyb 发表于 2013-9-7 08:49 static/image/common/back.gif
额,不错,我之前也搞过这个,不过方法和这个不太一样,我是把UC的文件都放在根目录,然后在libraries里写 ...

求教程!!{:soso_e192:}

zxw5052 发表于 2013-9-29 11:57:28

顶起
页: 1 [2] 3 4 5 6 7 8 9 10
查看完整版本: CI 整合 UCenter 全攻略