·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> php网站开发 >> 项目整合Discuz UCenter

项目整合Discuz UCenter

作者:佚名      php网站开发编辑:admin      更新时间:2022-07-23
项目整合Discuz UCenter

市场就是力量,discuz是国内人气最高,使用最广泛的论坛系统,发展到今天它已经整合了论坛、门户、博客、CMS等版块,内容丰富,深受用户的喜爱,一直以来很多用户用它来整合自己的应用。由于discuz版块众多,系统相对封装,源代码缺少注释,api资料不够丰富,官方对discuz用户的咨询也并非卖力,而网上资料不是版本陈旧就是鱼龙混杂。对于想整合discuz论坛的朋友存在一定的难度。因此,如果你想美好整合discuz的话,不妨耐心看完以下提示。

一、准备工作

1、uc api说明书,通读全文。参考http://faq.comsenz.com/library/UCenter/introduction/introduction_list.htm(官方),了解同步登陆机制

2、uc 后台添加应用说明。参考http://faq.comsenz.com/viewnews-506(官方) http://wenku.baidu.com/view/3790fdd7195f312b3169a588.html(草根)

3、uc client客户端必要代码,这里下载

4、如果是x3后面的版本,请先更改bug,参见http://www.discuz.net/thread-3505581-1-1.html

解决方案如下: \source\class\discuz的discuz_application.php 查找

 

<?php
        PRivate function _xss_check() {static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {system_error('request_tainting');}if($_SERVER['REQUEST_METHOD'] == 'GET' ) {$temp = $_SERVER['REQUEST_URI'];} elseif(empty ($_GET['formhash'])) {$temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');} else {$temp = '';}if(!empty($temp)) {$temp = strtoupper(urldecode(urldecode($temp)));foreach ($check as $str) {if(strpos($temp, $str) !== false) {system_error('request_tainting');}}}return true;}

 

二、示例

我们学习一门技术时,看看它的技术说明就足够了,但discuz远非如此。discuz不是zend frame、dedecms、ci这些白开水的东西,没有一点钻研精神和爱折腾的气质是无法理解它深奥的内涵,更不用说驾驭它。要达到成功,我们需要有详尽的说明文字,另外还需要配备必要的图片,虽然有了这些你也未必能够成功。

先看一下我的项目结构

1

tanahk 是真正的项目地址,x3.2是我的discuz论坛,打开它

2

可以看到这个discuz x3.2已经整合了Ucenter,其中uc_server是uc服务器,uc_client是客户端,uc_client这个文件夹在discuz x、discuz home、discuz xspace等产品中都是已经捆绑好的。需要记住的一点,在整个共用站点系统中,我们只需要一个uc_client,因为uc_server只会在它定义的uc_client路径中寻找data文件中的apps数组。

因此在多站点同步登陆登出的关键文件只有两个,一个是config.ini.php,另一个是uc.php。前者告诉uc_server我们这个应用的配置,后者供uc_server调用。

把examples/api/uc.php文件复制到我们的tanahk/api/uc.php,examples/config.inc.php和examples/include也添加进来。目录结构变为

6

code文件夹我用来查看一些源码。

好了,现在可以在UCenter后台添加我们的项目应用了。uc的后台一般为http://www.xxx.com/x3.2/uc_server/admin.php

7

选择“应用管理”--“添加新应用”

参考上面准备工作中2。

应用类型:其它 应用名称:Tanahk,这里只能填写英文 通信密钥:随意一串不多于64位的字母数字。 应用的物理路径:可以为空,只要应用主url填写正确 应用接口文件名称:保留,uc.php,不用填api/uc.php 是否开启同步登陆:是,这是关键,以后多个项目共用一个uc就行了,不用自己新建一套用户系统。 提交。

提交后一般是通信错误的。

我们先修改tanahk/api/config.inc.php 。这里的数据非常重要,如果安装了discuz x或其它discuz产品,最好对照discuz root/config下面的配置文件修改。

<?phpdefine('UC_CONNECT', null);                // 连接 UCenter 的方式: MySQL/NULL, 默认为空时为 fscoketopen()                            // mysql 是直接连接的数据库, 经实践,还是填写null好。mysql有时无法执行//数据库相关 (mysql 连接时, 并且没有设置 UC_DBLINK 时, 需要配置以下变量)define('UC_DBHOST', 'localhost');            // UCenter 数据库主机define('UC_DBUSER', 'root');                // UCenter 数据库用户名define('UC_DBPW', '111111');                    // UCenter 数据库密码define('UC_DBNAME', 'ultrax');                // UCenter 数据库名称define('UC_DBCHARSET', 'utf8');                // UCenter 数据库字符集define('UC_DBTABLEPRE', '`ultrax`.pre_ucenter_');            // UCenter 数据库表前缀define('UC_DBCONNECT', 0);                    // 是否持久化链接//通信相关define('UC_KEY', '…');                // 与 UCenter 的通信密钥, 要与注册应用时填写的保持一致define('UC_API', 'http://www.xxx.com/x3.2/uc_server');    // UCenter 的 URL 地址, 在调用头像时依赖此常量define('UC_CHARSET', 'utf-8');                // UCenter 的字符集define('UC_ip', '');                    // UCenter 的 IP, 当 UC_CONNECT 为非 mysql 方式时, 并且当前应用服务器解析域名有问题时, 请设置此值define('UC_APPID', 2);                    // 当前应用的 IDdefine('UC_PPP', 20);//ucexample_2.php 用到的应用程序数据库连接参数$dbhost = 'localhost';            // 数据库服务器$dbuser = 'root';            // 数据库用户名$dbpw = '111111';                // 数据库密码$dbname = 'ultrax';            // 数据库名$pconnect = 0;                // 数据库持久连接 0=关闭, 1=打开$tablepre = '`ultrax`.pre_ucenter_';           // 表名前缀, 同一数据库安装多个论坛请修改此处$dbcharset = 'utf8';        // MySQL 字符集, 可选 'gbk', 'big5', 'utf8', 'latin1', 留空为按照论坛字符集设定//同步登录 Cookie 设置$cookiepre = 'jt_';           // cookie 前缀$cookiedomain = '';         // cookie 作用域$cookiepath = '/';        // cookie 作用路径

认真对照,特别是UC_KEY与UC_APPID,id一般为2以后的数字,查看uc后台,1被discuz x霸占了。 上面的配置不能遗漏。 UC_DBHOST,如果填写mysql,最好带port,可以包括端口号,例如 “hostname:port”,或者到本地套接字的路径,例如对于 localhost 的 “:/path/to/socket”。UC_PPP:默认值为 20,与 UCenter 日志显示的条数和通知管理显示的条数有关系。

在上述配置最后加上一句 :

$cookiename = 'tanahk';        // 用户自定义的cookie名

它用来贮存用户登陆成功后的cookie值。

我们现在需要花大力气修改uc.php。首先是修改开头的常量定义

error_reporting(0);define('IN_DISCUZ', TRUE);define('UC_CLIENT_VERSION', '1.5.0');    //note UCenter 版本标识define('UC_CLIENT_RELEASE', '20081031');define('API_DELETEUSER', 1);            //note 用户删除 API 接口开关define('API_RENAMEUSER', 1);            //note 用户改名 API 接口开关define('API_GETTAG', 1);                //note 获取标签 API 接口开关define('API_SYNLOGIN', 1);                //note 同步登录 API 接口开关define('API_SYNLOGOUT', 1);                //note 同步登出 API 接口开关define('API_UPDATEPW', 1);                //note 更改用户密码 开关define('API_UPDATEBADWordS', 1);        //note 更新关键字列表 开关define('API_UPDATEHOSTS', 1);            //note 更新域名解析缓存 开关define('API_UPDATEAPPS', 1);            //note 更新应用列表 开关define('API_UPDATECLIENT', 1);            //note 更新客户端缓存 开关define('API_UPDATECREDIT', 1);            //note 更新用户积分 开关define('API_GETCREDITSETTINGS', 1);        //note 向 UCenter 提供积分设置 开关define('API_GETCREDIT', 1);                //note 获取用户的某项积分 开关define('API_UPDATECREDITSETTINGS', 1);    //note 更新应用积分设置 开关define('API_RETURN_SUCCEED', '1');define('API_RETURN_FAILED', '-1');define('API_RETURN_FORBIDDEN', '-2');// 改你真实的discuz地址define('DISCUZ_ROOT', realpath(dirname(__FILE__) . '/../../x3.2/'));// 本应用配置路径define('DISCUZ_UC_CONFIG', realpath(dirname(__FILE__)));

然后是修改下面的note通知方式

//note 普通的 http 通知方式if(!defined('IN_UC')) {        if (!defined('PHP_VERSION_ID'))    {        $version = explode('.', PHP_VERSION);        define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));    }        // set_magic_quotes_runtime 5.3.0版本不赞成使用,5.4.0废弃    if (PHP_VERSION_ID < 530)        set_magic_quotes_runtime(0);        // 修改常量MAGIC_QUOTES_GPC,与php5.4接地气,让它一直为false    define('MAGIC_QUOTES_GPC', false);    require_once DISCUZ_UC_CONFIG . '/config.inc.php';        $GLOBALS['cookiename'] = $cookiename;    $_DCACHE = $get = $post = array();    $code = isset($_GET['code']) ? $_GET['code'] : '';    parse_str(_authcode($code, 'DECODE', UC_KEY), $get);        $timestamp = time();    if($timestamp - $get['time'] > 3600)         exit('Authracation has expiried');            if(empty($get))         exit('Invalid Request');            $action = $get['action'];    require_once  DISCUZ_ROOT . '/uc_client/lib/xml.class.ph