所用生成器:Hashids - generate short unique ids from integers
系统优势:
- 生成的兑换码不实际入库,只在数据库中记录有效个数,数据库友好
- 兑换码使用时,无须查库校验有效性和加锁,在内存中确认有效后直接落库,由唯一索引进行数据库重复兑换校验,高效
- 兑换码仅绑定礼包id,可随时修改礼包内容,运营掌控力度大
- 兑换码长度和内容可随意设定(将影响可用数量),生成灵活
- 兑换码有加密,不能被轻易破解,安全保障
运营需求
- 运营配置游戏礼包,并为该礼包生成或指定礼包兑换码,玩家可使用兑换码兑换指定礼包
- 每个礼包玩家仅可兑换一次
- 礼包可设定以下属性并支持随时修改
- 生效时段
- 奖励内容
- 上下架状态
- 增加可兑换数量
- 礼包邮件内容
- 可兑换玩家限制(自行实现)
- 支持通用型礼包码,即单个礼包码可由大量玩家兑换,并可设定兑换数量
- 支持生成唯一兑换码,即单个礼包码仅可由单个玩家兑换,兑换后立刻失效
- 随时查询某兑换码是否处于生效状态,如已被兑换需查询何人何时兑换
- 随时查询某玩家已经兑换过的礼包
HashIds原理和使用
hashids的原理是将一个int数组转换为使用指定字符的字符串,并可混淆密码。如图所示:
由此,我们可以将礼包码和计数值放入数组,由Hashids生成兑换码,并在兑换时解析出礼包码和计数值,用于兑换。
具体步骤如下:
- 新建礼包,填好礼包的各项属性,入库,得到礼包的数据库id:1
- for循环遍历指定次数,将礼包id和遍历的计数值放入数组,并以此通过Hashids生成兑换码
- 更新礼包中的可兑换数量generatedCount,表示已经为这个礼包生成了generatedCount个兑换码
- 将生成的兑换码返回至运营后台
- 运营后台可随时继续生成兑换码,实际只是将遍历的初始计数值调整为generatedCount即可。
- 运营后台可随时查看已生成的兑换码,实际只需重新调用一次生成逻辑但不更新可兑换数量即可。
在玩家使用某个兑换码进行兑换时:
- 将该礼包码进行解码,如果无法解码出含有2个元素的int数组,该兑换码即为无效兑换码
- 查询解码出的礼包id,查库(建议缓存在内存中)得到该礼包信息,校验上下架/可兑换时间/自定义限制等。
- 使用解码出的计数值,对比礼包的可兑换数量,如已超过也无效
- 直接使用用