用户
 找回密码
 入住 CI 中国社区
搜索
楼主: Hex
收起左侧

CI 整合 UCenter 全攻略

  [复制链接]
发表于 2013-9-13 17:31:47 | 显示全部楼层
Hex 发表于 2013-9-13 13:51
错误已经解决,请重新复制例子代码。

我用自己的方法结合了,谢谢您,也谢谢作者!
发表于 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掉

PHP复制代码
//UC_Server fsockopen POST data to UC_Client
        unset($_POST['<?xml_version']);
复制代码


或是修改核心input类(不建议
PHP复制代码
if ( ! preg_match("/^[a-z0-9:_\/-]+$/i", $str))
复制代码

修改为
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复制代码
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);

欢迎大家补充更好的实现方法
发表于 2013-9-20 20:50:52 | 显示全部楼层
^淡如清风 发表于 2013-9-20 17:05
总的来说由于UC的客户端 uc_client 和 CI 本身的一些小问题,会导致一些未知的错误,经过调式后,发现如下 ...

感谢你的分享,按照你的方法修改后,通知成功了。
但是还是不能同步,dz那边已经登录,CI这里还是提示未登录。不知道是什么原因了。
发表于 2013-9-20 21:30:29 | 显示全部楼层
到dz的后台的ucenter设置那里,再提交一边,然后  uc 服务端的 的dz应用提交一次,再试试。
另外可以在uc.php文件写,file_put_content();,方式,看看$get获得的action是否有同步登录的那个action请求来多多调试
发表于 2013-9-20 22:07:05 | 显示全部楼层
^淡如清风 发表于 2013-9-20 21:30
到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
非常感谢你的帮助。成功了。
奇怪的是,我只不过在synlogin那里加了个file_put_contents()之后就行了...然 ...

UC服务端,添加新的客户端应用后,貌似要关闭干净浏览器,然后重新打开浏览器登录才能实现P3P的那个啥技术,原理不清楚
发表于 2013-9-21 20:27:43 | 显示全部楼层
收藏学习下,初学,最不擅长接口了,一定要拿下
发表于 2013-9-28 19:34:29 | 显示全部楼层
kinwyb 发表于 2013-9-7 08:49
额,不错,我之前也搞过这个,不过方法和这个不太一样,我是把UC的文件都放在根目录,然后在libraries里写 ...

求教程!!{:soso_e192:}
发表于 2013-9-29 11:57:28 | 显示全部楼层
顶起

本版积分规则