編輯導語:訂單号、支付流水号、售後訂單号、快遞取貨号、電子券核銷碼等,這些都是我們日常在生活中進行會遇見和使用的一些單号,那麼為什麼有些單号那麼長,有些隻有幾位數?有些單号一看就知道年月日的信息,有些卻看不出任何意義?為什麼我淘寶訂單的後幾位數都是一樣的?今天就來帶大家看一下訂單号的是怎樣生成的。
一、訂單編号作為唯一标識碼在業務中的應用場景
單号在實際的業務過程中是做為一個訂單的唯一标識碼的存在,提供訂單号就很方便業務人員快速定位訂單信息,給予用戶幫助。
1. 用戶訂單遇到問題,需要找客服進行協助
我們日常在電商平台上面購買商品的時候,很多時候需要去向平台客服反饋在訂單過程中遇到的問題,一般這個時候平台客戶都是要求用戶填寫訂單編号的,這樣客服可以快遞鎖定訂單信息,給用戶信息問題的解答和處理。
2. 對訂單進行操作,如線下收款,訂單核銷
我們在第三方平台上購買了某一個店鋪的線下優惠券的時候,工作人員需要對我們提供的優惠券進行核銷,核銷的依據一般來說就是訂單編号。
而在某些場景涉及到的線下收款,也會根據訂單号來進行訂單的确認和收款,不過日常在業務過程中将一般都将訂單号生成二維碼,再由工作人員掃碼進行操作,因此用戶在線下對于訂單号的感知并不是很強烈。
3. 内部進行訂單的處理或者跟進
從技術的層面去講,很多時候搜索訂單相關信息的時候都是以訂單ID作為唯一标識符,這是由于訂單号的生成規則的唯一性決定的(後面講訂單号生成規則會講到)。
由此公司内部在進行業務操作處理時候,比如對通知倉庫按單發貨,内部交流某個訂單信息時候,也會直接根據訂單号來進行信息傳達。
二、編号規則的設計原則訂單号的在業務中的使用一般都是基于唯一性的需求,因此在訂單号的設計上需要遵循幾個原則:
1. 不得重複
由于我們在業務中對于訂單編号的要求是唯一的,所以訂單編号生成的時候一定要遵循不可重複這一特性,而實際在底層生成訂單編号的時候由于業務流水很大,處于一個高并發的狀态,并且訂單号的生成規則一般是固定的,所以可能會造成在同一時間多個線程讀取的生成參數相同,從而造成生成的訂單号相同(當然這是開發人員應該注意的問題)。
其次就是業務的長時間積累可能導緻新生成的訂單号會與過去很久的訂單号産生重複,所以在設計訂單号的時候一定要充分考慮到不可重複性的原則(後面講到訂單号設計中的變量部分會詳細講到)。
2. 安全性
編号不能透露公司的運營情況,比如日銷、公司流水号等信息,以及商業信息和用戶手機号,身份證等隐私信息。并且不能有明顯的整體規律(可以有局部規律),任意修改一個字符就能查詢到另一個訂單信息,這也是不允許的。
類比于我們高考時候的考生編号的生成規則,一定不能是連号的,否則隻需要根據順序往下查詢就能搜索到别的考生的成績,這是絕對不可允許。
3. 具備一定的可讀性
位數要便于操作,因此要求訂單号的位數适中,且局部有規律。這樣可以方便在訂單異常,或者退貨時客服查詢。
過長的訂單号或易讀性差的訂單号會導緻客服輸入困難且易錯率較高,影響用戶體驗的售後體驗。因此在實際的業務場景中,訂單号的設計通常都會适當攜帶一些允許公開的對使用場景有幫助的信息,如時間,星期,類型等等,這個主要根據所涉及的編号對應的使用場景來。
而且像時間、星期這些自增長的屬于作為訂單号的設計的一部分元素,有助于解決業務累積而導緻的訂單号重複的問題。
三、編号設計中的常用變量在遵循涉及原則的基礎上,我們常會使用一些變量來進行編号的設計,這也是為了滿足訂單編号的局部可讀性帶來的業務優勢,通常會有以下幾類:
1. 時間
如20220525105959這種類型的年月日時分秒,編号中使用這個變量就把重複的可能性降低到一秒内的不重複。
常用的時間變量還有很多變種類型,如取年份的後2位數、如20220525隻保留到天。通常在快遞取件碼的設計中會使用月、日、周等 其他元素的設計,這是為了方便取件碼可以快速重複使用,因為快遞取件碼通常有效期不會超過一個月就會原路退貨然後被銷毀。
2. 時間戳
時間戳是一個10位數的數字,代表的是當前時間距離1970年1月1日UTC/GMT的午夜)開始所經過的秒數。也是經常用來代表時間的一種方式,時間戳也可以精确到毫秒,形成一個13位數的數字。
3. 類型
如訂單類型、售後類型、商品類型、支付類型等等,不同類型的可以使用不同參數進行。通常支付類型的應用場景是,線上支付和線下支付共用一套業務後台,所以為了方便區分會加入支付類型這個參數用于區分線上線下。
類比還有店鋪代碼、支付的機器代碼、操作員代碼等等。
4. 用戶ID
對一些涉及到用戶的編号規則時候,可以使用到用戶ID作為變量來進行設計,如淘寶的訂單号中最後幾位數就使用了用戶ID,不過要注意不能使用完整的用戶ID,需要進行一些規則的設計再使用。
5. 商家ID
對電商系統中,可以把商家ID脫敏後也作為一個變量設計到編号規則中。
6. 手機号
使用用戶的手機号中的某些位數作為編号中的一個變量;使用類似于手機号部分号碼這種重複度較高的屬性設計訂單編号的時候,切記不能隻有一個變量,否則很容易出現訂單編号重複。
7. 平台形态
如果是多終端多平台的系統,那麼可以考慮在編号中把平台作為一個變量考慮進去。如小程序平台用01,安卓app使用01,PC版本使用03,第三方平台04類型這樣的規則。
8. 其他業務屬性
可以根據業務場景,把一些業務屬性的信息也作為變量設計進去。
9. 随機數
随機數就是系統根據程序在一定規則内随機生成的字符,可以為數字也可以是字符串,一般可以用來降低重複;随機數在訂單生成中的使用頻率非常高,常常是前面幾位都是一些顯式的規律性數字,比如訂單生成的時分秒,然後最後加上四位随機數從而組成訂單号。所以讀者在設計訂單編号的時候,如果不知道如何加密,就可以簡單的插入幾位随機數即可。
10. 序列位
代表順序的數字,如10,11,12這樣的。
11. 驗證位
一般放在最後,根據前面的多位字符按照一定的規則計算最後得到的一個數字,一般為1位,主要目的是提高編号的安全性;身份證的最後一位就是校驗位,其計算原理也是通過前面幾位數字加密算法算出來的,感興趣的讀者可以去了解一下身份證的生成規則。
12. 地區信息
對有區域性質的編号規則裡面可以考慮把區域作為變量考慮進去,如某地區分店、某地區線下的售貨機等。
13. 數據庫數據的自增ID
每條數據錄入系統時候,一般情況都有一個唯一的ID,這個ID也可以作為編号的一種變量進行使用。
四、編号實踐方案分享1. UUID
通⽤唯⼀識别碼,是⼀種軟件建構的标準,亦為開放軟件基⾦會組織在分布式計算環境領域的⼀部分。其⽬的是讓分布式系統中的所有元素,都能有唯⼀的辨識信息,⽽不需要通過中央控制端來做辨識信息的指定。
- 1~8位采⽤系統時間,在系統時間上精确到毫秒級保證時間上的惟⼀性。
- 9~16位采⽤底層的IP地址,在服務器集群中的惟⼀性。
- 17~24位采⽤當前對象的HashCode值,在⼀個内部對象上的惟⼀性。
- 25~32位采⽤調⽤⽅法的⼀個随機數,在⼀個對象内的毫秒級的惟⼀性。
通過以上4種策略可以保證惟⼀性。在系統中需要⽤到随機數的地⽅都可以考慮采⽤UUID算法。但是呢直接使用這個作為單号。雖然具有唯一性,安全性,但是卻沒有任何的可讀性而言。因此在這種情況下,UUID隻是能作為系統中間的标識碼,可以在業務中數據流轉的時候配合訂單号使用,絕不可直接給予客戶和業務人員使用。
2. 時間戳 随機數
對于一些編号需求不是很大的場景,如果可讀性也沒什麼場景的要求,可以簡單的使用時間戳和随機數進行拼接作為編号規則使用;如時間戳1635302466 随機數2313,則編号為16353024662313。
3. 淘寶訂單号的生成規則
一共19位數,前面13位數為根據時間戳和内部定義序列,後面6位數為跟購買者ID相關的用戶位。
4. 有贊商家端的訂單号
日期 時分秒 随機數。
5. 時間 時間戳 用戶 序列位
時間:取時間的年份後2位 月份 日期形成如211027。
時間戳:取時間戳的後6位數
用戶:取用戶ID的後5位數,序列位2位數随機。
6. 綜合各種變量
下單渠道1位 支付渠道1位 業務類型1位 時間信息4位 下單時間的Unix時間戳後8位(加上随機碼随機後的數字) 用戶userid後4位共19位并不一定需要把19位全加上。
7. 預先生成
系統預先生成不重複的編号,業務系統要使用時候按順序取數即可。這種編号一般系統擁有一套成熟的加密規則,不屬于常規的訂單生成規則,一般用于加密程度較高的業務。
本文由 @賣幹貨的産品小謝 原創發布于人人都是産品經理,未經許可,禁止轉載。
題圖來自 Unsplash,基于CC0協議。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!