前文
截至2019年末,全国银行卡在用发卡数量84.19亿张,全国人均持有银行卡6.03张。 人均持有信用卡和借贷合一卡0.53张。2019年,全国共发生银行卡交易3219.89亿笔,金额886.39万亿元,同比分别增长53.07%和2.82%。2019年,银行共处理电子支付业务2233.88亿笔,金额2607.04万亿元。2019年,非银行支付机构发生网络支付业务7199.98亿笔,金额249.88万亿元,同比分别增长35.69%和20.10%。
由上可见,银行卡在全国基本已普及,电子支付已经成为主流,企业和银行卡打交道在所难免,因此笔者整理了关于银行卡校验方面的知识。
本文,将从三个方面介绍:
银行卡号规范
银行卡准确性校验
使用接口校验银行卡准确性
银行卡号规范
银行卡号由13~19位数字组成,分为三个部分:
1.发行者识别号码(Issuer Identification Number,缩写为IIN,也称BIN)。
2002年,中国银联代国内各发卡机构统一向ISO(国际标准化组织)申请了800个在国内和国外通行的国际标准BIN(622126至622925)。其中第一位主要行业标识符,(Major industry identifier,缩写为MII),有以下类别(此类别的):
0 - ISO/TC 68和其他行业分配
1 - 航空业
2 - 航空业,金融业和其他未来行业分配
3- 旅游业和娱乐业
4 - 银行业和金融业
5 - 银行业和金融业
6 - 商业和银行业/金融业
7 - 石油业和其他未来行业分配
8 - 医疗业,电信业和其他未来行业分配
9 - 由各国标准团体分配
2.自定义卡:
IIN号码之后是6~12位的自定义卡号序列,表示个人账户号码。 每个银行的个人账号标识规则有所不同。有的银行在这部分内容中会包含分行、支行、储蓄网点等代码信息。有得银行可能就没有这么详细,会使用自然流水顺序码。
3.校验码:
校验码是在确定了IIN码和自定义卡号之后,根据Luhn算法生成的一位数字。正因为有了校验码,我们可以根据Luhn算法来校验银行卡号的一般正确性。
如,19位的银联卡其中1-6位代表发卡行,7-10位代表发卡地区,第11位代表卡种类,第12-18位为发卡顺序号,第19位为校验位.
另外, 发行者识别号码一般由6位数字组成,但2014年底,国际标准组织(ISO)已经将IIN由6位数字调整到8位数字。目前国内银联卡,因银行众多,特别是村镇银行的存在,BIN长度以6位占绝大部分,另外还存在7、8、9、10等位数卡IIN。 另外一种即早期以9开头的银行卡,这些卡都是国内自行分配的,仅限国内使用,无法与国际进行接轨。
虽然银行卡长度、规则不统一,但是其校验基本都可使用Luhn算法(除了早期发行的一部分银行卡外)。
银行卡准确性校验-Luhn算法
首先,在校验前,需要取出银行卡号,去掉最后一位校验位数字。然后
第一步:从右边第1个数字开始每隔一位乘以2;
第二步: 把在第一步中获得的乘积的各位数字相加,然后再与原号码中未乘2的各位数字相加;
第三步:对于第二步求和值加上校验位,余10,结果为0则校验通过。
举例:
6259 6508 7177 2098
第一步:6*2=12,5*2=10,6*2=12,0*2=0,7*2=14,7*2=14,2*2=4,9*2=18
第二步:1+2 + 1+0 + 1+2 + 0 + 1+4 + 1+4 + 4 + 1+8 = 30
30 + 2+9+5+8+1+7+0 = 62
第三步:(62+8)%10=0
校验通过。
使用接口校验银行卡准确性
只要是银联卡,我们都可以通过银联接口来校验其准确性,并查询银行卡相关信息。另外,也可以通过其他平台提供的接口来校验。
银联银行卡信息验证
接口地址(银联提供):https://open.unionpay.com/tjweb/api/detail?apiSvcId=21
服务对象:需使用网络可信身份服务的信息主体
产品详情:
支持带全球范围带银联LOGO的银行卡(含国内全国性商业银行、股份制银行、区域性城商行、农信社、村镇银行等)验证
银行卡信息验证支持5种模式:
1.银行卡2要素(银行卡+姓名)认证:商户上传所要验证银行卡和银行卡持有人姓名信息,平台返回校验一致性信息;
2.银行卡2要素(银行卡+证件号)认证:商户上传所要验证银行卡和银行卡持有人身份证信息,平台返回校验一致性信息;
3.银行卡3要素(银行卡+姓名+证件号)认证:商户上传所要验证银行卡、银行卡持有人身份证和姓名信息,平台返回校验一致性信息
4.银行卡4要素(银行卡+姓名+证件号+手机号)认证:商户上传所要验证银行卡、银行卡持有人身份证、姓名、手机号信息,平台返回校验一致性信息;
5.银行卡6要素(银行卡+姓名+证件号+手机号+有效期+CVN2)认证:对于信用卡类型,综合数据服务平台提供银行卡持有人卡号、姓名、证件号、手机号、有效期、CVN2信息的6要素验证。
由上,可以看出,银联接口支持五种方式的校验,最后一种主要用于信用卡。
中国各大银行银行卡号查询:
接口地址(支付宝提供):https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?cardNo=yourcardNo&cardBinCheck=true
返回参数:{"bank":"GDB","validated":true,"cardType":"DC","key":"","messages":[],"stat":"ok"}
描述:所属行:bank ,是否正确有效:validated 类型:cardType 状态:stat
此接口为支付宝提供的,可以有效验证银行卡的准确性,同时还可以返回对应的所属银行名称。
银行代码与名称对照表:https://github.com/digglife/cnbankcard/blob/master/bankname.json
同时,支付宝还提供通过银行代码,来查询银行logo的api:https://apimg.alipay.com/combo.png?d=cashier&t=银行代码
总结
可以得知,银行卡号是具有一定的规范的,如果对信息准确性要求不高,只是简单校验卡号是否输入错误,可通过Luhn算法来校验。但如果涉及到用户信息的获取,则应该额外使用接口来验证银行卡准确性。
另外,对于用户重要隐私信息,如银行卡密码,信用卡的CVN2、有效期,通常不建议存储,数据传输中,也需要做加密传输。
欢迎关注作者其他写作平台,获取更及时的更新:
公众号:pmhuiyilu
个人网站:PM回忆录 | 专注产品思维/能力框架
网友评论