深度分析ecshop红包功能二次开发和BUG

2011-05-26 23:35 来源:www.chinab4c.com 作者:熊斌

     接触了ecshop这么长时间了。也对ecshop二次开发积累了不少经验。ecshop红包的概念,在ecshop中是十分常见的事情。相信使用过ecshop的人都了解红包有些什么功能。红包很简单。在ecshop里面我们可以通过购买的时候,拿到红包编码来抵消部分现金。

    常用的ecshop红包就是在注册的时候,通过对ecshop的二次开发,发送注册红包。还有就是在ecshop系统搞活动的时候,对ecshop促销活动发送一些红包。来促进消费。

     首先我们知道,ecshop的红包有两类,一类是线下发放的编码,一类是线上发放的编码。一般我们常用的就是线下发送。客户可以将领取的编码放到自己的会员中心,也可以将自己的编码直接在购买的时候,输入编码进行抵消。

    这里就遇到ecshop红包的第一个BUG。就是增加在个人中心之后,你可以在登陆状态下选择红包,可以抵消部分现金,但是如果你将被录入到你帐户中的红包编码,再手动在输入框中输入,这个时候就提示该红包存在,理由很简单。直接使用的编码,被控制了不能手动输入。

    if (((!empty($bonus) && $bonus['user_id'] == $_SESSION['user_id']) || ($bonus['type_money'] > 0 && empty($bonus['user_id']))) && $bonus['order_id'] <= 0)
 我们看该代码, $bonus['user_id'] == $_SESSION['user_id']这个问题造成了非常严重的后果。

     其次,我们可以看到,线上发布的红包,没有红包编码,这个让客户用起来,十分的不方便,也没有报表,相当困难,统计起来。

     ecshop的BUG还体现在编码重复上,ecshop红包编码的规则十分简陋,这样的算发容易存在重复。

      $num = $db->getOne("SELECT MAX(bonus_sn) FROM ". $ecs->table('user_bonus'));
    $num = $num ? floor($num / 10000) : 100000;

    for ($i = 0, $j = 0; $i < $bonus_sum; $i++)
    {
        $bonus_sn = ($num + $i) . str_pad(mt_rand(0, 9999), 4, '0', STR_PAD_LEFT);
        $db->query("INSERT INTO ".$ecs->table('user_bonus')." (bonus_type_id, bonus_sn) VALUES('$bonus_typeid', '$bonus_sn')");

        $j++;
    }

      当你数据库中的红包编码超过了100万之后,你想想看,是否会出现重复的现象。我有个朋友,他发出去了几百万的红包,但是里面有很大部分是重复的。而且ecshop在发送红包的过程中,也没有很好的控制该红包是否存在。就直接将红包编码发送到客户的帐户上去了。会导致100面值的红包结果只能抵消10面值的红包。

     在这个过程中,为了让ecshop红包插件使用更广泛,更安全。我们必须对ecshop红包规则进行修改,同时避免重复红包编码的出现。

    来源:http://www.chinab4c.com