一、前言
最近要做一个识别银行卡超级网银行号的需求,于是就找到了这个,这里记录一下,方便以后使用。
二、过程
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);
}
}
4135

被折叠的 条评论
为什么被折叠?



