转载:https://blog.csdn.net/wmlml/article/details/54345413

一、银行卡结构

XXXXXX XXXXXXXXXXXX X

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

根据ISO标准,银行卡长度一般在13-19位,国际上也有12位的。银联标准卡卡长度一般是在16-19位,双组织卡也有13-19位的。

二、发卡行标识代码

发卡行标识代码Bank Identification Number(BIN),又叫发卡机构标识代码Issuer Identification Numbers(IIN)。一般由6位数字组成,2014年底,国际标准组织(ISO)已经将BIN由6位数字调整到8位数字。目前国内银联卡,因银行众多,特别是村镇银行的存在,BIN长度以6位占绝大部分,另外还存在7、8、9、10等位数卡BIN。

发卡行标识代码第一位,为发卡行业标识号Major Industry Identifier(MII),代表的是发卡机构所处行业。具体分配规则如下:

目前银联标准卡以62开头,各银行再向银联进行卡BIN申请,如622848开头的卡为农行借记卡。我们发现,银联卡不都是以62开头,主要有2种情况。第一种是双组织卡,如银联、运通双组织卡,一般以信用卡居多,如招行与运通合作的运通卡。另外一种即早期以9开头的银行卡,这些卡都是国内自行分配的,仅限国内使用,无法与国际进行接轨。以下为部分常见卡组织发行的银行卡起始数字:

银联卡,通过卡BIN能获取到的信息不仅仅是发卡行,还能确定该卡卡种、卡名称、卡号长度等信息。以下为部分卡BIN信息列举:

【国内银行卡BIN号速查简表】(资料详见:http://wenku.baidu.com/view/1d93ebeb856a561252d36fb3.html)

因此,只要能获取到比较全面的卡BIN数据,就能判断出银行卡发卡行及卡种。目前支付宝、微信等大部分主流需要绑卡的应用都是如此实现。

三、自定义位

发卡行自定义位,一般在6-12位。 
中间位数由发卡行自定义,一般由6-12位数字组成。最多可以使用12位数字。

每个银行的个人账号标识规则有所不同。有的银行在这部分内容中会包含分行、支行、储蓄网点等代码信息。有得银行可能就没有这么详细,会使用自然流水顺序码

四、校验码算法

校验码为银行卡号最后一位,采用LUHN算法,亦称模10算法。计算方法如下:

第一步:从右边第1个数字开始每隔一位乘以2;

第二步: 把在第一步中获得的乘积的各位数字相加,然后再与原号码中未乘2的各位数字相加;

第三步:对于第二步求和值中个位数求10的补数,如果个位数为0则该校验码为0。

举例:

6259 6508 7177 209(不含校验码的银行卡号)

第一步: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

第三步:10-2=8

所以,校验码是8,完整的卡号应该是6259650871772098。

目前银联卡几乎都支持校验码算法,但是也不排除极个别不支持此算法的,如杭州银行早期发行的西湖卡。

注:本文摘录于不同地方,并经实践整理所得,望交流。

五、Luhn算法实现

按照ISO 2894中支付卡校验位的算法 The Luhn Mod-10 Method 规定:

1、对卡号上的每位数字乘以权重。其规则是,如果卡号数字个数是偶数,则第一位乘以2,否则就乘以1,然后以后分别是,1,2,1,2,1,2;
2、如果每位数字乘以权重后超过9 ,则需要减去 9;
3、将所有的处理过的加权数字求和,用 数字 10 求模运算;
4、余数应该是0,否则可能是输入错误。也可能是一个假号。
 顺手PHP简单实现下,

 function is_luhn_valid_card($input)
{$input = strrev($input);$crop = preg_replace('/\\D+/', '', $input);if ($crop == '' || $crop !== $input) {return false;}$total = 0;for ($i = 0, $n = strlen($input); $i < $n; $i++) {$total += $i % 2 ? 2 * $input[$i] - ($input[$i] > 4 ? 9 : 0) : $input[$i];}return !($total % 10);
}

实际场景前端验证好一些,例如JS。

function is_luhn_valid_card(input)
{input = (input + '').reverse();crop = input.replace(/\D+/g, '');if ($crop == '' || $crop !== $input) {return false;}var total = 0, i;for (i = 0; i < input.length; i++) {input[i] = parseInt(input[i]);total += i % 2 ? 2 * input[i] - (input[i] > 4 ? 9 : 0) : input[i];}return (total % 10) == 0;
}

银行卡编码规则及检验算法详解相关推荐

  1. 贪心算法哈夫曼编码c语言,贪心算法详解:哈夫曼编码

    理解贪心算法 贪心算法是一种算法思想,并不是一个具体的算法,因此我们用两个例子来理解什么样的问题适合用贪心算法解决. 例一 现在有一个能装 100g 物品的背包,和一些可拆分的物品(见表格),怎么装才 ...

  2. Unicode双向算法详解(bidi算法)(三)

    Unicode双向算法详解(bidi算法)(三) 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文是对<C++语法详解>一书相关章节的增补,以增强读者对 ...

  3. 神经网络算法详解 04:反馈神经网络(Hopfield、BAM、BM、RBM)

    本文介绍了反馈神经网络,包括Hopfield网络,离散Hopfield网络(DHNN),连续Hopfield网络(CHNN),双向联想记忆网络(BAM),玻尔兹曼机(BM),受限玻尔兹曼机(RBM). ...

  4. 推荐系统简介+算法详解+项目介绍

    目录标题 推荐系统简介 1.推荐系统目的 2.推荐系统的应用 3.推荐系统的基本思想 4.推荐系统的数据分析 5.推荐系统的分类 6.推荐算法简介 6.1 基于人口统计学的推荐算法(基于用户数据) 6 ...

  5. 经典算法详解--CART分类决策树、回归树和模型树

    Classification And Regression Tree(CART)是一种很重要的机器学习算法,既可以用于创建分类树(Classification Tree),也可以用于创建回归树(Reg ...

  6. js php base64,JavaScript实现Base64编码与解码的代码详解

    本篇文章给大家分享的是jJavaScript实现Base64编码与解码的代码详解,内容挺不错的,希望可以帮助到有需要的朋友 一.加密解密方法使用//1.加密 var str = '124中文内容'; ...

  7. 目标检测 RCNN算法详解

    原文:http://blog.csdn.net/shenxiaolu1984/article/details/51066975 [目标检测]RCNN算法详解 Girshick, Ross, et al ...

  8. [搜索]波特词干(Porter Streamming)提取算法详解(2)

     接[搜索]波特词干(Porter Streamming)提取算法详解(1), http://blog.csdn.net/zhanghaiyang9999/article/details/4162 ...

  9. md5与des算法有何不同_Python算法详解:为什么说算法是程序的灵魂?

    算法是程序的灵魂,只有掌握了算法,才能轻松地驾驭程序开发.软件开发工作不是按部就班,而是选择一种最合理的算法去实现项目功能.算法能够引导开发者在面对一个项目功能时用什么思路去实现,有了这个思路后,编程 ...

最新文章

  1. (传送门)JVM的GC日志的主要参数
  2. Windows IIS配置Jsp和php环境方法
  3. VMware ESX 主机的网卡负载均衡配置3种方法
  4. netty系列之:对聊天进行加密
  5. python入门系列:深入Python的set和dict
  6. visio2016中插入大括号
  7. Qt安装Windows调试器
  8. Struts2框架中s:if标签和s:set标签小结
  9. 【NOIP2016】【Luogu1909】买铅笔(模拟)
  10. Diamond简介和快速应用
  11. 【详细解读】知识图谱的这一人工智能技术分支的概念、技术、应用、与发展趋势
  12. 信息安全管理体系--建立
  13. VS2017安装(在线、离线)
  14. 移动磁盘拒绝访问要怎样办啊
  15. 放弃去FBI的机会,在美做了2年数据研究工作,如今回国创业,他把全球最顶级的智能预测算法带到了国内
  16. 求助vmbox更新之后打不开了
  17. L2UWE: A Framework for the Efficient Enhancement of Low-Light Underwater Images阅读札记
  18. OpenCV38:特征匹配
  19. 双主机切换下导致的显示器闪动
  20. python函数可以改变哪种数据类型的实参_Python函数参数的几种类型

热门文章

  1. 2021中国IC封装基板市场现状及未来发展趋势
  2. FilterChain 过滤器链和拦截路径
  3. s60v5用java qq_s60v5 qq-QQ版本下载-kukud.net手机qq下载站
  4. k8s(kubernetes)通过yaml从harbor拉取镜像(史诗级,保姆级)
  5. 使用FFMPEG工具包移除视频的水印
  6. 【已解决 Flink Java API问题】The return type of function ‘xxx‘ could not be determined automatically
  7. AutoJs学习-快手组队助力脚本
  8. java 中 模等的用法
  9. 很多人都想考一个RHCE吧,大家不妨看看我是怎么变成一个RHCE的。
  10. python猜数字游戏编程入门_Python实现猜数字游戏