Luhn 算法或是Luhn 公式,也被稱做「模10算法」。它是一種簡單的校驗公式,通常會被用於銀行卡,身份證號碼,IMEI號碼,美國供應商識別號碼,或是加拿大的社會保險號碼的驗證。該算法是由IBM的科學家Hans Peter Luhn所創造,於1954年1月6日提出該專利的申請。javascript
算法特色: 一、從卡號最後一位數字開始,偶數位乘以2,若是乘以2的結果是兩位數,將結果減去9。 二、把全部數字相加,獲得總和。 三、若是號碼是合法的,總和能夠被10整除。(模10算法)php
/** * [checkBankCard luhn算法驗證銀行卡號] * @param [type] $card [description] * @param [string] &$cardType [description] * @return [type] [description] */ public static function checkBankCard($card, &$cardType = '') { $len = strlen($card); if (!is_numeric($card) || ($len != 16 && $len != 19)) { return false; } $cardType = $len==16?"CC":"DC";// 區分借記卡和貸記卡,找不到如何區分準貸記卡和預付費卡,阿里的接口能夠區分,但這兩種卡應該是少數 $odd = $even = 0; $card = strrev(trim($card)); for ($i = 0; $i < $len; ++$i) { if ($i % 2) { // 偶數位號碼 if (($tmp = $card[$i] * 2) >= 10) { $even += $tmp - 9; }else { $even += $card[$i] * 2; } }else { // 奇數位號碼 $odd += $card[$i]; } } return !(($odd + $even) % 10); }
算法比較簡單,就很少作解釋了。 若是有看官須要驗證銀行卡號碼合法性,且須要結果比較詳細的話,能夠使用阿里的免費API:java
https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardBinCheck=true&cardNo=銀行卡號
返回格式以下:算法
{ "bank": "COMM", "validated": true, "cardType": "DC", "key": "cardNo***", "message":[], "stat": "ok" }
從卡號分析得到銀行名稱,這個也能夠本身去實現,不過就須要銀行卡號開頭數字的相關數據,能夠在上網搜的到。json