Ecshop对接discuz步骤
1.安装discuz
2.将upload下uc_client文件夹复制到ecshop根目录下
3.在ecshop后台》用户管理》会员整合 选择ucenter安装
在上图的地方点击"直接保存配置信息".
4.回到会员整合页面 对UCenter进行设置
5.登录discuz后台》站长》UCenter设置
然后提交
6.到discuz后台》ucenter》应用管理 查看是否通信成功
7.导出导入ecshop用户
使用navicat导出ecshop的用户表ec_users,导出以下字段的数据.导出成excel的xls文件users.XLS
user_name | password | reg_time | last_login | last_time | last_ip | ec_salt | salt | Moblie_phone | |
用excel手工新增一个字段groupid,设置值为10.discuz中是"新手上路"用户组.
再用excel手工新增一个字段timeoffset,设置为9999或8.discuz中,9999的时区是使用系统默认.8是东八区时间,即北京时间.
如果excel打开该文件时提示某些可能错误,则操作完成后需要另存一下同名文件.因为navicat导出xls文件有些问题,需要用excel另存一下正确的xls文件.
用navica将user.XLS文件导入ucenter的用户表uc_center_members.字段对应关系如下:
ucenter字段名 | ecshop字段名 | |
uid | user_id | |
username | user_name | |
password | password | |
| | |
regdate | reg_time | |
lastloginip | last_ip | |
lastlogintime | last_login | |
salt | ec_salt | |
tel | Mobile_phone |
只要ucenter的加盐字段salt和ecshop的ec_salt字段对应,password对应.则用户就可以使用以前的密码登录了.我没有见ecshop使用过salt字段进行加密,可能是预留的字段吧.
8.在ecshop找到user.php文件,找到$action == 'act_login'。将登录成功的跳转改为下面的内容:
$ucdata = isset($user->ucdata)? $user->ucdata : '';
show_message($_LANG['login_success'].$ucdata,array($_LANG['back_up_page'], $_LANG['profile_lnk']), array($back_act,'user.php'), 'succ');
//到这一步就应该可以同步登陆了
9.找到user.php中的$action == 'logout',将退出后的跳转改为下面的内容:
$ucdata = empty($user->ucdata)? "" : $user->ucdata;
show_message($_LANG['logout'].$ucdata,array($_LANG['back_up_page'],$_LANG['back_home_lnk']), array($back_act, 'index.php'), 'info');
10.打开EC根目录下的 api 目录下的 uc.php ,在uc.php中 找到 set_cookie 函数。
它是 判断 user_id 这个参数,如果是空的 就销毁 cookie,否则 设置cookie 但是发现 设置 cookie 的时候 是:
setcookie("ECS[username]", $user_name, $time, $GLOBALS['cookie_path'], 是有四个参数,设置了 cookie 的路径,可是销毁 cookie 的时候 是 没有 加 路径的 ,所以退出的时候 是没有 销毁 cookie 的,
需要加上 $GLOBALS['cookie_path'],作为 第四个参数。
11.在 discuz中新注册用户,注册完成后 自动就是在登录状态,在EC 中 怎么刷新 也不能登录,在discuz中找到class_member.php文件,在注册过程最后showmaessage之前加入$ucsynlogin=uc_user_synlogin($uid);
$extra = array(
'showid' => 'succeedmessage',
'extrajs' => '<script type="text/javascript">'.
'setTimeout("window.location.href =\''.$href.'\';", '.$refreshtime.');'.
'$(\'succeedmessage_href\').href = \''.$href.'\';'.
'$(\'main_message\').style.display = \'none\';'.
'$(\'main_succeed\').style.display = \'\';'.
'$(\'succeedlocation\').innerHTML = \''.lang('message', $locationmessage).'\';'.
'</script>'.$ucsynlogin,
'striptags' => false,
);
并把之前重复的删掉
12.同样 在EC中注册用户,注册完成后自动就是在登录 状态,在discuz中 怎么刷新 也不能登录, 需要 也在 discuz中登录一次后才可以
首先 在 EC 的站点下 user.php 找到 if(register($username, $password, $email, $other) !==false) 这个判断(大约在140 行左右)。将 register($username, $password, $email, $other) 拿出去 即:
$uid = register($username, $password, $email, $other);
if ($uid !== false)
再找到 EC 更目录 下的 includes 下的 lib_passport.php 中的 register() 方法,找到 if (!$GLOBALS['user']->add_user($username, $password, $email)) 这个判断,同样 把 $GLOBALS['user']->add_user($username, $password, $email) 拿出去,写成:
$uid = $GLOBALS['user']->add_user($username, $password, $email);
if (!$uid) 接着 在 这个方法的 结尾处找到 else 块中的 return true; 就是调用 recalculate_price(); 这个方法 之后的 return true; 改成 return $uid;
在 EC根目录下 的 includes 下的 modules 下的 integrates 下的 ucenter.php 中的 add_user() 这个方法,在这个方法的结尾 也是 else 块中
$this->db->query() 在调用这个方法之后,加以下代码:
$this->ucdata = uc_call("uc_user_synlogin",array($uid));
同样 将 return true; 改成 return $uid; 接着在回到 user.php 的注册会员那块 在 if ($uid !== false) 这个判断的最后 调用 show_message() 方法之前 加入 $ucdata = empty($user->ucdata)? "" : $user->ucdata; 如果有的话就不用加了。将 show_message() 的第一参数改成 sprintf($_LANG['register_success'], $username . $ucdata) 即: show_message(sprintf($_LANG['register_success'], $username . $ucdata), array($_LANG['back_up_page'], $_LANG['profile_lnk']), array($back_act, 'user.php'), 'info');
//注意在商城中因为分手机注册和邮箱注册,邮箱注册可以不变,但手机注册要做相应的改动,而原版ecshop是用的邮箱注册的,不加入手机注册的对应方法在注册过程中会报错。
13.如果还无法登陆
查看uc_client文件夹下的apps.php文件
内容应该为:
<?php
$_CACHE['apps'] = array (
1 =>
array (
'appid' => '1',
'type' => 'DISCUZX',
'name' => 'Discuz! Board',
'url' => 'http://bbs.oin.com.cn',
'ip' => '',
'viewprourl' => '',
'apifilename' => 'uc.php',
'charset' => '',
'dbcharset' => '',
'synlogin' => '1',
'recvnote' => '1',
'extra' => false,
'tagtemplates' => '',
'allowips' => '',
),
2 =>
array (
'appid' => '2',
'type' => 'ECSHOP',
'name' => 'oin.com.cn',
'url' => 'http://oin.com.cn',
'ip' => '',
'viewprourl' => '',
'apifilename' => 'uc.php',
'charset' => 'utf-8',
'dbcharset' => '',
'synlogin' => '1',
'recvnote' => '1',
'extra' => '',
'tagtemplates' => '',
'allowips' => '',
),
);
?>
并且ecshop和discuz中是相同的。到这里应该就能实现登陆、退出、注册同步了。
14.积分的兑换:
首先在discuz后台》全局》积分设置里面设置,如图,然后提交
再在UCenter》积分兑换 中设置兑换规则
完成后再在更新缓存选项中更新缓存,之后进入discuz个人中心查看
在查看ecshop中的user.php文件中看下是否有$action == 'transform_points'和$action == 'act_transform_points',存在说明ecshop中也设置成功,只不过因为不是原版的ecshop所以在ecshop的个人中心中无法显示积分兑换的选项,新建对应的模板文件,文件内主要代码为:
<h3><span>论坛金钱兑换</span></h3>
<div class="blank"></div>
<!--{if $exchange_type eq 'ucenter'}-->
<form action="user.php" method="post" name="transForm" οnsubmit="return calcredit();">
<table width="100%" border="0" cellpadding="5" cellspacing="1" bgcolor="#dddddd">
<tr>
<th width="120" bgcolor="#FFFFFF" align="right" valign="top">您的当前美美币:</th>
<td bgcolor="#FFFFFF">
<label for="pay_points"> </label><input type="text" size="15" id="pay_points" name="pay_points" value="{$shop_points.pay_points}" style="border:0;border-bottom:1px solid #DADADA;" readonly="readonly" /><br />
<div class="blank"></div>
<!-- <label for="rank_points">{$lang.exchange_points.0}:</label><input type="text" size="15" id="rank_points" name="rank_points" value="{$shop_points.rank_points}" style="border:0;border-bottom:1px solid #DADADA;" readonly="readonly" /> -->
</td>
</tr>
<tr><td bgcolor="#FFFFFF"> </td>
<td bgcolor="#FFFFFF"> </td>
</tr>
<tr>
<th align="right" bgcolor="#FFFFFF"><label for="amount">{$lang.exchange_amount}:</label></th>
<td bgcolor="#FFFFFF"><input size="15" name="amount" id="amount" value="0" οnkeyup="calcredit();" type="text" />
<select name="fromcredits" id="fromcredits" οnchange="calcredit();">
{html_options options=$lang.exchange_points selected=$selected_org}
</select>
</td>
</tr>
<tr>
<th align="right" bgcolor="#FFFFFF"><label for="desamount">{$lang.exchange_desamount}:</label></th>
<td bgcolor="#FFFFFF"><input type="text" name="desamount" id="desamount" disabled="disabled" value="0" size="15" />
<select name="tocredits" id="tocredits" οnchange="calcredit();">
{html_options options=$to_credits_options selected=$selected_dst}
</select>
</td>
</tr>
<tr>
<th align="right" bgcolor="#FFFFFF">{$lang.exchange_ratio}:</th>
<td bgcolor="#FFFFFF">1 <span id="orgcreditunit">{$orgcreditunit}</span> <span id="orgcredittitle">{$orgcredittitle}</span> {$lang.exchange_action} <span id="descreditamount">{$descreditamount}</span> <span id="descreditunit">{$descreditunit}</span> <span id="descredittitle">{$descredittitle}</span></td>
</tr>
<tr><td bgcolor="#FFFFFF"> </td>
<td bgcolor="#FFFFFF"><input type="hidden" name="act" value="act_transform_ucenter_points" /><input type="submit" name="transfrom" value="{$lang.transform}" /></td></tr>
</table>
</form>
<script type="text/javascript">
{foreach from=$lang.exchange_js item=lang_js key=key}
var {$key} = '{$lang_js}';
{/foreach}
var out_exchange_allow = new Array();
{foreach from=$out_exchange_allow item=ratio key=key}
out_exchange_allow['{$key}'] = '{$ratio}';
{/foreach}
function calcredit()
{
var frm = document.forms['transForm'];
var src_credit = frm.fromcredits.value;
var dest_credit = frm.tocredits.value;
var in_credit = frm.amount.value;
var org_title = frm.fromcredits[frm.fromcredits.selectedIndex].innerHTML;
var dst_title = frm.tocredits[frm.tocredits.selectedIndex].innerHTML;
var radio = 0;
var shop_points = ['rank_points', 'pay_points'];
if (parseFloat(in_credit) > parseFloat(document.getElementById(shop_points[src_credit]).value))
{
alert(balance.replace('{%s}', org_title));
frm.amount.value = frm.desamount.value = 0;
return false;
}
if (typeof(out_exchange_allow[dest_credit+'|'+src_credit]) == 'string')
{
radio = (1 / parseFloat(out_exchange_allow[dest_credit+'|'+src_credit])).toFixed(2);
}
document.getElementById('orgcredittitle').innerHTML = org_title;
document.getElementById('descreditamount').innerHTML = radio;
document.getElementById('descredittitle').innerHTML = dst_title;
if (in_credit > 0)
{
if (typeof(out_exchange_allow[dest_credit+'|'+src_credit]) == 'string')
{
frm.desamount.value = Math.floor(parseFloat(in_credit) / parseFloat(out_exchange_allow[dest_credit+'|'+src_credit]));
frm.transfrom.disabled = false;
return true;
}
else
{
frm.desamount.value = deny;
frm.transfrom.disabled = true;
return false;
}
}
else
{
return false;
}
}
</script>
<!--{else}-->
<b>{$lang.cur_points}:</b>
<table width="100%" border="0" cellpadding="5" cellspacing="1" bgcolor="#dddddd">
<tr>
<td width="30%" valign="top" bgcolor="#FFFFFF"><table border="0">
<!--{foreach from=$bbs_points item=points}-->
<tr>
<th>{$points.title}:</th>
<td width="120" style="border-bottom:1px solid #DADADA;">{$points.value}</td>
</tr>
<!--{/foreach} -->
</table></td>
<td width="50%" valign="top" bgcolor="#FFFFFF"><table>
<tr>
<th>{$lang.pay_points}:</th>
<td width="120" style="border-bottom:1px solid #DADADA;">{$shop_points.pay_points}</td>
</tr>
<tr>
<th>{$lang.rank_points}:</th>
<td width="120" style="border-bottom:1px solid #DADADA;">{$shop_points.rank_points}</td>
</tr>
</table></td>
</tr>
</table>
<br />
<b>{$lang.rule_list}:</b>
<ul class="point clearfix">
<!-- {foreach from=$rule_list item=rule} -->
<li><font class="f1">·</font>"{$rule.from}" {$lang.transform} "{$rule.to}" {$lang.rate_is} {$rule.rate}
<!-- {/foreach} -->
</ul>
<form action="user.php" method="post" name="theForm">
<table width="100%" border="1" align="center" cellpadding="5" cellspacing="0" style="border-collapse:collapse;border:1px solid #DADADA;">
<tr style="background:#F1F1F1;">
<th>{$lang.rule}</th>
<th>{$lang.transform_num}</th>
<th>{$lang.transform_result}</th>
</tr>
<tr>
<td>
<select name="rule_index" οnchange="changeRule()">
<!--{foreach from=$rule_list item=rule key=key}-->
<option value="{$key}">{$rule.from}->{$rule.to}</option>
<!--{/foreach}-->
</select>
</td>
<td>
<input type="text" name="num" value="0" οnkeyup="calPoints()"/>
</td>
<td><span id="ECS_RESULT">0</span></td>
</tr>
<tr>
<td colspan="3" align="center"><input type="hidden" name="act" value="act_transform_points" /><input type="submit" value="{$lang.transform}" /></td>
</tr>
</table>
</form>
<script type="text/javascript">
//<![CDATA[
var rule_list = new Object();
var invalid_input = '{$lang.invalid_input}';
{foreach from=$rule_list item=rule key=key}
rule_list['{$key}'] = '{$rule.rate}';
{/foreach}
function calPoints()
{
var frm = document.forms['theForm'];
var rule_index = frm.elements['rule_index'].value;
var num = parseInt(frm.elements['num'].value);
var rate = rule_list[rule_index];
if (isNaN(num) || num < 0 || num != frm.elements['num'].value)
{
document.getElementById('ECS_RESULT').innerHTML = invalid_input;
rerutn;
}
var arr = rate.split(':');
var from = parseInt(arr[0]);
var to = parseInt(arr[1]);
if (from <=0 || to <=0)
{
from = 1;
to = 0;
}
document.getElementById('ECS_RESULT').innerHTML = parseInt(num * to / from);
}
function changeRule()
{
document.forms['theForm'].elements['num'].value = 0;
document.getElementById('ECS_RESULT').innerHTML = 0;
}
//]]>
</script>
<!--{/if}-->
<!--{/if} -->
<!--#积分兑换 -->
<!--右部 end-->
这部分代码就是实现积分兑换的代码。
到此,对接所有功能就应该完成了。