分享在应用中对接银行卡核验三要素验证
一、前言
我们公司目前在运营的线上产品需要增加用户添加银行账号场景,并且我们需要对用户的银行账号和实名认证信息进行一致性验证,因为只允许用户添加实名认证人名下的银行账号信息,我们之前有对接过一家随联数聚的验证接口,对比他们和其他一些能提供身份验证服务的平台,对比了价格、准确率、响应时间这些之后,选择了随联数聚这个平台的银行卡三要素(标准版)这个API进行对接,以下是对接处理的流程,在这里做一下开发对接的记录以及和有需要对接该场景API资源的朋友进行一下分享。
二、对接过程
1、访问https://www.slsj.com 随联数聚平台。
2、访问后进行注册、认证,注册挺简单的,和其他平台差不多,直接手机验证码就可以完成注册和直接登录,之后的认证可以选择个人或者企业,因为他们这个资源支持企业使用,所以我们的账号需要是企业认证类型才能申请使用这个API资源。

3、完成认证后就可以申请相关的资源,我这边对比了一下,申请的他们“银行卡三要素(标准版)“这个接口。这个接口支持对用户的姓名、身份证号码、以及银行卡号进行这三要素的一致性校验,如果校验通过则表示这三个信息是属于同一个人的。他们这个可以覆盖全国的银联卡。

4、点击进入API进行申请,可以查看具体的套餐价格这些,对比过其他平台,这里的价格也还可以。他们的API有免费赠送体验次数,可以通过体验次数去测试一下接口的质量,后续再根据使用情况去购买。

5、申请资源之后可以进行对接,他们有提供对接文档、示例代码、测试平台这些功能,也还挺方便,测试时可以先用测试平台进行一下测试。

6、分别使用模拟和真实的信息测试一下,没有问题,响应时间也是毫秒级响应。

7、查看他们的对接文档,直接在测试平台右边可以看到对接文档信息,根据对接文档信息进行代码编写,先写一个测试方法调通请求。另外他们请求需要的用户ID、密钥这些可以在个人中心 - 账户管理的账户信息中进行查看。

8、在项目中编写的调试代码
package com.example.api.user;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.*;
/**
* 银行卡号、姓名、身份证号码三要素一致性验证
*/
public class BankCardVerifyAPI {
private static final String SIGN_KEY = "XXXXXX";
private static final String USER_ID = "XXXXXX";
private static final String apiUrl = "https://api.slsj.com/api/bank-card/three-elements/query";
// 测试方法
public static void main(String[] args) throws Exception {
boolean result = bankCardVerify("20250825001", "XXXXXX", "XXXXXX", "XXXXXX");
assertTrue(result, "验证不通过");
}
/**
* 请求进行用户实名信息验证
* @param orderId
* @param bankCard
* @param name
* @param idCard
* @return
*/
public static boolean bankCardVerify(String orderId, String bankCard, String name, String idCard) throws Exception {
// 设置参数
Map<String, Object> params = new HashMap<>();
params.put("orderId", orderId);
params.put("cardNo", bankCard);
params.put("name", name);
params.put("idCard", idCard);
// 发送请求
JSONObject responseJson = queryApi(apiUrl, params);
// 返回认证结果
return responseJson.getInt("code") == 0 && responseJson.getJSONObject("result").get("result").equals("01");
}
/**
* HTTP请求处理方法
* @param apiUrl
* @param params
* @return
* @throws Exception
*/
public static JSONObject queryApi(String apiUrl,Map<String, Object> params) throws Exception {
// 获取鉴权Token
String authToken = getAuthToken();
// 发送请求
HttpResponse response = HttpRequest.post(apiUrl)
.header("Content-Type", "application/x-www-form-urlencoded")
.header("Auth_Token", authToken)
.header("Sign_Type", "md5")
.form(params)
.execute();
// 返回响应结果
String responseBody = response.body();
return JSONUtil.parseObj(responseBody);
}
/**
* 获取Auth_Token的方法
* @return
* @throws Exception
*/
private static String getAuthToken() throws Exception {
// 获取当前时间戳
long timestamp = System.currentTimeMillis();
// 按照文档拼接待加密字符串
String toEncrypt = "memberId=" + USER_ID + "dateTime=" + timestamp + "version=v1" + "key=" + SIGN_KEY;
// MD5加密
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(toEncrypt.getBytes(StandardCharsets.UTF_8));
String md5Result = bytesToHex(digest).toLowerCase();
// 创建鉴权Token的JSON对象
JSONObject authTokenObj = new JSONObject();
authTokenObj.set("memberId", USER_ID);
authTokenObj.set("dateTime", timestamp);
authTokenObj.set("version", "v1");
authTokenObj.set("signMd5", md5Result);
return authTokenObj.toString();
}
/**
* 将字节数组转换为十六进制字符串
* @param bytes
* @return
*/
private static String bytesToHex(byte[] bytes) {
StringBuilder result = new StringBuilder();
for (byte b : bytes) {
result.append(String.format("%02x", b));
}
return result.toString();
}
}
9、调通后修改下合并到业务处理代码中,后续再测试一下没问题就完成对接了,整个过程还是比较简单的。
10、后续准备上线使用后再根据使用情况去购买使用套餐就OK了。他们个人中心的已申请API中也支持针对API进行使用预警设置,到时快用完了也可以收到预警及时再进行充值购买这些,还是比较方便的。


浙公网安备 33010602011771号