金融支付:身份证号码的编码规则
在进行互联网产品设计时,尤其是互联网金融产品,实名认证是很重要的环节。今天和大家聊聊一个很容易被忽视的话题:身份证号码的编制规则,以及在产品中的应用。
一、编码格式
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) 交流互联网金融支付产品设计。