如何变更ECSHOP系统红包序列号规则

2016-07-07 15:16 来源:www.chinab4c.com 作者:ecshop专家

现有系统的线下红包发放是在10000的基础上增加四位随机数字.
因为我要发放大额红包,所以总感觉这样不是很安全,
万一真的有哪个无聊的人,用一天时间来蒙几个红包序列号出来,我就亏大了..

所以,我想更改一下系统的红包序列号发放规则.在bonus.php中我看到了规则:


/* 生成红包序列号 */
$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++;
}


那么,有没有可能把这个规则改的复杂一些呢?例如增加几个字母之类的?
我只在论坛上搜索到了如下关于红包的描述,其他的完全就是空白,希望有能力的人帮忙解决一下,谢谢!

回答:
这个我想知道哦

1 看下数据库 表 user_bonus 对存储的字段类型是什么类型
2 检查程序,是否在验证红包的时候有对数字过滤,如果有过滤,那么这个部分也需要改
并不是简单改生成的序列号就可以了。
如果以上都没问题,那么修改就相对简单了。
$bonus_sn = ($num + $i) . str_pad(mt_rand(0, 9999), 4, '0', STR_PAD_LEFT)
这段里面添加随机字符就可以了

验证的时候过不去,因为intval函数超过10位就溢出了

ECSHOP系统线下发放红包时系统生成的红包序列号是在10000的基础上增加四位随机数字。如果当我们要发放大额度红包的时候,这样的序列号规则难免给人不安全的感觉,万一真的有哪个无聊的人,用一天时间来蒙几个红包序列号出来,那就亏大了。因为最多只要试10000次就可以了,所以我们需要更改一下系统的红包序列号发放规则,让红包的序列号是由a-z,A-Z,0-9的字符组合而成,下面给出修改方法:

1、修改ecs_user_bonus表中bonus_sn字段的数据类型

ECSHOP 2.7.2中该字段类型为bigint,我们需要修改为varchar。

2、修改js/user.js文件中对红包序列号验证的部分

在文件的672行左右,找到

var reg = /^[0-9]{10}$/;

修改为:

var reg = /^[0-9a-zA-Z]{10}$/;

3、修改admin/bonus.php文件中红包序列号生成规则

在文件的569行左右,注释掉如下两行:

/* 生成红包序列号 */
//$num = $db->getOne(“SELECT MAX(bonus_sn) FROM “. $ecs->table(‘user_bonus’));
//$num = $num ? floor($num / 10000) : 100000;

修改for循环中序列号的生成规则如下:

for ($i = 0, $j = 0; $i < $bonus_sum; $i++)
{
//$bonus_sn = ($num + $i) . str_pad(mt_rand(0, 9999), 4, ’0′, STR_PAD_LEFT);
$bonus_sn = get_unique_id(10);
$db->query(“INSERT INTO “.$ecs->table(‘user_bonus’).” (bonus_type_id, bonus_sn) VALUES(‘$bonus_typeid’, ‘$bonus_sn’)”);

$j++;
}

增加生成随机字符加数字的函数:

function get_unique_id($length=32, $pool=”")
{
if($pool == “”) $pool .= “abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”;
mt_srand ((double) microtime() * 1000000);
$unique_id = “”;
for ($index = 0; $index < $length; $index++) {
$unique_id .= substr($pool, (mt_rand()%(strlen($pool))), 1);
}
return $unique_id;
}

4、修改user.php中添加红包的验证部分

在文件的768行 左右:

/* 添加一个红包 */
elseif ($action == ‘act_add_bonus’)
{
include_once(ROOT_PATH . ‘includes/lib_transaction.php’);

//$bouns_sn = isset($_POST['bonus_sn']) ? intval($_POST['bonus_sn']) : ”;
$bouns_sn = isset($_POST['bonus_sn']) ? trim($_POST['bonus_sn']) : ”;

if (add_bonus($user_id, $bouns_sn))
{
show_message($_LANG['add_bonus_sucess'], $_LANG['back_up_page'], ‘user.php?act=bonus’, ‘info’);
}
else
{
$err->show($_LANG['back_up_page'], ‘user.php?act=bonus’);
}
}

将原来的

$bouns_sn = isset($_POST['bonus_sn']) ? intval($_POST['bonus_sn']) : ”;

修改为:

$bouns_sn = isset($_POST['bonus_sn']) ? trim($_POST['bonus_sn']) : ”;

到这里修改就完成了,后台清除下缓存就可以为红包生成字母加数字的序列号了,现在生成的序列号是由a-z、A-Z以及0-9组成,安全性高的同时,也避免了大批量发放导致的序列号重复问题。
原文可参考: 为ECSHOP系统红包序列号增加字符

红包序列 增加

嗯,学习了

不错,学习了!

我也来学习中, 高人啊

为什么按照你这样需改了红包发放,前台用户登入了添加红包是可以 ,但是直接购买的时候那里验证红包序列号的时候会提示红包不存在,这什么情况?

为什么按照你这样需改了红包发放,前台用户登入了添加红包是可以 ,但是直接购买的时候那里验证红包序列号的时候会提示红包不存在,这什么情况?

我也遇到这个问题了。。。。郁闷 寻求解决

为什么按照你这样需改了红包发放,前台用户登入了添加红包是可以 ,但是直接购买的时候那里验证红包序列号的时候会提示红包不存在,这什么情况?

我也是。。。