作者:雲時之間
來源:知乎
鏈接:https://zhuanlan.zhihu.com/p/143662990
編輯:王萌
在後續完成了銀行卡的識別之後,現在可以進行卡號覈驗和格式化的工作了,這些工作雖然沒有之前的那麼複雜,但是還是比較繁瑣的。
一:卡號檢測
來判斷銀行卡(儲蓄卡,信用卡)的卡號的合法性我們用到了Luhn算法
算法流程如下:
- 從右到左給卡號字符串編號,最右邊第一位是1,最右邊第二位是2,最右邊第三位是3….
- 從右向左遍歷,對每一位字符t執行第三個步驟,並將每一位的計算結果相加得到一個數s。
- 對每一位的計算規則:如果這一位是奇數位,則返回t本身,如果是偶數位,則先將t乘以2得到一個數n,如果n是一位數(小於10),直接返回n,否則將n的個位數和十位數相加返回。
- 如果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 % 10
def 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,視網絡情況不等,仍有很多地方需要優化,比如模型載入,代碼耦合,特殊情況下的識別準確率等等,以及一些功能上的缺失,比如卡號有效期的識別等,這些地方仍需要不斷地改進。