1、准备工作:
创建应用,应用创建见百度AI应用的创建以及AK、SK的获取
2、公安验证需要进行企业实名认证之后才可以使用,且只有一共500次的调用权限,之后需要充值来使用。
3、实现代码如下:
// 公安验证
public static String personverify(String accessToken,String fileUrl,String id_card_number,String name) {
// 请求url
//String filePath = "C:/Users/32249/Desktop/a.jpg";
String url = "https://aip.baidubce.com/rest/2.0/face/v3/person/verify";
String message = "";
try {
byte[] imgData = FileUtil.readFileByBytes(fileUrl);
String imgStr = Base64Util.encode(imgData);
Map<String, Object> map = new HashMap<>();
map.put("image", imgStr);
map.put("image_type", "BASE64");
map.put("id_card_number", id_card_number);
// 活体检测控制
/*NONE: 不进行控制
LOW:较低的活体要求(高通过率 低攻击拒绝率)
NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率)
HIGH: 较高的活体要求(高攻击拒绝率 低通过率)
默认NONE*/
map.put("liveness_control", "NONE");
map.put("name", name);
// 图片质量控制
/*NONE: 不进行控制
LOW:较低的质量要求
NORMAL: 一般的质量要求
HIGH: 较高的质量要求
默认 NONE*/
map.put("quality_control", "NONE");
String param = GsonUtils.toJson(map);
// 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
// String accessToken = "【调用鉴权接口获取的token】";
String result = HttpUtil.post(url, accessToken, "application/json", param);
// score 与公安小图相似度可能性,用于验证生活照与公安小图是否为同一人,有正常分数时为[0~100],推荐阈值80,超过即判断为同一人
System.out.println(result);
JsonObject jObject =new JsonParser().parse(result).getAsJsonObject();
String errorCode = jObject.get("error_code").getAsString();
if("0".equals(errorCode)) {
JsonObject resultObject = jObject.getAsJsonObject("result");
String score = resultObject.get("score").getAsString();
if(Integer.parseInt(score)>=80) {
message = "是同一个人";
}else {
message = "不是同一个人,请重新上传";
}
}else if("222350".equals(errorCode)) {
message = "公安网图片不存在或质量过低,请重新上传";
}else if("222351".equals(errorCode)) {
message = "身份证号与姓名不匹配或该身份证号不存在,请重新上传";
}else if("222352".equals(errorCode)) {
message = "身份证名字格式错误,请重新上传";
}else if("222353".equals(errorCode)) {
message = "身份证号码格式错误,请重新上传";
}else if("222354".equals(errorCode)) {
message = "公安库里不存在此身份证号,请重新上传";
}else if("222355".equals(errorCode)) {
message = "身份证号码正确,公安库里没有对应的照片,请重新上传";
}else if("222356".equals(errorCode)) {
message = "验证的人脸图片质量不符合要求,请重新上传";
}else if("222360".equals(errorCode)) {
message = "身份证号码或名字非法(公安网校验不通过),请重新上传";
}else if("222361".equals(errorCode)) {
message = "公安服务连接失败,请重新上传";
}else if("216600".equals(errorCode)) {
message = "输入身份证格式错误,请重新上传";
}else if("216601".equals(errorCode)) {
message = "身份证号和名字匹配失败,请重新上传";
}
} catch (Exception e) {
e.printStackTrace();
}
return message;
}
4、测试代码如下:
public static void main(String[] args) {
TestRenLian testRenLian = new TestRenLian();
String access_token = testRenLian.getAuth();
//公安验证
String wangUrl = "C:/Users/32249/Desktop/a.jpg";
String id_card_number = "142228199305231011";
String name = "王彦";
personverify(access_token,wangUrl,id_card_number,name);
}
5、注意事项:目前公安验证接口不支持传递网图