作者:云时之间
来源:知乎
链接:https://zhuanlan.zhihu.com/p/143662990
编辑:王萌

在后续完成了银行卡的识别之后,现在可以进行卡号核验和格式化的工作了,这些工作虽然没有之前的那么复杂,但是还是比较繁琐的。

一:卡号检测

来判断银行卡(储蓄卡,信用卡)的卡号的合法性我们用到了Luhn算法

算法流程如下:

  1. 从右到左给卡号字符串编号,最右边第一位是1,最右边第二位是2,最右边第三位是3….
  2. 从右向左遍历,对每一位字符t执行第三个步骤,并将每一位的计算结果相加得到一个数s。
  3. 对每一位的计算规则:如果这一位是奇数位,则返回t本身,如果是偶数位,则先将t乘以2得到一个数n,如果n是一位数(小于10),直接返回n,否则将n的个位数和十位数相加返回。
  4. 如果s能够整除10,则此号码有效,否则号码无效。

因为最终的结果会对10取余来判断是否能够整除10,所以又叫做模10算法。

算法代码:

def luhn_checksum(card_number):    def digits_of(n):        return [int(d) for d in str(n)]    digits = digits_of(card_number)    odd_digits = digits[-1::-2]    even_digits = digits[-2::-2]    checksum = 0    checksum += sum(odd_digits)    for d in even_digits:    return checksum % 10def is_luhn_valid(card_number):    return luhn_checksum(card_number) == 0

二:BIN码校验

银行卡号一般是13-19位组成,国内一般是16,19位,其中16位为信用卡,19位为储蓄卡,通常情况下都是由“卡BIN+发卡行自定位+校验位”这三部分构成,

银行卡的前6位用来识别发卡银行或者发卡机构的,称为发卡行识别码,简称为卡BIN。拿出钱包里的卡,会发现如果是只带有银联标注的卡,十有八九都是以62开头的,但是也有例外。

这里边包含一个坑:你知道Bin码的规则,但是你不知道国内银行的BIN码,网上的也大都不全,只能以后慢慢人工扩充。

我这边整理了一份,但是也不全,大概包含有1300个BIN号,以后再慢慢整理


只需要将合法的卡号前6位切片出来进行查询就好了。

文件地址:

链接:pan.baidu.com/s/1jnfITx
提取码:ywud

三:模型上线

为了让模型快速上线,我用的是flask框架,然后返回一个json格式,还是比较方便的,这里推荐使用Postman来检测你的页面的合法性,在《软件测试技术大全》一书中,有个说法:

响应时间在4秒以内,大部分用户可以接受;
4~9秒以内,30%的用户选择离开;
8~9秒,则有60%的用户选择离开;
超过10秒,则90%以上的用户选择离开。

现在我的访问时间是3-6s,视网络情况不等,仍有很多地方需要优化,比如模型载入,代码耦合,特殊情况下的识别准确率等等,以及一些功能上的缺失,比如卡号有效期的识别等,这些地方仍需要不断地改进。

©著作权归作者所有:来自51CTO博客作者mb5fca0b6a49e47的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. CV学习笔记(三十一):人脸识别流程分析
  2. CV学习笔记(二十六):NMS非极大值抑制算法
  3. 数据结构与算法—小白也能搞懂二叉排序(查找)树
  4. 从阶乘、斐波那契、汉诺塔剖析彻底搞懂递归算法
  5. 数据结构与算法—队列(搞懂最常用数据结构之一)
  6. 数据结构与算法—栈详解(看完面试考试再也不怕了)
  7. 数据结构于算法—线性表详解(顺序表、链表)
  8. 数据结构与算法—绪论
  9. TensorFlow.js人脸识别—玩转吃豆豆小游戏

随机推荐

  1. Android事件分发机制完全解析,带你从源码
  2. Android NDK初识
  3. android中自己画一个按钮,和自己设置一个
  4. Android:可复制的TextView、EditText
  5. Android: 显示系统模块加载以及调用流程
  6. Android推送通知指南
  7. Android:AsyncTask使用
  8. [置顶] 《Android 之美 从0到1 -- 高手之
  9. 谷歌 Android“开源“神话走向破灭
  10. android中异步加载网络图片