场景
之前做添加大陆银行卡时有接入过第三方的银行卡三要素认证方法(三要素:姓名、身份证号、银行卡号),这可以校验用户绑定的银行卡是否是与证件号一致的卡。但在此之前,还需要做一个卡bin校验,以便区分银行卡的性质,比如是储蓄卡还是信用卡、是哪个银行的卡, 不巧的是第三方没有提供卡bin方法,所以直接用支付宝免费的卡bin校验方法。
<?php
/**
*
*
* User: 原子酱
* Date: 2019/9/17
* Time: 14:27
*/
use GuzzleHttp\Client;
require_once '../vendor/autoload.php';
// 银行卡号前缀
$head = [
// '625810',
'620302',
'622840',
'621215',
'622700',
'622258',
'622615',
'622909',
'622660',
'622989',
'621771',
'621030',
'622580',
'690755',
'62215049',
'622500',
'622630',
];
$host = 'https://ccdcapi.alipay.com/validateAndCacheCardInfo.json';
$client = new Client();
$content = [];
foreach ($head as $value) {
$lenth = 16;
do {
$bankNo = str_pad($value, $lenth, 0, STR_PAD_RIGHT);
$getUrl = $host . "?cardBinCheck=true&cardNo=$bankNo";
$response = $client->request('GET', $getUrl);
$response = $response->getBody()->getContents();
$result = json_decode(trim(strval($response)), true);
$lenth++;
} while (!isset($result['bank']) || $lenth > 20);
$content[] = [
'head' => $value,
'abbr' => $result['bank'],
'lenth' => $lenth,
];
}
var_dump($content);
以上方法是为了得出常用银行简称对应关系,因为大部分银行卡号都有自己的规律,且为了用户信息安全起见,在调用卡bin校验接口时不需要把卡号传过去,补0也是可以得出结果。我在项目中是直接截掉10位再补0的:
substr_replace($bankNo, ‘0000000000’, -10)
接口调用时间大概是0.1s~0.2s之间,还是比较快的。
银行名称 | 各银行开头 | 卡bin接口返回的银行简称 |
---|---|---|
工商银行 | 620302 | ICBC |
农业银行 | 622840 | ABC |
中国银行 | 621215 | BOC |
建设银行 | 622700 | CCB |
交通银行 | 622258 | COMM |
民生银行 | 622615 | CMBC |
兴业银行 | 622909 | CIB |
光大银行 | 622660 | CEB |
平安银行 | 622989 | SPABANK |
中信银行 | 621771 | CITIC |
北京银行 | 621030 | BJBANK |
广发银行 | 622580 | GDB |
招商银行 | 690755 | CMB |
邮储银行 | 62215049 | PSBC |
浦发银行 | 622500 | SPDB |
华夏银行 | 622630 | HXBANK |