识别银行卡超级网银行号,很详细

一、前言

最近要做一个识别银行卡超级网银行号的需求,于是就找到了这个,这里记录一下,方便以后使用。

二、过程

1、开通服务

先到这里开通卡号查询联行号的服务

在这里插入图片描述

他有50次的免费额度,后面可以根据自己的需要购买,开通之后前往控制台

在这里插入图片描述

可以在这里看到赠送的额度

在这里插入图片描述

我这里因为买过,所以剩余用来比较多

接着拿到这里的 AppCode

在这里插入图片描述

点接口回到前面的页面

在这里插入图片描述

2、查询文档

在这里插入图片描述

查询请求参数

在这里插入图片描述

查询响应参数

在这里插入图片描述

3、测试

点 请求示例 ,选择自己的开发语言,这里是 Java

在这里插入图片描述

测试调用

在这里插入图片描述

{
  "code": 0,
  "data": {
    "area": "河南省 - 河南省",
    "bankCode": "402491000026",
    "bankId": "14404900",
    "bankPhone": "96288",
    "cardBin": "623059",
    "cardName": "-",
    "cardType": "借记卡",
    "bankName": "河南省农村信用社联合社",
    "bankLogo": "http://img.lundear.com/2ed454.png",
    "binLen": 6,
    "bankUrl": "http://www.hnnx.com",
    "abbr": "HNRCU"
  },
  "desc": "成功"
}

这里的 bankCode 就是超级网银行号。

三、工具类

其实文档上的案例已经很齐全了,这里稍微做了下修改,方便以后使用

1、配置类

package com.zsp.demo.aliyun.alicloud.bankcard.dto;

import lombok.Data;

/**
 * 银行联行号查询dto
 *
 * @author: gan
 * @date: 2025-10-21 12:01
 */
@Data
public class BankCardConfig {

    /**
     * 公共地址
     */
    private String url;

    /**
     * 接口码
     */
    private String code;

    /**
     * appKey
     */
    private String appKey;

    /**
     * appSecret
     */
    private String appSecret;

    /**
     * AppCode
     */
    private String appCode;
}

2、枚举类

package com.zdky.tpl.aliyun.bankcard.enums;

/**
 * 银行联行号查询接口枚举类
 * 地址:https://market.aliyun.com/detail/cmapi00052746?spm=5176.730005.result.2.443b414az7n9dt&innerSource=search_%E6%94%AF%E8%A1%8C%E6%9F%A5%E8%AF%A2#sku=yuncode46746000012
 *
 * @author: gan
 * @date: 2025-10-21 11:47
 */
public enum BankCardInterface {

    qryCardInfo("qryCardInfo", "/lundear/qryCardInfo", "卡号查询总行联行号");

    private String code;
    private String url;
    private String desc;

    BankCardInterface(String code, String url, String desc) {
        this.code = code;
        this.url = url;
        this.desc = desc;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getUrl() {
        return url;
    }

    public static String getUrl(String code) {
        for (BankCardInterface value : BankCardInterface.values()) {
            if (value.code.equals(code))
                return value.url;
        }
        throw new RuntimeException("未知接口码:" + code);
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getDesc() {
        return desc;
    }

    public static String getDesc(String code) {
        for (BankCardInterface value : BankCardInterface.values()) {
            if (value.code.equals(code))
                return value.desc;
        }
        throw new RuntimeException("未知接口码:" + code);
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
}

3、请求参数

package com.zsp.demo.aliyun.alicloud.bankcard.dto;

import lombok.Data;

import java.io.Serializable;

/**
 * 卡号查询总行联行号请求参数
 *
 * @author: gan
 * @date: 2025-10-21 14:23
 */
@Data
public class QryCardInfoParams implements Serializable {

    /**
     * 银行卡号
     */
    private String cardno;
}

4、响应参数

package com.zsp.demo.aliyun.alicloud.bankcard.dto;

import lombok.Data;

import java.io.Serializable;

/**
 * 卡号查询总行联行号响应参数
 *
 * @author: gan
 * @date: 2025-10-21 14:23
 */
@Data
public class QryCardInfoResult implements Serializable {

    /**
     * 总行联行号
     */
    private String bankCode;

    /**
     * 银行编码
     */
    private String bankId;

    /**
     * 银行英文缩写
     */
    private String abbr;

    /**
     * 卡名称
     */
    private String cardName;

    /**
     * 卡类型
     */
    private String cardType;

    /**
     * 卡bin
     */
    private String cardBin;

    /**
     * 卡bin长度
     */
    private String binLen;

    /**
     * 卡所在地区
     */
    private String area;

    /**
     * 银行电话
     */
    private String bankPhone;

    /**
     * 银行网址
     */
    private String bankUrl;

    /**
     * 银行logo
     */
    private String bankLogo;
}

5、工具类(重要)

其中 VerifyUtil 只是一个判空工具类,可以到这里查看,也可以用自己的方式判空。

package com.zsp.demo.aliyun.alicloud.bankcard.utils;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;
import com.alibaba.fastjson.JSONObject;
import com.zsp.demo.aliyun.alicloud.bankcard.dto.BankCardConfig;
import com.zsp.demo.aliyun.alicloud.bankcard.dto.QryCardInfoParams;
import com.zsp.demo.aliyun.alicloud.bankcard.dto.QryCardInfoResult;
import com.zsp.demo.aliyun.alicloud.bankcard.enums.BankCardInterface;
import com.zsp.demo.utils.VerifyUtil;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 阿里云市场银行卡相关工具类
 *
 * 地址:https://market.aliyun.com/detail/cmapi00052746?spm=5176.730005.result.2.443b414az7n9dt&innerSource=search_%E6%94%AF%E8%A1%8C%E6%9F%A5%E8%AF%A2#sku=yuncode46746000012
 *
 * @author: gan
 * @date: 2025-10-21 11:40
 */
public class BankCardUtils {

    private static final Logger log = LoggerFactory.getLogger(BankCardUtils.class);

    /**
     * 这部分静态代码块用来降低 org.apache.http 包的日志级别,调试时可以将其注释
     */
    static {
        // 获取 Logback 的 LoggerContext
        LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
        // 设置 org.apache.http 包的日志级别为 WARN
        loggerContext.getLogger("org.apache.http").setLevel(Level.WARN);
        // 可选:关闭 HTTP 请求/响应的详细日志(Wire Log)
        loggerContext.getLogger("org.apache.http.wire").setLevel(Level.ERROR);
    }

    public static void main(String[] args) {
        BankCardConfig config = new BankCardConfig();
        config.setUrl("https://qrybkcode.market.alicloudapi.com");
        config.setAppCode("你的AppCode");
        config.setCode(BankCardInterface.qryCardInfo.getCode());

        //=====================================卡号查询总行联行号 start=============================================

        QryCardInfoParams qryCardInfoParams = new QryCardInfoParams();
        qryCardInfoParams.setCardno("待查询银行卡号");

        JSONObject qryCardInfoJsonObject = commonRequestMethod(config, qryCardInfoParams);
        System.out.println("qryCardInfoJsonObject:" + qryCardInfoJsonObject);

        QryCardInfoResult qryCardInfoResult = BankCardUtils.getResultData(qryCardInfoJsonObject, QryCardInfoResult.class);
        System.out.println("qryCardInfoResult:" + qryCardInfoResult);

        //=====================================卡号查询总行联行号 end=============================================
    }

    /**
     * 发送银行卡信息查询请求
     * @param config 配置文件
     * @param params 请求参数
     * @return
     */
    public static JSONObject commonRequestMethod(BankCardConfig config, Object params) {
        List<String> noEmptyFieldList = Arrays.asList("url", "code", "appCode");
        VerifyUtil.checkBean(config, noEmptyFieldList, false, "银行卡信息");

        String url = config.getUrl();
        String code = config.getCode();
        String appCode = config.getAppCode();

        String partUrl = BankCardInterface.getUrl(code);
        
        String method = "GET";  //银行查询的参数都是GET请求
        Map<String, String> headers = new HashMap<String, String>();
        //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
        headers.put("Authorization", "APPCODE " + appCode);

        List<Map> fieldsInfo = VerifyUtil.getFieldsInfo(params);

        Map<String, String> querys = new HashMap<String, String>();

        for (int i = 0; i < fieldsInfo.size(); i++) {
            Map<String, Object> infoMap = fieldsInfo.get(i);
            String fieldName = (String) infoMap.get("name");
            Object fieldValue = infoMap.get("value");
            querys.put(fieldName, fieldValue.toString());
        }

        try {
            /**
             * 重要提示如下:
             * HttpUtils请从
             * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
             * 下载
             *
             * 相应的依赖请参照
             * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
             */
            HttpResponse response = HttpUtils.doGet(url, partUrl, method, headers, querys);

            //String responseStr = response.toString();
            //System.out.println(responseStr);

            String body = EntityUtils.toString(response.getEntity());

            //获取response的body
            log.info("卡号查询总行联行号 body {} ", body);
            //HTTP/1.1 200 OK [Date: Tue, 21 Oct 2025 10:13:15 GMT, Content-Type: application/json; charset=utf-8, Transfer-Encoding: chunked, Connection: keep-alive, Keep-Alive: timeout=25, Vary: Accept-Encoding, Access-Control-Allow-Origin: *, Server: openresty/1.13.6.2, X-Ca-Request-Id: 82CE7C70-3645-4F43-9FFB-CB77B023A117] org.apache.http.conn.BasicManagedEntity@6c33448

            return JSONObject.parseObject(body);
        } catch (Exception e) {
            e.printStackTrace();

            throw new RuntimeException(e.getMessage());
        }
    }

    /**
     * 是否通讯成功
     * @param resultJson
     * @return
     */
    public static boolean isSuccess(JSONObject resultJson) {
        if ("0".equals(resultJson.getString("code"))) {  //0表示调用成功
            //调用成功
        } else if ("2".equals(resultJson.getString("code"))) {
            throw new RuntimeException(resultJson.getString("desc"));
        } else {
            throw new RuntimeException("银行卡相关接口调用失败!");
        }

        JSONObject data = resultJson.getJSONObject("data");
        VerifyUtil.checkParam(data, "银行卡相关返回信息中【data】不存在!");

        return true;
    }

    /**
     * 获取返回结果
     * @param resultJson  返回结果
     * @param type  返回结果类型
     * @return
     */
    public static <T> T getResultData(JSONObject resultJson, Class<T> type) {
        return getResultData(true, resultJson, type);
    }

    /**
     * 获取返回结果
     * @param isVerify  是否校验,默认为是
     * @param resultJson  返回结果
     * @param type  返回结果类型
     * @return
     */
    public static <T> T getResultData(Boolean isVerify, JSONObject resultJson, Class<T> type) {
        if (null == isVerify) {
            isVerify = true;
        }

        if (isVerify) {
            isSuccess(resultJson);
        }

        return JSONObject.parseObject(resultJson.getString("data"), type);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值