银行卡规范和校验

截至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%。

由上可见,银行卡在全国基本已普及,电子支付已经成为主流,企业和银行卡打交道在所难免,因此笔者整理了关于银行卡校验方面的知识。

本文,将从三个方面介绍银行卡规范和校验:

  • 银行卡号规范
  • 银行卡准确性校验-Luhn算法
  • 使用接口校验银行卡准确性

银行卡号规范

银行卡号由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.自定义卡号。

BIN号码之后是6~12位的自定义卡号序列,表示个人账户号码。每个银行的个人账号标识规则有所不同。有的银行在这部分内容中会包含分行、支行、储蓄网点等代码信息。有得银行可能就没有这么详细,会使用自然流水顺序码。

3.校验码。

校验码是在确定了BIN码和自定义卡号之后,根据Luhn算法生成的一位数字。正因为有了校验码,我们可以根据Luhn算法来校验银行卡号的一般正确性。

下面,举个例子来说明一下三部分构成:
如,19位的银联卡其中1-6位代表发卡行,7-10位代表发卡地区,第11位代表卡种类,第12-18位为发卡顺序号,第19位为校验位。

另外,2014年底,国际标准组织(ISO)已经将IIN由6位数字调整到8位数字。目前国内银联卡,因银行众多,特别是村镇银行的存在,BIN长度以6位占绝大部分,另外还存在7、8、9、10等位数卡BIN。

还有一种早期以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、有效期,通常不建议存储,在数据传输中,也需要做加密传输。