• 傻瓜式调用阿里云的接口进行三要素(姓名、手机号和身份证号)校验


    一、准备

    1、购买阿里云的三要素核验套餐包

    根据你的业务量选择购买

    在这里插入图片描述

    地址:

    https://www.aliyun.com/product/dytns/

    2、申请开通三要素一致性核验

    调用三要素校验的接口需要授权ID,到号码百科这一功能的标签广场申请

    在这里插入图片描述

    我这里已经申请通过了,点击“立即使用”可跳转查看授权ID

    在这里插入图片描述

    3、查看AccessKey

    目前调用过的阿里云的接口都需要“AccessKey ID”和“AccessKey Secret”,登录阿里云后,点击头像“AccessKey管理”

    在这里插入图片描述

    如果有多组,任意拿一组就行了。

    在这里插入图片描述

    二、调用三要素核验接口

    1、查看接口文档

    在这里插入图片描述

    在这里插入图片描述

    地址:

    https://help.aliyun.com/zh/cpns/developer-reference/api-dytnsapi-2020-02-17-threeelementsverification?spm=a2c4g.11186623.4.6.5ca451cdWl3z2V&scm=20140722.H_433414._.ID_433414-OR_rec-V_1

    2、查看阿里云的调用示例

    点击文档右边的调试可进入阿里云的调试页

    在这里插入图片描述

    代码示例在“SDK示例-Java”
    在这里插入图片描述

    也可以下载完整工程

    3、阿里云完整示例代码

    在使用之前先导入三要素核验的依赖

    <dependency>
    	<groupId>com.aliyungroupId>
    	<artifactId>dytnsapi20200217artifactId>
    	<version>2.1.0version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    代码如下:

    // This file is auto-generated, don't edit it. Thanks.
    package com.aliyun.sample;
    
    import com.aliyun.tea.*;
    
    public class Sample {
    
        /**
         * 使用AK&SK初始化账号Client
         * @param accessKeyId
         * @param accessKeySecret
         * @return Client
         * @throws Exception
         */
        public static com.aliyun.dytnsapi20200217.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
            com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                    // 必填,您的 AccessKey ID
                    .setAccessKeyId(accessKeyId)
                    // 必填,您的 AccessKey Secret
                    .setAccessKeySecret(accessKeySecret);
            // Endpoint 请参考 https://api.aliyun.com/product/Dytnsapi
            config.endpoint = "dytnsapi.aliyuncs.com";
            return new com.aliyun.dytnsapi20200217.Client(config);
        }
    
        public static void main(String[] args_) throws Exception {
            java.util.List<String> args = java.util.Arrays.asList(args_);
            // 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
            // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html
            com.aliyun.dytnsapi20200217.Client client = Sample.createClient(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
            com.aliyun.dytnsapi20200217.models.ThreeElementsVerificationRequest threeElementsVerificationRequest = new com.aliyun.dytnsapi20200217.models.ThreeElementsVerificationRequest();
            com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
            try {
                // 复制代码运行请自行打印 API 的返回值
                client.threeElementsVerificationWithOptions(threeElementsVerificationRequest, runtime);
            } catch (TeaException error) {
                // 如有需要,请打印 error
                com.aliyun.teautil.Common.assertAsString(error.message);
            } catch (Exception _error) {
                TeaException error = new TeaException(_error.getMessage(), _error);
                // 如有需要,请打印 error
                com.aliyun.teautil.Common.assertAsString(error.message);
            }        
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    4、改造后的示例代码

    这只是一个代码片段,完整的代码在工具类那里

    public static void main(String[] args) throws Exception{
        ThreeElementIdentifyRequestParam param = new ThreeElementIdentifyRequestParam();
    
        param.setAccessKeyId("你的AccessKey ID");
        param.setAccessSecret("你的AccessKey Secret");
    
        param.setAuthCode("你的授权ID");
        param.setMask("你的加密方式");
        param.setInputNumber("你的手机号码");
        param.setCertCode("你的身份证号码");
        param.setName("你的名字");
    
        threeElementIdentify(param);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    5、响应示例

    {
    	"headers": {
    		"access-control-allow-origin": "*",
    		"date": "Mon, 23 Oct 2023 10:11:26 GMT",
    		"content-length": "137",
    		"keep-alive": "timeout=25",
    		"x-acs-request-id": "35266210-AB31-5E73-88AC-509C5F0B3E79",
    		"connection": "keep-alive",
    		"content-type": "application/json;charset=utf-8",
    		"etag": "1mfbFqXYsVtweJZ6OSyCWpg9",
    		"access-control-expose-headers": "*",
    		"x-acs-trace-id": "fa79554ca5ea3ffc8a613a0f85426a8d"
    	},
    	"body": {
    		"code": "OK",
    		"data": {
    			"basicCarrier": "中国移动",
    			"isConsistent": 1
    		},
    		"requestId": "35266210-AB31-5E73-88AC-509C5F0B3E79",
    		"message": "OK"
    	},
    	"statusCode": 200
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    三、工具类

    1、请求参数dto

    因为我还有调用其他接口,所以把公共的参数抽取出来了,可以和三要素核验的参数放一起。

    package org.jeecg.modules.aliyun.dto;
    
    import lombok.Data;
    
    /**
     * 阿里云公共请求参数
     *
     * @author:user
     * @date: 2022-09-05 10:38
     */
    @Data
    public class AliyunConfig {
        //阿里云accessKeyId
        private String accessKeyId;
    
        //阿里云accessSecret
        private String accessSecret;
    
        //阿里云识别身份证的regionId,设置请求参数的方法有横线,似乎废弃了
        private String regionId;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    package org.jeecg.modules.aliyun.dto;
    
    import lombok.Data;
    
    /**
     * 三要素(姓名、手机号和身份证号)识别请求参数dto
     *
     * @author:gan
     * @date: 2023-09-25 09:44
     */
    @Data
    public class ThreeElementIdentifyRequestParam extends AliyunConfig {
    	//阿里云三要素核验授权码。
        private String AuthCode;
    
        /*
        待检验的号码。
            若Mask取值为NORMAL,该字段为明文。
            若Mask取值为MD5,请将该字段做MD5加密。
            若Mask取值为SHA256,请将该字段做SHA256加密。
         */
        private String InputNumber;
    
        /*
        加密方式。取值:
            NORMAL:不加密
            MD5
            SHA256
         */
        private String Mask;
    
        /*
        待核验的身份证号。
            若Mask取值为NORMAL,该字段为明文。
            若Mask取值为MD5,请将该字段做MD5加密。
            若Mask取值为SHA256,请将该字段做SHA256加密。
         */
        private String CertCode;
    
        /*
         待核验的姓名。
            若Mask取值为NORMAL,该字段为明文。
            若Mask取值为MD5,请将该字段做MD5加密。
            若Mask取值为SHA256,请将该字段做SHA256加密。
         */
        private String Name;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    2、枚举类

    加密方式枚举类

    package org.jeecg.modules.aliyun.enums;
    
    /**
     * 姓名、身份证、手机号码三要素校验加密方式枚举类
     *
     * @author:gan
     * @date: 2023-10-24 09:41
     */
    public enum ThreeElementIdentifyMaskEnum {
        NORMAL("NORMAL", "不加密"),
        MD5("MD5", "MD5加密"),
        SHA256("SHA256", "SHA256加密");
    
        private String code;
        private String desc;
    
        ThreeElementIdentifyMaskEnum(String code, String desc) {
            this.code = code;
            this.desc = desc;
        }
    
        public String getCode() {
            return code;
        }
    
        public void setCode(String code) {
            this.code = code;
        }
    
        public static String getDesc(String code) {
            for (ThreeElementIdentifyMaskEnum value : ThreeElementIdentifyMaskEnum.values()) {
                if (value.code.equals(code))
                    return value.desc;
            }
            throw new RuntimeException("未知加密方式:" + code);
        }
    
        public String getDesc() {
            return desc;
        }
    
        public void setDesc(String desc) {
            this.desc = desc;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    错误码枚举类,错误码在返回结果中是英文的,详情如下:

    在这里插入图片描述

    这个枚举类是为了返回中文提示

    package org.jeecg.modules.aliyun.enums;
    
    /**
     * 姓名、身份证、手机号码三要素校验三要素错误码枚举类
     *
     * @author:gan
     * @date: 2023-10-24 09:41
     */
    public enum ThreeElementIdentifyErrorCodeEnum {
        OperatorLimit("200", "OperatorLimit", "该号码受运营商限制"),
        MobileNumberIllegal("400", "MobileNumberIllegal", "手机号码格式错误"),
        EncyrptTypeIllegal("400", "EncyrptTypeIllegal", "手机号加密类型非法"),
        CarrierIllegal("400", "CarrierIllegal", "运营商类型非法"),
        CertCodeIllegal("400", "CertCodeIllegal", "身份证号码格式错误"),
        MobileNumberTypeNotMatch("400", "MobileNumberTypeNotMatch", "号码与号码类型不匹配"),
        AuthCodeNotExist("400", "AuthCodeNotExist", "该标签申请单不存在,请重新更换授权码"),
        Unknown("500", "Unknown", "未知异常"),
        SystemError("500", "SystemError", "系统异常");
    
        private String status;  //HTTP状态
        private String code;  //错误码
        private String desc;  //错误描述
    
        ThreeElementIdentifyErrorCodeEnum(String status, String code, String desc) {
            this.status = status;
            this.code = code;
            this.desc = desc;
        }
    
        public String getStatus() {
            return status;
        }
    
        public void setStatus(String status) {
            this.status = status;
        }
    
        public static String getDesc(String code) {
            for (ThreeElementIdentifyErrorCodeEnum value : ThreeElementIdentifyErrorCodeEnum.values()) {
                if (value.code.equals(code))
                    return value.desc;
            }
            throw new RuntimeException("未知验证结果错误码:" + code);
        }
    
        public String getDesc() {
            return desc;
        }
    
        public void setDesc(String desc) {
            this.desc = desc;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    验证结果状态枚举类

    package org.jeecg.modules.aliyun.enums;
    
    /**
     * 姓名、身份证、手机号码三要素校验返回验证结果状态枚举类
     *
     * @author:gan
     * @date: 2023-10-24 09:41
     */
    public enum ThreeElementIdentifyConsistentEnum {
        STATUS_0("0", "不一致"),
        STATUS_1("1", "一致"),
        STATUS_2("2", "查无");
    
        private String status;
        private String desc;
    
        ThreeElementIdentifyConsistentEnum(String status, String desc) {
            this.status = status;
            this.desc = desc;
        }
    
        public String getStatus() {
            return status;
        }
    
        public void setStatus(String status) {
            this.status = status;
        }
    
        public static String getDesc(String status) {
            for (ThreeElementIdentifyConsistentEnum value : ThreeElementIdentifyConsistentEnum.values()) {
                if (value.status.equals(status))
                    return value.desc;
            }
            throw new RuntimeException("未知验证结果状态:" + status);
        }
    
        public String getDesc() {
            return desc;
        }
    
        public void setDesc(String desc) {
            this.desc = desc;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    3、调用接口的工具类(关键是这个)

    其中“VerifyUtil”是校验空参的工具类,放在这篇博客里面了,也可以用自己的方法校验。

    package org.jeecg.modules.aliyun.utils;
    
    import com.alibaba.fastjson.JSONObject;
    import com.aliyun.dytnsapi20200217.models.ThreeElementsVerificationRequest;
    import com.aliyun.dytnsapi20200217.models.ThreeElementsVerificationResponse;
    import com.aliyun.tea.TeaException;
    import com.aliyun.tea.TeaModel;
    import com.aliyun.teaopenapi.models.Config;
    import com.aliyun.teautil.models.RuntimeOptions;
    import com.google.gson.Gson;
    import org.jeecg.common.util.VerifyUtil;
    import org.jeecg.modules.aliyun.dto.AliyunConfig;
    import org.jeecg.modules.aliyun.dto.ThreeElementIdentifyRequestParam;
    import org.jeecg.modules.aliyun.enums.ThreeElementIdentifyConsistentEnum;
    import org.jeecg.modules.aliyun.enums.ThreeElementIdentifyErrorCodeEnum;
    
    import java.util.Arrays;
    import java.util.List;
    
    /**
     * 阿里云工具类
     *
     * @author:user
     * @date: 2022-09-02 16:36
     */
    public class AliyunUtil {
        public static void main(String[] args) throws Exception{
            ThreeElementIdentifyRequestParam param = new ThreeElementIdentifyRequestParam();
    
            param.setAccessKeyId("你的AccessKey ID");
            param.setAccessSecret("你的AccessKey Secret");
    
            param.setAuthCode("你的授权ID");
            param.setMask("你的加密方式");
            param.setInputNumber("你的手机号码");
            param.setCertCode("你的身份证号码");
            param.setName("你的名字");
    
            threeElementIdentify(param);
        }
    
        /**
         * 获取阿里云的公共Client(核验信息)
         * @param param 阿里云公共配置
         * @return
         * @throws Exception
         */
        private static com.aliyun.dytnsapi20200217.Client getVerifyClient(AliyunConfig param) throws Exception {
            //这是阿里云案例代码中拿过来的
            Config  config = new Config ();
            config.setAccessKeyId(param.getAccessKeyId());
            config.setAccessKeySecret(param.getAccessSecret());
    
            return new com.aliyun.dytnsapi20200217.Client(config);
        }
    
        /**
         * 处理返回结果
         * @param response
         * @return
         */
        private static JSONObject getResponseBody(TeaModel response) {
            //将返回的json转化成JSONObject
            JSONObject responseJsonObject = JSONObject.parseObject(new Gson().toJson(response));
    
            System.out.println("responseJsonObject: " + responseJsonObject);
    
            //拿返回结果中的body,需要取哪些信息后面自己取
            JSONObject bodyJsonObject = responseJsonObject.getJSONObject("body");
    
            return bodyJsonObject;
        }
    
        /**
         * 三要素(姓名、手机号和身份证号)识别
         * @param param
         */
        public static Boolean threeElementIdentify(ThreeElementIdentifyRequestParam param) throws Exception {
            List<String> noEmptyFieldList = Arrays.asList("accessKeyId", "accessSecret", "AuthCode", "Mask", "InputNumber", "CertCode", "Name");
            VerifyUtil.checkBeanByNonEmptyFiledList(param, noEmptyFieldList, "三要素校验信息");
    
            com.aliyun.dytnsapi20200217.Client client = getVerifyClient(param);
    
            ThreeElementsVerificationRequest request = new ThreeElementsVerificationRequest();
    
            request.setAuthCode(param.getAuthCode());
            request.setMask(param.getMask());
    
            request.setCertCode(param.getCertCode());
            request.setInputNumber(param.getInputNumber());
            request.setName(param.getName());
    
            ThreeElementsVerificationResponse response = null;
            try {
                response = client.threeElementsVerificationWithOptions(request, new RuntimeOptions());
            } catch (TeaException e) {
                e.printStackTrace();
    
                //这里主要是把报错信息从英文换为中文
                throw new RuntimeException(ThreeElementIdentifyErrorCodeEnum.getDesc(e.code) + "!");
            } catch (Exception e) {
                e.printStackTrace();
    
                throw new RuntimeException(e.getMessage());
            }
    
            JSONObject body = getResponseBody(response);
            //{"headers":{"access-control-allow-origin":"*","date":"Mon, 23 Oct 2023 10:11:26 GMT","content-length":"137","keep-alive":"timeout=25","x-acs-request-id":"35266210-AB31-5E73-88AC-509C5F0B3E79","connection":"keep-alive","content-type":"application/json;charset=utf-8","etag":"1mfbFqXYsVtweJZ6OSyCWpg9","access-control-expose-headers":"*","x-acs-trace-id":"fa79554ca5ea3ffc8a613a0f85426a8d"},"body":{"code":"OK","data":{"basicCarrier":"中国移动","isConsistent":1},"requestId":"35266210-AB31-5E73-88AC-509C5F0B3E79","message":"OK"},"statusCode":200}
    
            if (VerifyUtil.isEmpty(body) || (VerifyUtil.isNotEmpty(body) && body.size() < 1)) {
                throw new RuntimeException("三要素校验响应异常!");
            }
    
            if (!body.getString("code").equals("OK")) {
                throw new RuntimeException(body.getString("message"));
            }
    
            JSONObject data = body.getJSONObject("data");
            if (VerifyUtil.isEmpty(data) || (VerifyUtil.isNotEmpty(data) && data.size() < 1)) {
                throw new RuntimeException("三要素校验结果状态异常!");
            }
    
            String isConsistent = data.getString("isConsistent");
            if (!isConsistent.equals(ThreeElementIdentifyConsistentEnum.STATUS_1.getStatus())) {
                throw new RuntimeException("手机号码" + ThreeElementIdentifyConsistentEnum.getDesc(isConsistent) + "!");
            }
    
            return true;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
  • 相关阅读:
    【每日一题】包含所有字符的最小子串长度
    【吴恩达机器学习-笔记整理】设计复杂的机器学习系统(执行的优先级,误差分析,不对称性误差评估,精确度和召回率)
    Kubernetes——KubeSphere构建mysql集群
    【Spring MVC】MVC如何浏览器请求(service方法)
    STM32--PWR电源控制
    c++ -const和指针的关系 --每日学习八股文
    【开发环境】安装 Hadoop 运行环境 ( 下载 Hadoop | 解压 Hadoop | 设置 Hadoop 环境变量 | 配置 Hadoop 环境脚本 | 安装 winutils )
    学习响应式布局
    MyBatis关联中进行(级联)查询的方法分享
    小龙虾优化算法COA求解不闭合SD-MTSP,可以修改旅行商个数及起点(提供MATLAB代码)
  • 原文地址:https://blog.csdn.net/studio_1/article/details/134011701