阿里支付宝api对银行卡进行效验

查了网上的很多资料有一种是输入卡号前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"));
//    }
}

亲测可用 需要输入完整卡号验证

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一名落魄的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值