分享在应用中对接手机号、姓名、身份证三要素身份验证

一、前言

我们公司目前在运营的线上产品需要增加对用户进行注册手机号、姓名、身份证三要素进行身份证一致性验证的场景,我们之前有对接过一家随联数聚的验证接口,对比他们和其他一些能提供身份验证服务的平台,对比了价格、准确率、响应时间这些之后,选择了随联数聚这个平台的全网手机三要素这个API进行对接,以下是对接处理的流程,在这里做一下开发对接的记录以及和有需要对接该身份验证的朋友进行一下分享。

二、对接过程

1、访问https://www.slsj.com 随联数聚平台。

 

2、访问后进行注册、认证,注册挺简单的,和其他平台差不多,直接手机验证码就可以完成注册和直接登录,之后的认证可以选择个人或者企业,因为他们这个资源支持个人或者企业使用,我们这边之前为了方便是用的个人认证,也挺简单,一分钟之内就完成了认证。

 

3、完成认证后就可以申请相关的资源,我这边对比了一下,申请的他们“全网手机三要素“这个接口。这个接口支持对用户的手机号、姓名、身份证号码进行这三要素的一致性校验,如果校验通过则表示这三个信息是属于同一个人的。支持对全国四网的手机号码进行验证,包括:中国移动、中国联通、中国电信、广电。

image

 

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

image

 

 

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

image

 

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

image

 

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

image

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 UserPhoneVerifyAPI {

    private static final String SIGN_KEY = "这里输入你的密钥";
    private static final String USER_ID = "这里输入你的用户ID";
    private static final String apiUrl = "https://api.slsj.com/api/carriers/carriers-auth/query";

    // 测试方法
    public static void main(String[] args) throws Exception {
        boolean result = userPhoneVerify("20250825001", "这里传入要验证的手机号", "这里传入要验证的姓名", "这里传入要验证的身份证号");
        assertTrue(result, "验证不通过");
    }

    /**
     * 请求进行用户实名信息验证
     * @param orderId
     * @param mobile
     * @param name
     * @param idCard
     * @return
     */
    public static boolean userPhoneVerify(String orderId, String mobile, String name, String idCard) throws Exception {     
        // 设置参数  
        Map<String, Object> params = new HashMap<>();
        params.put("orderId", orderId);
        params.put("mobile", mobile);
        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的方法
    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();
    }

    // 辅助方法:将字节数组转换为十六进制字符串
    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进行使用预警设置,到时快用完了也可以收到预警及时再进行充值购买这些,还是比较方便的。

 

 

posted @ 2025-08-25 15:54  码农BoBo  阅读(11)  评论(0)    收藏  举报