收藏本站 Archiver
    请 后使用快捷导航
    没有账号?入住 CI 中国社区
    楼主: Hex

    CI 整合 UCenter 全攻略

    [复制链接]
    11
    发表于 2013年9月13日 17:31:47 | 只看该作者
    Hex 发表于 2013年9月13日 13:51
    错误已经解决,请重新复制例子代码。

    我用自己的方法结合了,谢谢您,也谢谢作者!
    12
    发表于 2013年9月16日 23:38:46 | 只看该作者
    UCenter post 过来的通知,使用xml格式,使用CI控制器的话,input核心类 会把一些内容给过滤掉

    13
    发表于 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);

    欢迎大家补充更好的实现方法
    14
    发表于 2013年9月20日 20:50:52 | 只看该作者
    ^淡如清风 发表于 2013年9月20日 17:05
    总的来说由于UC的客户端 uc_client 和 CI 本身的一些小问题,会导致一些未知的错误,经过调式后,发现如下 ...

    感谢你的分享,按照你的方法修改后,通知成功了。
    但是还是不能同步,dz那边已经登录,CI这里还是提示未登录。不知道是什么原因了。
    15
    发表于 2013年9月20日 21:30:29 | 只看该作者
    到dz的后台的ucenter设置那里,再提交一边,然后 uc 服务端的 的dz应用提交一次,再试试。
    另外可以在uc.php文件写,file_put_content();,方式,看看$get获得的action是否有同步登录的那个action请求来多多调试
    16
    发表于 2013年9月20日 22:07:05 | 只看该作者
    ^淡如清风 发表于 2013年9月20日 21:30
    到dz的后台的ucenter设置那里,再提交一边,然后 uc 服务端的 的dz应用提交一次,再试试。
    另外可以在uc.p ...

    非常感谢你的帮助。成功了。
    奇怪的是,我只不过在synlogin那里加了个file_put_contents()之后就行了...然后再把这个file_put_contents()删除,现在正常...
    非常感谢!
    17
    发表于 2013年9月20日 23:08:00 | 只看该作者
    aslinger 发表于 2013年9月20日 22:07
    非常感谢你的帮助。成功了。
    奇怪的是,我只不过在synlogin那里加了个file_put_contents()之后就行了...然 ...

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

    求教程!!{:soso_e192:}
    20
    发表于 2013年9月29日 11:57:28 | 只看该作者
    顶起
    下一页 »
    1 23 4 5 6 7 8 9 10 下一页
    返回列表
    您需要登录后才可以回帖 登录 | 入住 CI 中国社区

    本版积分规则

    AltStyle によって変換されたページ (->オリジナル) /