微信小程序 OCR 身份证识别

微信官方文档:OCR身份证识别
此文章识别方式为直接上传图片文件进行OCR识别
另一种url识别可以参考:https://blog.youkuaiyun.com/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);
### 微信小程序 OCR 身份证识别实现方法教程 #### 添加插件 为了在微信小程序中集成OCR身份证识别功能,开发者需先进入微信公众平台的小程序管理界面,在其中找到并添加官方提供的OCR插件[^1]。 #### 配置权限与环境设置 确保已开通相应的API接口权限,并完成必要的配置工作。对于具体的权限申请流程和所需材料,请参阅官方文档说明[^3]。 #### 编写代码逻辑 以下是用于发起OCR请求的基础代码框架: ```javascript const ocr = requirePlugin('wechat-plugin-ocr'); // 引入插件 // 发起OCR识别请求函数 function recognizeIDCard(imagePath){ return new Promise((resolve, reject)=>{ wx.request({ url: 'https://api.weixin.qq.com/cv/ocr/idcard', method:'POST', data:{ image:imagePath, config:{} }, success(res){ resolve(res.data); }, fail(err){ reject(err); } }); }); } Page({ onLoad(){ const imagePath = ''; // 图片路径 recognizeIDCard(imagePath).then(result=>{ console.log('Recognition Result:', result); }).catch(error=>console.error('Error occurred during recognition', error)); } }); ``` 此段代码展示了如何利用`wx.request()`发送HTTP POST请求至指定URL来执行OCR处理任务,并接收返回的结果数据。注意实际应用时应替换为真实的图片文件路径以及按照需求调整参数选项[^2]。 #### 处理响应结果 当接收到服务器端传回的数据包后,通常会包含解析出来的文字信息和其他辅助属性字段。可以根据具体应用场景进一步加工这些原始数据以便后续展示或存储操作[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值