微信小程序 OCR 身份证识别

微信官方文档: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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值