java-call Ali ID card verification interface

0. To use Alibaba Cloud, you need to obtain the corresponding information

Appcode, this needs to register with Alibaba Cloud and then find Appcode, and put it into the code. The third-party interface called here is the two elements of ID card verification (name + ID card)
注意:阿里云提供的这个身份证验证是有时间限制的,有效期应该是1年,自行查看

1. Import dependencies

<!-- 身份证识别-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.15</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.2.1</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpcore</artifactId>
    <version>4.2.1</version>
</dependency>
<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
</dependency>
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-util</artifactId>
    <version>9.3.7.v20160115</version>
</dependency>

2、HttpUtils

package com.ww.yaodao.util;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

public class HttpUtils {
    
    

    /**
     * get
     *
     * @param host
     * @param path
     * @param method
     * @param headers
     * @param querys
     * @return
     * @throws Exception
     */
    public static HttpResponse doGet(String host, String path, String method,
                                     Map<String, String> headers,
                                     Map<String, String> querys)
            throws Exception {
    
    
        HttpClient httpClient = wrapClient(host);

        HttpGet request = new HttpGet(buildUrl(host, path, querys));
        for (Map.Entry<String, String> e : headers.entrySet()) {
    
    
            request.addHeader(e.getKey(), e.getValue());
        }

        return httpClient.execute(request);
    }

    /**
     * post form
     *
     * @param host
     * @param path
     * @param method
     * @param headers
     * @param querys
     * @param bodys
     * @return
     * @throws Exception
     */
    public static HttpResponse doPost(String host, String path, String method,
                                      Map<String, String> headers,
                                      Map<String, String> querys,
                                      Map<String, String> bodys)
            throws Exception {
    
    
        HttpClient httpClient = wrapClient(host);

        HttpPost request = new HttpPost(buildUrl(host, path, querys));
        for (Map.Entry<String, String> e : headers.entrySet()) {
    
    
            request.addHeader(e.getKey(), e.getValue());
        }

        if (bodys != null) {
    
    
            List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();

            for (String key : bodys.keySet()) {
    
    
                nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key)));
            }
            UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8");
            formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
            request.setEntity(formEntity);
        }

        return httpClient.execute(request);
    }

    /**
     * Post String
     *
     * @param host
     * @param path
     * @param method
     * @param headers
     * @param querys
     * @param body
     * @return
     * @throws Exception
     */
    public static HttpResponse doPost(String host, String path, String method,
                                      Map<String, String> headers,
                                      Map<String, String> querys,
                                      String body)
            throws Exception {
    
    
        HttpClient httpClient = wrapClient(host);

        HttpPost request = new HttpPost(buildUrl(host, path, querys));
        for (Map.Entry<String, String> e : headers.entrySet()) {
    
    
            request.addHeader(e.getKey(), e.getValue());
        }

        if (StringUtils.isNotBlank(body)) {
    
    
            request.setEntity(new StringEntity(body, "utf-8"));
        }

        return httpClient.execute(request);
    }

    /**
     * Post stream
     *
     * @param host
     * @param path
     * @param method
     * @param headers
     * @param querys
     * @param body
     * @return
     * @throws Exception
     */
    public static HttpResponse doPost(String host, String path, String method,
                                      Map<String, String> headers,
                                      Map<String, String> querys,
                                      byte[] body)
            throws Exception {
    
    
        HttpClient httpClient = wrapClient(host);

        HttpPost request = new HttpPost(buildUrl(host, path, querys));
        for (Map.Entry<String, String> e : headers.entrySet()) {
    
    
            request.addHeader(e.getKey(), e.getValue());
        }

        if (body != null) {
    
    
            request.setEntity(new ByteArrayEntity(body));
        }

        return httpClient.execute(request);
    }

    /**
     * Put String
     * @param host
     * @param path
     * @param method
     * @param headers
     * @param querys
     * @param body
     * @return
     * @throws Exception
     */
    public static HttpResponse doPut(String host, String path, String method,
                                     Map<String, String> headers,
                                     Map<String, String> querys,
                                     String body)
            throws Exception {
    
    
        HttpClient httpClient = wrapClient(host);

        HttpPut request = new HttpPut(buildUrl(host, path, querys));
        for (Map.Entry<String, String> e : headers.entrySet()) {
    
    
            request.addHeader(e.getKey(), e.getValue());
        }

        if (StringUtils.isNotBlank(body)) {
    
    
            request.setEntity(new StringEntity(body, "utf-8"));
        }

        return httpClient.execute(request);
    }

    /**
     * Put stream
     * @param host
     * @param path
     * @param method
     * @param headers
     * @param querys
     * @param body
     * @return
     * @throws Exception
     */
    public static HttpResponse doPut(String host, String path, String method,
                                     Map<String, String> headers,
                                     Map<String, String> querys,
                                     byte[] body)
            throws Exception {
    
    
        HttpClient httpClient = wrapClient(host);

        HttpPut request = new HttpPut(buildUrl(host, path, querys));
        for (Map.Entry<String, String> e : headers.entrySet()) {
    
    
            request.addHeader(e.getKey(), e.getValue());
        }

        if (body != null) {
    
    
            request.setEntity(new ByteArrayEntity(body));
        }

        return httpClient.execute(request);
    }

    /**
     * Delete
     *
     * @param host
     * @param path
     * @param method
     * @param headers
     * @param querys
     * @return
     * @throws Exception
     */
    public static HttpResponse doDelete(String host, String path, String method,
                                        Map<String, String> headers,
                                        Map<String, String> querys)
            throws Exception {
    
    
        HttpClient httpClient = wrapClient(host);

        HttpDelete request = new HttpDelete(buildUrl(host, path, querys));
        for (Map.Entry<String, String> e : headers.entrySet()) {
    
    
            request.addHeader(e.getKey(), e.getValue());
        }

        return httpClient.execute(request);
    }

    private static String buildUrl(String host, String path, Map<String, String> querys) throws UnsupportedEncodingException {
    
    
        StringBuilder sbUrl = new StringBuilder();
        sbUrl.append(host);
        if (!StringUtils.isBlank(path)) {
    
    
            sbUrl.append(path);
        }
        if (null != querys) {
    
    
            StringBuilder sbQuery = new StringBuilder();
            for (Map.Entry<String, String> query : querys.entrySet()) {
    
    
                if (0 < sbQuery.length()) {
    
    
                    sbQuery.append("&");
                }
                if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) {
    
    
                    sbQuery.append(query.getValue());
                }
                if (!StringUtils.isBlank(query.getKey())) {
    
    
                    sbQuery.append(query.getKey());
                    if (!StringUtils.isBlank(query.getValue())) {
    
    
                        sbQuery.append("=");
                        sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8"));
                    }
                }
            }
            if (0 < sbQuery.length()) {
    
    
                sbUrl.append("?").append(sbQuery);
            }
        }

        return sbUrl.toString();
    }

    private static HttpClient wrapClient(String host) {
    
    
        HttpClient httpClient = new DefaultHttpClient();
        if (host.startsWith("https://")) {
    
    
            sslClient(httpClient);
        }

        return httpClient;
    }

    private static void sslClient(HttpClient httpClient) {
    
    
        try {
    
    
            SSLContext ctx = SSLContext.getInstance("TLS");
            X509TrustManager tm = new X509TrustManager() {
    
    
                public X509Certificate[] getAcceptedIssuers() {
    
    
                    return null;
                }
                public void checkClientTrusted(X509Certificate[] xcs, String str) {
    
    

                }
                public void checkServerTrusted(X509Certificate[] xcs, String str) {
    
    

                }
            };
            ctx.init(null, new TrustManager[] {
    
     tm }, null);
            SSLSocketFactory ssf = new SSLSocketFactory(ctx);
            ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
            ClientConnectionManager ccm = httpClient.getConnectionManager();
            SchemeRegistry registry = ccm.getSchemeRegistry();
            registry.register(new Scheme("https", 443, ssf));
        } catch (KeyManagementException ex) {
    
    
            throw new RuntimeException(ex);
        } catch (NoSuchAlgorithmException ex) {
    
    
            throw new RuntimeException(ex);
        }
    }
}

3. Write code

The code is the business layer, that is, the Service layer. The Controller layer can directly call this method.
RegisterVO is the data passed by the front end. The data is stored in the RegisterVO object. What is needed here is the real name and ID number, which is the following code idNo and name

 @Override
    public int addOneUser(RegisterVO registerVO) {
    
    
        /*
         * 重要提示如下:
         * 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
         */
        String host = "https://idenauthen.market.alicloudapi.com";
        String path = "/idenAuthentication";
        String method = "POST";
        String appcode = "第0步中获取的appcode";
        Map<String, String> headers = new HashMap<String, String>();
        //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
        headers.put("Authorization", "APPCODE " + appcode);
        //根据API的要求,定义相对应的Content-Type
        headers.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
        Map<String, String> querys = new HashMap<String, String>();
        Map<String, String> bodys = new HashMap<String, String>();
        bodys.put("idNo", registerVO.getIdentifyCard());
        bodys.put("name", registerVO.getUsername());
        try {
    
    
            HttpResponse response =
                    HttpUtils.doPost(host, path, method, headers, querys, bodys);
            if (response.getEntity() != null) {
    
    
                // 使用md5对密码、身份证进行加密
                registerVO.setPassword(PasswordUtils.generate(registerVO.getPassword()));
                registerVO.setIdentifyCard(PasswordUtils.generate(registerVO.getIdentifyCard()));
                // 糊涂工具类进行拷贝
                UserDO userDO = BeanUtil.copyProperties(registerVO, UserDO.class);
                userDO.setUtype(1);
                userDO.setAid(1);
                userDO.setPassword(md5Utils.getEncryptedPwd(registerVO.getPassword()));
                int insert = registerMapper.insert(userDO);
                return insert;
            }
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }

        return 0;
    }
}

4. Attachment: encryption verification tools

package com.ww.yaodao.util;

import org.apache.commons.codec.binary.Hex;

import java.security.MessageDigest;
import java.util.Random;

/**
 * MD5加盐加密
 */    
public class PasswordUtils {
    
    
    /**
     * @param password : 密码明文
     * 生成含有随机盐的密码
     */
    public static String generate(String password) {
    
    
        Random r = new Random();
        //sb盐值  16位
        StringBuilder sb = new StringBuilder(16);
        sb.append(r.nextInt(99999999)).append(r.nextInt(99999999));
        int len = sb.length();
        if (len < 16) {
    
      //不够16位,前面补0
            for (int i = 0; i < 16 - len; i++) {
    
    
                sb.append("0");
            }
        }
        String salt = sb.toString();
        //密码明文 + 盐值   使用md5加密
        password = md5Hex(password + salt); //32位的16进制
//        byte[] hashedBytes = md5Hex(password+salt);
        char[] cs = new char[48];
        //往密文插入盐值
        for (int i = 0; i < 48; i += 3) {
    
    
            cs[i] = password.charAt(i / 3 * 2);  //0
            char c = salt.charAt(i / 3); //0
            cs[i + 1] = c;  //cs[1] = 盐值1
            cs[i + 2] = password.charAt(i / 3 * 2 + 1);
        }
        return new String(cs);
    }
    /**
     * 校验密码是否正确
     * @param password: 明文
     * @param md5: 数据库密文
     *           bae5e3208a3c700e3db642b6631e95b9
     */
    public static boolean verify(String password, String md5) {
    
    
        char[] cs1 = new char[32];
        char[] cs2 = new char[16];
        for (int i = 0; i < 48; i += 3) {
    
    
            cs1[i / 3 * 2] = md5.charAt(i);
            cs1[i / 3 * 2 + 1] = md5.charAt(i + 2);
            cs2[i / 3] = md5.charAt(i + 1);
        }
        String salt = new String(cs2);
        // (明文+盐值) 密文  与密文比较
        return md5Hex(password + salt).equals(new String(cs1));
    }
    /**
     * 获取十六进制字符串形式的MD5摘要
     */
    public static String md5Hex(String src) {
    
    
        try {
    
    
            //得到消息摘要对象
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            //通过md5算法, 把src字符串, 加密成128位二进制
            byte[] bs = md5.digest(src.getBytes());
            //把128位二进制转换为16进账
            return new String(new Hex().encode(bs));
        } catch (Exception e) {
    
    
            return null;
        }
    }
    
}

Guess you like

Origin blog.csdn.net/qq_52998673/article/details/131080914