微信官方文档:OCR身份证识别
此文章识别方式为直接上传图片文件进行OCR识别
另一种url识别可以参考:https://blog.csdn.net/tang_sy/article/details/113506844
代码:
public class OCRHttpClient {
//protected final Logger log = LoggerFactory.getLogger(this.getClass());
/**
* 通过身份证照片进行OCR认证
* @param multipartFile
* @param accessToken
* @return
* @throws Exception
*/
public String photoOCR(MultipartFile multipartFile, String accessToken) throws Exception{
// 身份证识别
String url = this.uploadCard("photo",accessToken);
return this.postForm(url, multipartFile);
}
/**
* 获取请求地址
* @param type
* @param accessToken
* @return
* @throws Exception
*/
public String uploadCard(String type, String accessToken) throws Exception {
String requestUrl = "https://api.weixin.qq.com/cv/ocr/idcard";
String params = "type=" + type + "&access_token=" + accessToken;
String url = requestUrl + "?" + params;
return url;
}
/**
* 发送请求
* @param multipartFile
* @return
*/
public String postForm(String urlPath, MultipartFile multipartFile) throws Exception{
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(urlPath);
try {
httpPost.setHeader("Content-Type", "multipart/form-data");
//构建文件实体
HttpEntity httpEntity = MultipartEntityBuilder.create()
.addBinaryBody("img", multipartFile.getBytes(), ContentType.MULTIPART_FORM_DATA, multipartFile.getOriginalFilename())
.build();
httpPost.setEntity(httpEntity);
// RequestConfig config = RequestConfig.custom()
// .setConnectTimeout(20000)
// .setSocketTimeout(20000)
// .build();
// httpPost.setConfig(config); // 请求配置
CloseableHttpResponse response = httpClient.execute(httpPost);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
// 解析响应
HttpEntity responseEntity = response.getEntity();
String responseString = EntityUtils.toString(responseEntity);
//log.info("success, body = " + responseString );
return responseString;
} else {
throw new IOException("request failed");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}
如需将结果转为实体类:
新建两个实体类:
FrontDto 接收正面识别数据**
@Getter
@Setter
@NoArgsConstructor
public class FrontDto {
private Integer errcode;
private String errmsg;
/**
* 正面或背面,Front / Back
*/
private String type;
/**
* 正面返回,姓名
*/
private String name;
/**
* 正面返回,身份证号
*/
private String id;
/**
* 正面返回,地址
*/
private String addr;
/**
* 正面返回,性别
*/
private String gender;
/**
* 正面返回,民族
*/
private String nationality;
/**
* 正面返回,生日
*/
private String birth;
/**
* 正面返回,属性
*/
private Integer card_property;
}
BackDto 接收反面数据
@Getter
@Setter
@NoArgsConstructor
public class BackDto {
private Integer errcode;
private String errmsg;
/**
* 正面或背面,Front / Back
*/
private String type;
/**
* 背面返回,有效期
*/
private String valid_date;
/**
* 正面返回,属性
*/
private Integer card_property;
/**
* 正面返回,签发单位
*/
private String authority;
}
业务处理层:
//ocr识别
String accessToken = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
OCRHttpClient ocrHttpClient = new OCRHttpClient();
String frontResult = ocrHttpClient.photoOCR(frontPhoto, accessToken);
String backResult = ocrHttpClient.photoOCR(backPhoto, accessToken);
//转成实体类
ObjectMapper objectMapper = new ObjectMapper();
FrontDto frontDto;
BackDto backDto;
frontDto = objectMapper.readValue(frontResult, FrontDto.class);
backDto = objectMapper.readValue(backResult, BackDto.class);