java调用百度api进行身份证识别

1.准备工作

百度身份证识别需要先获取accessToken,下面进行token的获取:

 public Map getToken() {

        Map token = new HashMap();
        //APIKey和SecretKey需要你在百度智能云平台添加应用拿到这两个值
        String APIKey = "";
        String SecretKey= "";
        String str = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + APIKey + "&client_secret=" + SecretKey;
        try {
            URL url = new URL(str);
            URLConnection connectionData = url.openConnection();
            connectionData.setConnectTimeout(2000);
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    connectionData.getInputStream(), "UTF-8"));
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }
            String datas = sb.toString();
            JSONObject jsonData = JSONObject.fromObject(datas);
            token.put("access_token", jsonData.getString("access_token").toString());
            token.put("session_key", jsonData.getString("session_key").toString());
            token.put("scope", jsonData.getString("scope").toString());
            token.put("refresh_token", jsonData.getString("refresh_token").toString());
            token.put("session_secret", jsonData.getString("session_secret").toString());
            token.put("expires_in", jsonData.getInt("expires_in"));
        } catch (Exception e) {
            System.out.println("请求异常,请重试!");
        }
        return token;
    }

如何获取APIKey和SecretKey:
在百度智能云控制台找到文字识别服务->创建应用->返回->管理应用,就能看到了
在这里插入图片描述
在这里插入图片描述

2.发送身份证,进行识别

创建实体类接受身份证信息

public class IdCardinfo{
    /**
     * 公民身份号码
     */
    private String IdNumber;

    /**
     * 性别
     */
    private String gender;

    /**
     * 民族
     */
    private  String nation;

    /**
     * 姓名
     */
    private  String name;

    /**
     * 住址
     */
    private String address;

    /**
     * 年龄
     */
    private String age;
}

调用api代码,注意参数是身份证人像图片转的base64编码

  //参数file是身份证转的base64编码
 public IdCardinfo IDCardRecognitionFront(String file) {
        IdCardinfo idCardFront = new IdCardinfo();
        // 身份证识别url========百度提供
        String idcardIdentificate = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard";
        try {
            String str1 = file.substring(0, file.indexOf("base64,"));
            String str2 = file.substring(str1.length() + 7, file.length());
            String params = "id_card_side=front&" + URLEncoder.encode("image", "UTF-8") + "="
                    + URLEncoder.encode(str2, "UTF-8");
            //调用获取access_token的方法
            String accessToken = getToken().get("access_token");
            JSONObject wordsResult = JSONObject.parseObject(HttpUtil.post(idcardIdentificate, accessToken, params));
            if(null!=wordsResult.getString("error_code")){
                if(wordsResult.getString("error_code").equals("17")){
                    return new ResponseDTO(ResultCode.FAIL, "身份证识别次数已用完!");
                }else{
                    return new ResponseDTO(ResultCode.FAIL, "系统错误,请重新上传!");
                }
            }

            String ss = wordsResult.getString("image_status");
            switch (ss) {
                case "reversed_side":
                    return new ResponseDTO(ResultCode.FAIL, "身份证正反面颠倒!");
                case "non_idcard":
                    return new ResponseDTO(ResultCode.FAIL, "上传的图片中不包含身份证!");
                case "blurred":
                    return new ResponseDTO(ResultCode.FAIL, "身份证模糊!");
                case "other_type_card":
                    return new ResponseDTO(ResultCode.FAIL, "其他类型证照!");
                case "over_exposure":
                    return new ResponseDTO(ResultCode.FAIL, "身份证关键字段反光或过曝!");
                case "over_dark":
                    return new ResponseDTO(ResultCode.FAIL, "身份证欠曝(亮度过低)!");
                case "unknown":
                    return new ResponseDTO(ResultCode.FAIL, "系统错误,请重新上传!");
            }
            String IdNumber = wordsResult.getJSONObject("words_result").getJSONObject("公民身份号码").getString("words");
            String gender = wordsResult.getJSONObject("words_result").getJSONObject("性别").getString("words");
            String nation = wordsResult.getJSONObject("words_result").getJSONObject("民族").getString("words");
            String name = wordsResult.getJSONObject("words_result").getJSONObject("姓名").getString("words");
            String address = wordsResult.getJSONObject("words_result").getJSONObject("住址").getString("words");
            String birth = wordsResult.getJSONObject("words_result").getJSONObject("出生").getString("words");
            idCardFront.setAddress(address);
            idCardFront.setGender(gender);
            idCardFront.setIdNumber(IdNumber);
            idCardFront.setName(name);
            idCardFront.setNation(nation);
            Calendar cal = Calendar.getInstance();
            int yearNow = cal.get(Calendar.YEAR);  //当前年份
            int monthNow = cal.get(Calendar.MONTH);  //当前月份
            int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH); //当前日期
            int yearBirth = Integer.parseInt(birth.substring(0, 4));
            int monthBirth = Integer.parseInt(birth.substring(4, 6));
            int dayOfMonthBirth = Integer.parseInt(birth.substring(6));
            int age = yearNow - yearBirth;   //计算整岁数
            if (monthNow <= monthBirth) {
                if (monthNow == monthBirth) {
                    if (dayOfMonthNow < dayOfMonthBirth){
                        age--;
                    } ;//当前日期在生日之前,年龄减一
                } else {
                    age--;//当前月份在生日之前,年龄减一
                }
            }
            idCardFront.setAge(String.valueOf(age));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return idCardFront;
    }

3.完事

大家可以去试一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值