在進行互聯網產品設計時,尤其是互聯網金融產品,實名認證是很重要的環節。今天和大家聊聊一個很容易被忽視的話題:身份證號碼的編制規則,以及在產品中的應用。
一、編碼格式
1999年我國頒發了第二代居民身份證號,公民身份號碼為18位,且終身不變,一代居民身份證編號是15位,已經基本淘汰,本文不作討論。
居民身份證格式如:ABCDEFYYYYMMDDXXXR
?地址碼(ABCDEF):表示登記戶口時所在地的行政區劃代碼(省、市、縣),如果行政區劃進行了重新劃分,同一個地方進行戶口登記的可能存在地址碼不一致的情況。行政區劃代碼按GB/T2260的規定執行。
?出生日期碼(YYYYMMDD):表示該居民的出生年月日,年4位數字,月和日分別用2位數字表示,如19491001,;出生日期碼是按GB/T 7408的規定執行的。
?順序碼(XXX):表示同一地址碼區域內,同年、同月、同日生的人所編訂的順序號,根據自己身份證的順序碼就可以知道:與我們同年同月同日生的同性至少有多少個,且在我們之前登記戶籍的有多少人。身份證順序碼的奇數分配給男性,偶數分配給女性。這就是為什么倒數第二位奇數表示男生,偶數表示女生。
?校驗碼(R):R之前的17位被稱為本體碼,R是根據本體碼,按照校驗碼算法(ISO 7064:1983,MOD 11-2校)計算出來的。當我們輸入身份號碼進行實名認證的時候,根據校驗碼算法可以初步判斷你輸入身份證號碼格式是否正確。
其中999、998、997、996是分配給百歲老人的,大家可以思考一個問題,極端情況下如果同一行政代碼區域內,同一天出生的人數超過1000人順序碼該怎么編制?
二、校驗碼算法
將本體碼各位數字乘以對應加權因子并求和,除以11得到余數,根據余數通過校驗碼對照表查得校驗碼。
加權因子:
校驗碼表:
舉例:
某公民的身份證號碼是34052419800101001X
第一步:本體碼乘以加權因子:
3*7+4*9+0*10+……0*4+1*2=189
第二步:計算求和后除以11的余數
189%11=2
第三步:在檢驗碼中查詢余數對應的檢驗碼
2所對應的校驗碼是X,注意X必須大寫
大家可以根據此算法驗證自己的身份證號碼。
三、編碼規則的應用
當我們設計產品的實名認證的環節時,就是根據身份證號碼的編碼規則,來驗證用戶輸入的身份證號格式的有效性。可驗證的信息如下:
基礎信息驗證:
1. 驗證身份證號碼長度是否為18位
2. 根據校驗碼算法判斷用戶輸入的身份證號碼內容是否有誤,避免用戶輸入錯誤,也可以判斷用戶是否為胡亂填寫
3.身份證號碼最后一位校驗碼如果是X,必須大寫
4. 獲取用戶的出生日期,判斷用戶是否滿18歲(經常被忽視)
只有以上信息驗證通過時,才有進一步驗證實名認證信息真實性的必要。因為調用一次實名接口不管成功失敗與否都是需要付費的,不同服務商價格不同,一般每調用一次需要2-5元不等。既保證了用戶體驗又為公司節省了成本。
另外,還可以選擇性獲得以下信息:
1. 根據地址碼獲取用戶的戶籍所在地信息
2. 判斷用戶的性別,順序碼奇數為男性,偶數為女性
作者簡介:本人為互聯網金融公司產品經理一枚,先后負責了公司第三方支付資金存管系統對接和銀行資金存管系統的對接。接下來我將更新【金融支付】系列文章,分享自己的項目經歷,希望能給大家帶來價值。
歡迎關注我的個人公眾號:威理(ID:weili201608) 交流互聯網金融支付產品設計。