我们知道在ecshop后台促销管理,有红包的功能。Ecshop红包功能是可以抵消的效果直接现金,Ecshop红包有两种类型,一是直接发送到个人账户。存储在表中的ecs_user_bonus,一旦将其发送到客户的帐户。所以意味着其他人的代码,不能使用这段代码中扣除。另一个ecshop送红包是离线。当你的代码时,红包有效期的,您可以使用红包。
- 我们必须知道,ecshop的红包编码是有问题的。我们看flow.php
- if (((!empty($bonus) && $bonus[‘user_id’] == $_SESSION[‘user_id’]) || ($bonus[‘type_money’] > 0 && empty($bonus[‘user_id’]))) && $bonus[‘order_id’] <= 0)
- 这一句表示,就算是该编码没被使用。只要是发到个人帐户去之后。即使你登陆了,也不能通过这个编码来进行使用,所以这就是一大问题。
- 其次,我们看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++;
- }
- 首先我们看清楚,当你的红包编码达到了几百完以上,就容易产生重复的编码。其次,在录入红包编码的时候,根本没判断是否有重复的红包,这就造成了很大的问题,如果红包编码重复,那将是非常严重的问题
- $db->query(“INSERT INTO “.$ecs->table(‘user_bonus’).” (bonus_type_id, bonus_sn) VALUES(‘$bonus_typeid’, ‘$bonus_sn’)”);
- 为了解决这个问题,首先我们必须保证在录入编码之前,确保该编码没重复,所以必须判断数据库中是否有该编码。那么我们就必须对bonus_sn 来进行扫描判断,那么多数据如何提高扫描速度呢。我们必须在bonus_sn上建立索引。其次,我们可以修改红包编码的规则。既然是十位,我们就可以用我们自己的办法来得到。
- static function GenSecret($len=6, $type=self::CHAR_WORD)
- {
- $secret = ”;
- for ($i = 0; $i < $len; $i++) {
- if ( self::CHAR_NUM==$type ){
- if (0==$i) {
- $secret .= chr(rand(49, 57));
- } else {
- $secret .= chr(rand(48, 57));
- }
- }else if ( self::CHAR_WORD==$type ){
- $secret .= chr(rand(65, 90));
- }else{
- if ( 0==$i ){
- $secret .= chr(rand(65, 90));
- } else {
- $secret .= (0==rand(0,1))?chr(rand(65, 90)):chr(rand(48,57));
- }
- }
- }
- return $secret;
- }
- 这个方法,要强过ecshop红包默认的编码规则。