无存储式优惠券编码方案

您所在的位置:网站首页 nayosmart优惠码 无存储式优惠券编码方案

无存储式优惠券编码方案

2023-06-05 13:05| 来源: 网络整理| 查看: 265

代码

代码仓库:地址

代码分支:master

博客:地址

简介

优惠券是常见的营销工具,每逢佳节必有促销活动,有活动就会有优惠券。线下活动通常限量提供优惠券,因此不需要特殊设计,但是互联网环境下,线上活动开展频繁,而且线上活动用户体量要比线下活动大很多,通常以万为单位进行发放,因此需要优化优惠券存储,降低空间成本(互联网活动通常采用广撒网的方式)。这里需要特别注意本文针对的优惠券需求,有以下几个特殊点:

预先生成,在活动正式开始前生成优惠券(生成指的是需要预先知道优惠券活动Id、优惠券面值、优惠券序号,例如活动id为1,面值100,满1000减100,优惠券序号1~1,000,000)优惠券体量大,以万为单位,通常在10万级别以上

在互联网电商中的优惠券通常不需要预先生成,只需要在用户领取时分配优惠券信息即可,在线下和线上结合使用场景中,预生成方式很实用,在预生成的模式下,如果全量存储优惠券将浪费大量空间,因为优惠券不会100%被使用(瓶装饮料经常会出现输入优惠编码兑换奖品活动)。

需求

线上线下营销需要优惠券功能来支撑,传统的方式是生成优惠券方案,提供以下内容:

活动id活动名称优惠券面值优惠券使用条件发放条件发放数量

创建优惠券方案后不会立即生成优惠券,只有当用户领取的时候才会生成用户优惠券记录,这是主流方案,可以避免生成大量优惠券记录,浪费存储空间,但是没办法满足需要预生成的要求。我们需要设置一套优惠券编码方案,既可以满足预生成要求,同时要避免浪费存储空间。

设计思路

预生成的优惠券号通常是一段无规则的字符串,类似于:yuIkJGGS,用户输入优惠编号领取对应的优惠券,yuIkJGGS经过解析可以得到活动id信息,

通过上述分析可以知道,优惠券通过活动id就可以知道优惠券详细信息,为了防止重复使用,我们可以为每一张优惠券设置一个唯一编号,同时为了验证优惠券的有效性,需要添加校验码信息,因此一个优惠券通常有以下字段组成:

活动id优惠券编号校验码

我们可以设置一个功能函数:H活动Id,优惠券编号) => code,输入活动Id、优惠券编号参数,输出code,我们将code设置为校验码,H可以是md5、sha256等一系列单项函数。

得到活动Id、优惠券编号、校验码之后我们通过对其进行编码得到优惠券号信息,我们假设编码函数为E,那么转换函数可以写成如下形式:

E(活动Id、优惠券编号, H(活动Id、优惠券编号)) => yuIkJGGS 假设输出是yuIkJGGS

那么我们只需要设计实现H、E两个函数即可。

H函数分析

H可以理解为一个签名函数,我们使用这个函数生成的code来鉴别真伪,方式他人仿照,那么这里有很多种实现方案,例如,我们可以参照区块链签名方案(注意这里指示为了讲解方便,本文不是按照这个方式实现)。

secp256k1(keccak256(活动Id + 优惠券编码), privateKey) => 签名数据

签名数据长度不满足要求,我们可以截取前[n, n+m]位(bit)作为校验码,

本文使用13bit来表示检验码,计算方式如下所示

前6位表示(活动Id + 优惠编码)组成数字中的二进制中1的个数,例如,活动id为2,二进制为10,优惠编码是5,二进制为101,那么(活动Id + 优惠编码)二进制是10101,1的个数为3后7位表示活动Id+优惠编码组成的数字进行取模运算,具体看代码

伪代码如下所示:

/// couponSchemeId表示活动id, redeemSerialNum表示优惠券序号 /// COUPON_ID_BIT_LEN 表示活动Id二进制位数 redeemSerialNum = redeemSerialNum REMAINDER_BIT_LEN; /// 获取 优惠券编号 + 活动Id数值信息 long r = redeemNum >> CHECK_SUM_BIT_LEN; /// 校验前6位信息是否一致 if (numOfOne(r) == n) { /// 校验后7位数值是否一致 if (r % DIVISOR == checkSum) { return Boolean.TRUE; } } } return Boolean.FALSE; }

至此完成了无存储式优惠券编码方案

总结

主要实现了如下功能:

选取字符空间设置活动Id、优惠券编号、校验码结构(二进制位数以及二进制内容组建方式)将10进制转化为N进制(本文N表示60)将转化后的N进制映射到字符空间中,然后转化为字符串输出设计校验函数解码函数 联系方式

技术更新换代速度很快,我们无法在有限时间掌握全部知识,但我们可以在他人的基础上进行快速学习,学习也是枯燥无味的,加入我们学习牛人经验:

点击:加群讨论 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3