Java实现身份证识别注册

博主在开发项目时,需要使用Java完成身份证识别功能,如图所示:
在这里插入图片描述

后来,便采取了百度识别接口中的身份证识别技术,即通过该接口,实现识别身份证中的信息。下面是实现步骤:
首先,需要去百度平台开通百度身份证识别接口:
在开通后需要进行申请与创建应用:
在这里插入图片描述
接下来,我们需要通过读取身份证识别接口的文档进行调用,在这里博主将封装的源码分享出来:
项目目录:
在这里插入图片描述
项目源码:
AuthService.java

package IDcard;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.*;

import org.json.JSONObject;

public class AuthService {
    
    
	 /**
     * 获取权限token
     * @return 返回示例:
     * {
     * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",
     * "expires_in": 2592000
     * }
     */
    public static String getAuth() {
    
    
        // 官网获取的 API Key 更新为你注册的
        String clientId = "";//百度云应用的AK
        // 官网获取的 Secret Key 更新为你注册的
        String clientSecret = "";//百度云应用的SK
        return getAuth(clientId, clientSecret);
    }
 
    /**
     * 获取API访问token
     * 该token有一定的有效期,需要自行管理,当失效时需重新获取.
     * @param ak - 百度云官网获取的 API Key
     * @param sk - 百度云官网获取的 Securet Key
     * @return assess_token 示例:
     * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
     */
    public static String getAuth(String ak, String sk) {
    
    
        // 获取token地址
        String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
        String getAccessTokenUrl = authHost
                // 1. grant_type为固定参数
                + "grant_type=client_credentials"
                // 2. 官网获取的 API Key
                + "&client_id=" + ak
                // 3. 官网获取的 Secret Key
                + "&client_secret=" + sk;
        try {
    
    
            URL realUrl = new URL(getAccessTokenUrl);
            // 打开和URL之间的连接
            HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();
            // 获取所有响应头字段
            Map<String, List<String>> map = connection.getHeaderFields();
            // 遍历所有的响应头字段
            for (String key : map.keySet()) {
    
    
                System.err.println(key + "--->" + map.get(key));
            }
            // 定义 BufferedReader输入流来读取URL的响应
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String result = "";
            String line;
            while ((line = in.readLine()) != null) {
    
    
                result += line;
            }
            /**
             * 返回结果示例
             */
            System.err.println("result:" + result);
            JSONObject jsonObject = new JSONObject(result);
            String access_token = jsonObject.getString("access_token");
            return access_token;
        } catch (Exception e) {
    
    
            System.err.printf("获取token失败!");
            e.printStackTrace(System.err);
        }
        return null;
    }

}

Card.java

package IDcard;

import java.awt.Color;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.alibaba.fastjson.*;
import com.auto.model.User;
import com.card.util.Base64Util;
import com.card.util.FileUtil;
import com.card.util.HttpUtil;


public class Card {
    
    
	public User  CardFun(String path) {
    
    

	String idcardIdentificate ="https://aip.baidubce.com/rest/2.0/ocr/v1/idcard";
    // 本地图片路径
    String filePath ="E://card/"+path;
    User user=null;
    try {
    
    
        byte[] imgData = FileUtil.readFileByBytes(filePath);
        String imgStr = Base64Util.encode(imgData);
        // 识别身份证正面id_card_side=front;识别身份证背面id_card_side=back;
        String params = "id_card_side=front&" + URLEncoder.encode("image", "UTF-8") + "="
                + URLEncoder.encode(imgStr, "UTF-8");
        /**
         * 线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
         */
        String accessToken = AuthService.getAuth();//#####调用鉴权接口获取的token#####
        String result = HttpUtil.post(idcardIdentificate, accessToken, params);
       
        FunCard f=new FunCard();
        user=f.fun(result);
        System.out.println(user.toString());
       
       
    } catch (Exception e) {
    
    
        e.printStackTrace();
    }
    return user;
}

public static int getGray(Color pixel) {
    
    
    return (pixel.getRed()*30+pixel.getGreen()*60+pixel.getBlue()*10)/100;
}


}

FunCard.java 将获取的JSON字符提取拆分出来,保存到对象中。

package IDcard;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.auto.model.User;

public class FunCard {
    
    
	public User fun(String result){
    
    
		JSONObject jsonObject =JSONObject.parseObject(result);
        String data=jsonObject.getString("words_result");
        JSONObject jsonObj=JSON.parseObject(data);
        String name=jsonObj.getString("姓名");
        String people=jsonObj.getString("民族");
        String adress=jsonObj.getString("住址");
        String card=jsonObj.getString("公民身份号码");
        String sex=jsonObj.getString("性别");
        String birth=jsonObj.getString("出生");
        JSONObject jsonname=JSON.parseObject(name);
        String n=jsonname.getString("words");
        JSONObject jsonpeople=JSON.parseObject(people);
        String p=jsonpeople.getString("words");
        JSONObject jsonsex=JSON.parseObject(sex);
        String s=jsonsex.getString("words");
        JSONObject jsoncard=JSON.parseObject(card);
        String c=jsoncard.getString("words");
        JSONObject jsonbirth=JSON.parseObject(birth);
        String b=jsonbirth.getString("words");
        JSONObject jsonadress=JSON.parseObject(adress);
        String a=jsonadress.getString("words");
        User user=new User();
        user.setIdcard(c);
        user.setName(n);
        user.setPeople(p);
        user.setBirth(b);
        user.setSex(s);
        user.setAdress(a);
		return user;
		
	}
}

至于说需要的工具类,博主将其上传至资源中,有需要的可以下载
身份识别
里面含有JavaWeb相关的jar包,项目的文件,大家可以参考这篇博文进行组装。

猜你喜欢

转载自blog.csdn.net/pengxiang1998/article/details/114168196
今日推荐