php的 uc_client.php 测试一列

define('UC_CONNECT', 'mysql');

define('UC_DBHOST', 'localhost');
define('UC_DBUSER', 'root');
define('UC_DBPW', '');
define('UC_DBNAME', 'ultrax');
define('UC_DBCHARSET', 'utf8');
define('UC_DBTABLEPRE', '`ultrax`.pre_ucenter_');
define('UC_DBCONNECT', 0);

define('UC_CHARSET', 'utf-8');
define('UC_KEY', 'M1K6F1X3Qaj5d103O8J8Labay219occ7w78d5asbb34aZfGbV2O9t9E5m288NfNd');
define('UC_API', 'http://127.0.0.1/dz/uc_server');
define('UC_APPID', '1');
define('UC_IP', '');
define('UC_PPP', 20);

if($_POST)
{

include "uc_client/client.php";
$username=$_POST["u"];
$password=$_POST["p"];
$f = uc_get_user($username, 0);
if(!$f)
{

uc_user_register($username, $password, $username."@aaa.com");
$f = uc_get_user($username, 0);
}
echo uc_user_synlogin($f[0]) ;
}

uc_client/client.php 功能介绍

uc的客户端uc_clinet/client.php 功能

以uc_get_user 为例子

function uc_get_user($username, $isuid=0) {
	$return = call_user_func(UC_API_FUNC, 'user', 'get_user', array('username'=>$username, 'isuid'=>$isuid));
	return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);
}
此函数调用 client.php 内部 UC_API_FUNC 函数,一般来说UC_API_FUNC 是 定值,你在客户端的后台一般设置是mysql方式的同步
那么  
define('UC_API_FUNC', UC_CONNECT == 'mysql' ? 'uc_api_mysql' : 'uc_api_post');
也就是说 UC_API_FUNC 的值是 uc_api_mysql
下面看 uc_api_myql 函数
function uc_api_mysql($model, $action, $args=array()) {
	global $uc_controls;
	if(empty($uc_controls[$model])) {
		include_once UC_ROOT.'./lib/db.class.php';
		include_once UC_ROOT.'./model/base.php';
		include_once UC_ROOT."./control/$model.php";
		eval("\$uc_controls['$model'] = new {$model}control();");
	}
	if($action{0} != '_') {
		$args = uc_addslashes($args, 1, TRUE);
		$action = 'on'.$action;
		$uc_controls[$model]->input = $args;
		return $uc_controls[$model]->$action($args);
	} else {
		return '';
	}
}
表示的是 包含了 control/$model.php  运行里面的 on_xxx 比如  onget_user 就是一例
function onget_user() {
		$this->init_input();
		$username = $this->input('username');
		if(!$this->input('isuid')) {
			$status = $_ENV['user']->get_user_by_username($username);
		} else {
			$status = $_ENV['user']->get_user_by_uid($username);
		}
		if($status) {
			return array($status['uid'],$status['username'],$status['email']);
		} else {
			return 0;
		}
	}
这里明显是 $_ENV['user'] 是 model/user.php 的user类引入的
在contrl/user.php 里面看的很清楚
	function usercontrol() {
		parent::__construct();
		$this->load('user');
		$this->app = $this->cache['apps'][UC_APPID];
	}
通过base类的load 函数 

	function load($model, $base = NULL) {
		$base = $base ? $base : $this;
		if(empty($_ENV[$model])) {
			require_once UC_ROOT."./model/$model.php";
			eval('$_ENV[$model] = new '.$model.'model($base);');
		}
		return $_ENV[$model];
	}

那么好了,在user->get_user_by_username 和  $user->get_user_by_uid 函数里面选择一个,根据 isuid 来判断参数是否是uid,
从而到uc数据库的UC_DBTABLEPRE."members 根据uid还是username查找.得到的值被重新组织了!!!
return array($status['uid'],$status['username'],$status['email']);

如果想得到 uid ,需要从 [0] 里面的!!!

phpcms 整合ucenter 的资料

首先此文甚好 http://down.chinaz.com/try/201208/2176_2.htm
需要注意的是phpcms 后台配置需要指明数据库的名字。
另外查看我之前的博文来解决在 phpcms 退出后不发出js通知到ucenter的各个系统。
如果需要在phpcms注册时候自动登陆到ucenter的discuz系统,还需要看这个博文

关于ucenter各个应用如何最快捷知道所有的app,看这里 

记事狗微博的api/uc.php 同步登录的新注册用户问题

在记事狗微博的 api/uc.php 里面当记事狗本身用户不存在,而在uc里面存在的时候,当登录后自动注册到记事狗,需要修改代码实现。图中红线部分是重要的,必须的。
在api/uc.php 的 onsynlogin 同步登录函数里面的部分代码如下

jishigou

代码如下

 include_once(ROOT_PATH . 'uc_client/client.php');
            if($data = uc_get_user($get["username"]))
            {
                list($uid, $uname, $email) = $data;
 		        $this->db->query("REPLACE  INTO   `{$this->tablepre}members` (`uid`,`ucuid`,`username`,`nickname`,`email`,`role_id`) values ('$uid','$uid','$uid','$uname','$email','2')");
		        $query = $this->db->query("SELECT `uid`, `password` FROM `{$this->tablepre}members` WHERE `ucuid`='$uid'");
		        $UserFields = $this->db->fetch_array($query);
			    $auth = authcode("{$UserFields['password']}\t{$UserFields['uid']}","ENCODE",'',1209600);
                jsg_setcookie('sid', '', -311040000);
                jsg_setcookie('auth',$auth,311040000);
 
            }

shopex 同步 ucenter 的redirect问题,造成script不运行

首先此问题来自向这个帖子

http://hi.baidu.com/fire_love_live/item/247276cfda421217b67a24c7

需要说明的是,并非15处需要修改,

其中 有关登陆密码错的那一项建议不要修改

在大约行 557处

$this->nowredirect('failed',base64_encode(str_replace(array('+','/','='),array('_',',','~'),$_POST['ref_url'])),__('用户名或密码有误,请重新输入'),$_POST['from_minipassport']);

上面的nowredirect 不建议修改为 splash

 

最土整合uc的问题,其他系统可能需要调整登陆代码

问题:

最土的用户被导入到了ucenter 的用户表,其他uc_server 的客户端登陆时候提示密码错

解决思路

最土的加密方法在 ./include/classes/ZUser.class.php

const SECRET_KEY = ‘@4!@#$%@’;

static public function GenPassword($p) {
return md5($p . self::SECRET_KEY);
}

而uc的方法是  md5(md5(‘密码’) + SALT字段)

两者不相同,所以需要在其他系统里面吧最土的密码验证发也加进去,

现在以shopex为例 ,shopex系统里面uc_client 目录在shopex/core/lib/uc_client

修改里面的 model\user.php 和 control\user.php

model\user.php 修改如下

zuitu_ex_uc_2

control\user.php 修改如下zuitu_ex_uc_1

 

 

 

ecshop的ucenter同步登陆uc.php 一点错误勘误

在ecshop的会员整合ucenter的set_cookie函数有问题
文件在 /api/uc.php 搜索 set_cookie

function set_cookie($user_id=”, $user_name = ”, $email = ”)
{
if (empty($user_id))
{
/* 摧毁cookie */
$time = time() – 3600;
setcookie(‘ECS[user_id]’, ”, $time);//这里有问题
setcookie(‘ECS[username]’, ”, $time);//这里有问题
setcookie(‘ECS[email]’, ”, $time);//这里有问题
}
else
{
/* 设置cookie */
$time = time() + 3600 * 24 * 30;
setcookie(“ECS[user_id]”, $user_id, $time, $GLOBALS[‘cookie_path’], $GLOBALS[‘cookie_domain’]);
setcookie(“ECS[username]”, $user_name, $time, $GLOBALS[‘cookie_path’], $GLOBALS[‘cookie_domain’]);
setcookie(“ECS[email]”, $email, $time, $GLOBALS[‘cookie_path’], $GLOBALS[‘cookie_domain’]);
}
}

因为假设这样的架构
http://域名/ 是 ecshop ,http://域名/bbs/ 为论坛dzX2, 那么,在ec登陆后,dzX2 点退出,
会发送一个javascript申请到 /api/uc.php的 logout请求 ( 如果setcookie 只是在 /api/ 下 设置cookie 为空,那么就清空不了cookie
严格的应该是
setcookie(‘ECS[user_id]’, ”, $time,$GLOBALS[‘cookie_path’], $GLOBALS[‘cookie_domain’]);

那么代码可以修改为

还有要修改ecshop的 ucenter插件,includes/modules/integrates/ucenter.php
如图两部分


另外还要看 这一篇
/ucenter-sync.html

ecshop系列:同步ucenter,一步登陆discuzX

看到太多的各类系统整合ucenter出现的各种各样的问题,比如无法同步登入,同步退出,注册用户时候出现问题

研读过ucenter 的原理后,再结合测试 ucenter + modoer + discuz X 1.5 + ecshop 2.7.2 实现了完美的同步登入和退出

发现一个简单的方法就是,把ucenter 的data/cache/apps.php 文件复制到各个系统的 uc_client/data/cache/apps.php

就可以解决大半的同步问题
检查过上面问题后,再检查各个系统的关于ucenter 的配置处,确保key和uc里面的一致,然后清空各系统缓存,测试

另外还要看 这一篇
/ecshop-api-uc.html