查了网上的很多资料有一种是输入卡号前8位识别是某某卡类型的这种,那种的是在代码里面写死的,即使存进数据库也需要专人进行维护成本太高,最后试了下还是使用支付宝的这个接口能达到自己的目的
验证银行卡是否正确可以使用阿里的免费验证接口,通过阿里支付宝api对银行卡进行效验(是否存在,卡号类型,归属行) 这三大类
https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo=银行卡号&cardBinCheck=true
返回格式如下(需要输入完整卡号):
直接上代码:
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class BankUtil {
private final static String[] bankBin = {
"CDB","ICBC","ABC","BOC","CCB","PSBC","COMM","CMB","SPDB","CIB","HXBANK","GDB", "CMBC","CITIC","CEB","EGBANK",
"CZBANK","BOHAIB","SPABANK","SHRCB","YXCCB","YDRCB","BJBANK","SHBANK","JSBANK","HZCB","NJCB","NBBANK","HSBANK",
"CSCB","CDCB","CQBANK","DLB","NCB","FJHXBC","HKB","WZCB","QDCCB","TZCB","JXBANK","CSRCB","NHB","CZRCB","H3CB","SXCB","SDEB","WJRCB","ZBCB",
"GYCB","ZYCBANK","HZCCB","DAQINGB","JINCHB","ZJTLCB","GDRCC","DRCBCL","MTBANK","GCB","LYCB",
"JSRCU","LANGFB","CZCB","DYCB","JZBANK","BOSZ","GLBANK","URMQCCB","CDRCB","ZRCBANK","BOD","LSBANK",
"BJRCB","TRCB","SRBANK","FDB","CRCBANK","ASCB","NXBANK","BHB","HRXJB","ZGCCB","YNRCC","JLBANK",
"DYCCB","KLB","ORBANK","XTB","JSB","TCCB","BOYK","JLRCU","SDRCU","XABANK","HBRCU","NXRCU","GZRCU",
"FXCB","HBHSBANK","ZJNX","XXBANK","HBYCBANK","LSCCB","TCRCB","BZMD","GZB","WRCB","BGB",
"GRCB","JRCB","BOP","TACCB","CGNB","CCQTGB","XLBANK","HDBANK","KORLABANK","BOJZ","QLBANK","BOQH",
"YQCCB","SJBANK","FSCB","ZZBANK","SRCB","BANKWF","JJBANK","JXRCU","HNRCU","GSRCU","SCRCU","GXRCU","SXRCCU",
"WHRCB","YBCCB","KSRB","SZSBK","HSBK","XYBANK","NBYZ","ZJKCCB","XCYH","JNBANK","CBKF","WHCCB","HBC",
"BOCD","BODD","JHBANK","BOCY","LSBC","BSB","LZYH","BOZK","DZBANK","SCCB","AYCB","ARCU","HURCB","HNRCC","NYNB","LYBANK","NHQS","CBBQS"
};
private static final String[] bankName = {
"国家开发银行","中国工商银行","中国农业银行","中国银行","中国建设银行","中国邮政储蓄银行","交通银行","招商银行","上海浦东发展银行","兴业银行","华夏银行","广东发展银行",
"中国民生银行","中信银行","中国光大银行","恒丰银行","浙商银行","渤海银行","平安银行","上海农村商业银行","玉溪市商业银行","尧都农商行","北京银行","上海银行",
"江苏银行","杭州银行","南京银行","宁波银行","徽商银行","长沙银行","成都银行","重庆银行","大连银行","南昌银行","福建海峡银行","汉口银行","温州银行","青岛银行","台州银行",
"嘉兴银行","常熟农村商业银行","南海农村信用联社","常州农村信用联社","内蒙古银行","绍兴银行","顺德农商银行","吴江农商银行","齐商银行","贵阳市商业银行","遵义市商业银行","湖州市商业银行","龙江银行",
"晋城银行JCBANK","浙江泰隆商业银行","广东省农村信用社联合社","东莞农村商业银行","浙江民泰商业银行","广州银行","辽阳市商业银行","江苏省农村信用联合社","廊坊银行","浙江稠州商业银行","德阳商业银行",
"晋中市商业银行","苏州银行","桂林银行","乌鲁木齐市商业银行","成都农商银行","张家港农村商业银行","东莞银行","莱商银行","北京农村商业银行","天津农商银行","上饶银行","富滇银行",
"重庆农村商业银行","鞍山银行","宁夏银行","河北银行","华融湘江银行","自贡市商业银行","云南省农村信用社","吉林银行","东营市商业银行","昆仑银行","鄂尔多斯银行","邢台银行","晋商银行",
"天津银行","营口银行","吉林农信","山东农信","西安银行","河北省农村信用社","宁夏黄河农村商业银行","贵州省农村信用社","阜新银行","湖北银行黄石分行","浙江省农村信用社联合社","新乡银行",
"湖北银行宜昌分行","乐山市商业银行","江苏太仓农村商业银行","驻马店银行","赣州银行","无锡农村商业银行","广西北部湾银行","广州农商银行","江苏江阴农村商业银行","平顶山银行","泰安市商业银行",
"南充市商业银行","重庆三峡银行","中山小榄村镇银行","邯郸银行","库尔勒市商业银行","锦州银行","齐鲁银行","青海银行","阳泉银行","盛京银行","抚顺银行","郑州银行","深圳农村商业银行",
"潍坊银行","九江银行","江西省农村信用","河南省农村信用","甘肃省农村信用","四川省农村信用","广西省农村信用","陕西信合","武汉农村商业银行","宜宾市商业银行","昆山农村商业银行","石嘴山银行",
"衡水银行","信阳银行","鄞州银行","张家口市商业银行","许昌银行","济宁银行","开封市商业银行","威海市商业银行","湖北银行","承德银行","丹东银行","金华银行","朝阳银行","临商银行",
"包商银行","兰州银行","周口银行","德州银行","三门峡银行","安阳银行","安徽省农村信用社","湖北省农村信用社","湖南省农村信用社","广东南粤银行","洛阳银行","农信银清算中心","城市商业银行资金清算中心"
};
/**
* 通过银行简称获取银行卡所属银行全名 如没有查到全名则返回银行简称
*/
public static String getNameOfBank(String bankAbbreviation) {
int index = -1;
for (int i = 0; i < bankBin.length; i++) {
if (bankAbbreviation.equals(bankBin[i])) {
index = i;
}
}
if (index != -1) {
return bankName[index];
}
return bankAbbreviation;
}
/**
* TODO
*
* @param cardNo 银行卡卡号
* @return {"bank":"CMB","validated":true,"cardType":"DC","key":"(卡号)","messages":[],"stat":"ok"}
* 2021年8月23日 ys
*/
public static String getCardDetail(String cardNo) {
// 创建HttpClient实例
String url = "https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo=";
url += cardNo;
url += "&cardBinCheck=true";
StringBuilder sb = new StringBuilder();
String result=null;
try {
URL urlObject = new URL(url);
URLConnection uc = urlObject.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()));
String inputLine = null;
while ((inputLine = in.readLine()) != null) {
sb.append(inputLine);
}
in.close();
JSONObject json = JSONObject.fromObject(sb.toString());
//判断是否包含 keycardType
if(json.has("cardType")) {
//拿到cardType
String cardTypeResult = json.getString("cardType");
//如果为信用卡则返回 卡类型。值:DC: "储蓄卡",CC: "信用卡",SCC: "准贷记卡",PC: "预付费卡"
if (StringUtils.isNotBlank(cardTypeResult) && !cardTypeResult.equals("DC")) {
result = "暂只支持储蓄卡~";
}
}
//银行卡状态。值:ok,no。
String statResult = json.getString("stat");
if(StringUtils.isNotBlank(statResult) && !statResult.equals("ok") && StringUtils.isBlank(result)){
result="银行卡不可使用~";
}
//有效性,是否正确有效。值:true为是,false为否。
boolean validatedResult = json.getBoolean("validated");
if(!validatedResult && StringUtils.isBlank(result)){
result="银行卡号不正确~";
}
//判断是否包含 bank简称
if(json.has("bank")) {
//所属行。值:所属行简称,如:CMB 为招商银行
String bankResult = json.getString("bank");
if (StringUtils.isNotBlank(bankResult)) {
String nameOfBank = BankUtil.getNameOfBank(bankResult);
if (StringUtils.isNotBlank(nameOfBank) && StringUtils.isBlank(result)) {
return nameOfBank;
}
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
// public static void main(String[] args){
// System.out.println(getCardDetail("66666666666666661"));
// }
}
亲测可用 需要输入完整卡号验证