本帖最后由 manpai 于 2011-11-11 04:13 编辑
在论坛里找了好久 发现都没有相关的解决办法 其实很简单
大家可以测试 http://www.k728.com/
在论坛注册 和QQ注册时 dz没有向uc发送同步登陆指令 uc_user_synlogin($uid)
修改class_member.php文件
在810行左右
$param = array('bbname' => $this->setting['bbname'], 'username' => $_G['username'], 'usergroup' => $_G['group']['grouptitle'], 'uid' => $_G['uid']);
if(strpos($url_forward, $this->setting['regname']) !== false || strpos($url_forward, 'buyinvitecode') !== false) {
$url_forward = 'forum.php';
}
下增加
$ucsynlogin = $this->setting['allowsynlogin'] ? uc_user_synlogin($_G['uid']) : ''; //这句
然后将
'$(\'succeedlocation\').innerHTML = \''.lang('message', $locationmessage).'\';'.
'</script>',
修改为
'$(\'succeedlocation\').innerHTML = \''.lang('message', $locationmessage).'\';'.
'</script>'.$ucsynlogin,
保存上传 在注册的时候就能发送同步登陆的指令了
还有一个问题就是第三方 这时还没有用户的资料 收到同步指令也无法登陆 所以还要修改 第三方的uc.app.php文件 在接收到同步登陆时 自动拉取uc里的用户资料。
下面以ecmall为例:
/* 同步登陆 */
function synlogin($get, $post) {
$uid = $get['uid'];
$username = $get['username'];
if(!API_SYNLOGIN) {
return API_RETURN_FORBIDDEN;
}
//note 同步登录 API 接口
$ec_user = $this->user_mod->get($uid);
if ($ec_user)
{
$this->_do_login($ec_user['user_id']);
}
///////////////////////
else{
/* 同步到本地 */
$this->_local_sync($uid, $username, $get['email']);
//note 同步登录 API 接口 再次同步
$ec_user = $this->user_mod->get($uid);
if ($ec_user)
{
$this->_do_login($ec_user['user_id']);
}
}
///////////////////////////////
return API_RETURN_SUCCEED;
}
//////////这里面表示是我加的
然后将
////////////////////////////
function _local_add($data)
{
$model_member =& m('member');
$user_id = $model_member->add($data);
if (!$user_id)
{
$this->_errors = $model_member->get_error();
return 0;
}
return $user_id;
}
function _local_get($conditions)
{
$model_member =& m('member');
return $model_member->get($conditions);
}
function _local_sync($user_id, $user_name, $email)
{
/* 本地保持同步 */
$local_info = $this->_local_get($user_id);
if (empty($local_info))
{
$user_info = outer_call('uc_get_user', array($user_id, 1));
if (empty($user_info))
{
$this->_error('no_such_user');
return false;
}
list($user_id, $user_name, $email) = $user_info;
/* 有可能在用户中心有而本地没有,这时要将其加上 */
$data = array(
'user_id' => $user_id,
'user_name' => $user_name,
'password' => md5(time() . rand(100000, 999999)),
'email' => $email,
'reg_time' => gmtime()
);
$this->_local_add($data);
}
}
///////////////////////////
复制到api.base.php 里 class ApiApp extends ECBaseApp这个类里面
注意 在这个文件顶部<? php 下要加上这句
include (ROOT_PATH . '/uc_client/client.php');//原来没
使$user_info = outer_call('uc_get_user', array($user_id, 1));生效
就可以了
其它平台可以参考这个方面实现直正一键全站能 的效果
补充一下 有关ecmall 关闭浏览器后用户退出而论坛用户没有退出 这时 请求的登陆不能成功
所以在ecmall 点击登陆之前执行一下退出操作
<script>
function QQ_login()
{
var iframe = document.createElement("iframe");
iframe.src = "http://bbs.k728.com/member.php?mod=logging&action=logout";
if (iframe.attachEvent){
iframe.attachEvent("onload", function(){
window.location.href="http://www.k728.com/u/connect.php?mod=login&op=init&referer=../&statfrom=login_simple";
});
}
else {
iframe.onload = function(){
window.location.href="http://www.k728.com/u/connect.php?mod=login&op=init&referer=../&statfrom=login_simple";
}
}
document.body.appendChild(iframe);
$("iframe").css("height","0");
}
</script>
<a href="javascriptQ_login();">QQ登陆</a>
|