最近在公司有一个 fakedata 的项目,用来生成各类假数据,在各种测试环境,其中就有银行卡卡号的生成,中国这方面是有自己的标准的,详细的介绍可以参考这篇文章,写的很清楚。
简单来说,就是国内的银行卡卡号,主要都是银联标准,然后前面的4-8位称之为卡 bin,这个卡 bin 是可以区分是具体哪个银行,以及是否是借记卡还是贷记卡(信用卡),关键是最后一位校验位。
从校验卡号的角度来说,可以在应用的尽量前端进行判断,如果卡号校验错误,就不用去进行四要素判断,更不能进行实际的账户交易了。校验码对了,再根据卡 bin 判断是什么银行和什么性质的银行卡(这个下次再说)。
这里只讨论银行卡号码本身的合法性,并不是通常意义说的三要素四要素银行卡和身份证的校验。
def get_bankcard_checkcode(card_number_str):
"""
计算银行卡校验位;
:param:
* card_number_str: (string) 要查询的银行卡号
:returns:
checkcode: (string) 银行卡的校验位
举例如下::
from fishbase.fish_data import *
print('--- fish_data get_bankcard_checkcode demo ---')
# 不能放真的卡信息,有风险
print(get_bankcard_checkcode('439188000699010'))
print('---')
输出结果::
--- fish_data get_bankcard_checkcode demo ---
9
---
"""
total = 0
even = True
for item in card_number_str[-1::-1]:
item = int(item)
if even:
item <<= 1
if item > 9:
item -= 9
total += item
even = not even
checkcode = (10 - (total % 10)) % 10
return str(checkcode)
实际算法部分不算复杂,参考了一些网上看到的资料。需要的朋友可以借鉴。
代码还在不断优化中,可以参考我们的 Python 工具函数包 fishbase :
源代码:https://github.com/chinapnr/fishbase
文档:https://fishbase.readthedocs.io/en/latest/
pypi :https://pypi.org/project/fishbase/