银联银行卡号校验

这个话题还是很有意思的,银行卡号有点类似于身份证号的设计。

银行卡的卡号长度及结构符合ISO 7812-1 有关规定,由13-19位数字表示,具体由以下几部分组成:

发卡行标识代码 自定义位 校验位
XXXXX X……X X

其中校验位是通过一个名为Luhn的校验算法得出的。

然而实际上一些商业银行不遵守这个规范,所以导致Luhn设计被废弃了,具体可以见这个Github Issue的讨论。

现在更推荐使用一些开放平台提供的API接口来实现,比如支付宝开放平台以及中国银联开放平台

中国银联开放平台有准入门槛,需要先申请,如果只是做银行卡是否有效的验证,不校验对应所有人身份信息的话可以直接用支付宝提供的接口。

接口请求示例:

1
curl "https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo=银行卡卡号&cardBinCheck=true"

比如我们请求:

1
curl https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo=6214832018989180&cardBinCheck=true

我们可以拿到请求结果为:

1
2
3
4
5
6
7
8
{
cardType: "DC",
bank: "CMB",
key: "6214832018989180",
messages: [ ],
validated: true,
stat: "ok"
}

这里需要注意的是支付宝开放平台-文档中心:银行简码——混合渠道这篇文章是2015年所写的,一直也没有更新,只是个局部参考,如果真的要相对稳定的接口,还是建议使用中国银联开放平台。

注:

  1. 支付宝开放平台-文档中心:银行简码——混合渠道这篇文章是2015年所写的,一直也没有更新,只是个局部参考,如果真的要相对稳定的接口,还是建议使用中国银联开放平台;
  2. 支付宝的这个接口其实也支持其他卡组织的卡号校验(境外卡号我没有试过);

本文参考: