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.完事
大家可以去试一下