博主在开发项目时,需要使用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包,项目的文件,大家可以参考这篇博文进行组装。