电商订单编号生成规则(订单编号怎么生成)
在实际业务流程中,单号是订单的唯一识别码。提供订单号非常方便业务人员快速定位订单信息,帮助用户。
我们日常在电商平台购买商品时,经常需要去平台客服反馈订单过程中遇到的问题。一般这时候平台客户会让用户填写订单号,让客服快速锁定订单信息,给用户信息问题的解答和处理。
当我们在第三方平台购买某店的线下优惠券时,工作人员需要对我们提供的优惠券进行核销。一般来说,核销的依据是订单号。
所以在公司内部进行业务操作的时候,比如通知仓库根据订单发货,内部沟通一个订单信息的时候,也会根据订单号直接沟通信息。
业务中订单号的使用一般是基于唯一性的要求,所以订单号的设计需要遵循几个原则:
因为我们在业务中对订单号有独特的要求,所以订单号的生成必须遵循不重复的特性。实际上,在底层生成订单号时,业务流程非常繁重,订单号的生成规则一般是固定的,可能会导致多个线程同时读取相同的生成参数,导致生成的订单号相同(当然这是开发者要注意的问题)。
其次,业务的长期积累可能导致新生成的订单号与过去的订单号重复。因此,在设计订单号时必须充分考虑不可重复性原则(订单号设计中的变量将在后面详细讨论)。
号码不能泄露公司运营情况,如日常销售额、公司序列号等信息,以及业务信息、用户手机号、身份证等隐私信息。而且不能有明显的整体规则(可以有局部规则)。你可以通过任意修改一个字符来查询另一个订单信息,这也是不允许的。
为方便操作,要求订单号位数适中,局部有规律。这样可以方便订单异常或退货时的客服查询。
订单号过长或可读性差,会导致客服输入困难,易错率高,影响用户的售后体验。所以在实际的业务场景中,订单号的设计通常会携带一些允许公开的、对使用场景有帮助的信息,比如时间、星期、类型等。主要是根据所涉及的号码对应的使用场景。
而且时间、周等自增元素是订单号设计的一部分,有助于解决业务堆积导致的重复订单号问题。
在遵循涉入原则的基础上,我们经常使用一些变量来设计数字,这也是为了满足订单号部分可读性带来的业务优势。通常,有以下几类:
比如20220525105959,这种类型的年、月、日、分、秒,在编号中使用这个变量,会将重复的可能性降低到一秒内不重复。
常用的时间变量有很多变体,比如取年份的后两位数,比如20220525,保留到当天。通常快递取件码的设计中会用到月、日、周等其他元素的设计。这是为了方便取件码可以快速重复使用,因为快递取件码的有效期一般不超过一个月,会被退回然后销毁。
时间戳是一个10位数的数字,表示当前时间从1970年1月1日午夜UTC/GMT开始算起经过的秒数。它也经常被用来表示时间。时间戳也可以精确到毫秒,形成13位数字。
如订单类型、售后类型、商品类型、付款类型等。不同的类型可以用不同的参数进行。通常支付类型的应用场景是线上支付和线下支付共用一套业务后台,为了方便起见会增加这个参数来区分线上支付和线下支付。
类比包括商店代码、付款机代码、操作员代码
对于一些涉及用户的编号规则,用户ID可以作为一个变量来设计。比如淘宝的订单号最后几位使用的是用户ID,但是需要注意的是不能使用完整的用户ID,有些规则需要设计和重用。
在电子商务系统中,脱敏的商家ID也可以作为变量设计到编号规则中。
使用用户手机号码中的部分数字作为号码中的变量;设计重复程度高的订单号时,比如手机号的零件号,切记不能有单个变量,否则很容易造成订单号重复。
如果是多终端多平台系统,可以考虑在编号中把平台作为一个变量。比如小程序平台用01,安卓app用01,PC版用03,第三方平台用04类型。
根据业务场景,一些业务属性信息也可以设计成变量。
是随机数系统按照程序按照一定规则随机生成的字符。可以是数字,也可以是字符串,一般可以用来减少重复;订单生成中经常用到随机数,往往前几个是一些显式的正则数,比如订单生成的时间,然后加四个随机数就形成了订单编号。所以,读者在设计订单号时,如果不知道如何加密,可以简单地插入几个随机数。
代表顺序的数字,如10,11,12。
一般放在末尾,根据前面的字符按照一定的规则计算出最后的数字,通常是一位数字,主要目的是提高编号的安全性;身份证的最后一位是校验位,它的计算原理也是通过之前的数字加密算法计算出来的。感兴趣的读者可以了解一下身份证的生成规则。
对于带有区域性质的编号规则,可以将区域作为一个变量来考虑,如区域分公司、线下自动售货机等。
每一条数据输入系统时,通常都有一个唯一的ID,也可以作为数字的变量。
唯一标识码是软件构造的一个标准,也是分布式计算环境领域开放软件基础的一部分。其目的是使分布式系统中的所有元素,
都能有唯⼀的辨识信息,⽽不需要通过中央控制端来做辨识信息的指定。通过以上4种策略可以保证惟⼀性。在系统中需要⽤到随机数的地⽅都可以考虑采⽤UUID算法。但是呢直接使用这个作为单号。虽然具有唯一性,安全性,但是却没有任何的可读性而言。因此在这种情况下,UUID只是能作为系统中间的标识码,可以在业务中数据流转的时候配合订单号使用,绝不可直接给予客户和业务人员使用。
对于一些编号需求不是很大的场景,如果可读性也没什么场景的要求,可以简单的使用时间戳和随机数进行拼接作为编号规则使用;如时间戳1635302466 随机数2313,则编号为16353024662313。
一共19位数,前面13位数为根据时间戳和内部定义序列,后面6位数为跟购买者ID相关的用户位。
日期 时分秒 随机数。
时间:取时间的年份后2位 月份 日期形成如211027。
时间戳:取时间戳的后6位数
用户:取用户ID的后5位数,序列位2位数随机。
下单渠道1位 支付渠道1位 业务类型1位 时间信息4位 下单时间的Unix时间戳后8位(加上随机码随机后的数字) 用户userid后4位共19位并不一定需要把19位全加上。
系统预先生成不重复的编号,业务系统要使用时候按顺序取数即可。这种编号一般系统拥有一套成熟的加密规则,不属于常规的订单生成规则,一般用于加密程度较高的业务。
题图来自 Unsplash,基于CC0协议。