项目里有一个验证银行卡的地儿,大量跑测试的时候一直调接口也是有几分没必要,查了下,银行卡都是按照LUHN算法校验的。
开始写了个简单的luhn函数验证
/**
* LUHN算法
* @param string $s 待验证的字符串
* @return boolean
* */
function luhn($s) {
$n = 0;
for($i=strlen($s)-1; $i>=0; $i--) {
if($i % 2) $n += $s{$i};
else {
$t = $s{$i} * 2;
if($t > 9) $t = $t{0} + $t{1};
$n += $t;
}
}
return ($n % 10) == 0;
}
但是呢,测试的时候发现,16位银行卡可以判断,19位的有点问题。
然后找了个免费的接口。
https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?cardNo=银行卡号&cardBinCheck=true
校验成功返回
{“cardType”:“CC”,“bank”:“CIB”,“key”:“1544448726136-8178-11.253.105.235-1652600308”,“messages”:[],“validated”:true,“stat”:“ok”}
/**
* 简单的根据银行卡号匹配银行
* @param string $cardid 银行卡号
* @return string 开户行|卡号不存在
* */
function bankCard($cardid){
$card = file_get_contents("https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?cardNo={$cardid}&cardBinCheck=true");
$bankCard = json_decode($card,ture);
$bank = array(
"CDB"=>"国家开发银行","ICBC"=>"中国工商银行","ABC"=>"中国农业银行","BOC"=>"中国银行","CCB"=>"中国建设银行","PSBC"=>"中国邮政储蓄银行","COMM"=>"