上传身份证照片提取身份信息,预填入各身份信息输入框
前端页面:
<el-form-item label="证件照片" prop="carownerIdcardpicturepath"><ImagePicker ref="IdcardImagePicker" :limit="1" :isShowTip="false"v-model="form.carownerIdcardpicturepath" @input="getIdcardValue" />
</el-form-item>
将身份证照片转base64后调取ocrIdcard身份证百度识别接口提取身份证详情信息
//身份证百度识别getIdcardValue(fileName) {if (this.form.id != null) {return;}const fileUrl = process.env.VUE_APP_BASE_API + fileName;console.log(fileUrl)this.getBase64(fileUrl,(imgData)=>{let noPrefixBase64Code = imgData.replace(/^data:image\/\w+;base64,/, '');ocrIdcard(noPrefixBase64Code).then(response =>{console.log(response);if(response.code=='200'){let userInfo=response.data;//提取到身份证详情信息this.form.userIdtype = "1";this.form.userName = userInfo.name;this.form.userIdcard = userInfo.cardno;this.form.userPermanentaddress = userInfo.address;}})})},
声明ocrIdcard接口:
import {ocrIdcard} from "@/api/vvv/utils";
ocrIdcard接口js:
//身份证识别
export function ocrIdcard(data) {return request({url: '/utils/baidu/ocrIdcard',method: 'post',data: data})
}
后端实现:
/*** 百度身份证OCR识别* @param imageStr base64码 不带文件头* @return*/@PostMapping(value = "/ocrIdcard")public AjaxResult ocrIdcard(@RequestBody String imageStr){//去掉多余的双引号String imageBase64= imageStr.replaceAll("\"","");String retData=baiduService.ocrIdcard(imageBase64);System.out.println("身份证识别返回结果:"+retData);JSONObject retjson =JSONObject.parseObject(retData);if(retjson!=null && retjson.getInteger("words_result_num")>0){JSONObject result=new JSONObject();JSONObject words=(JSONObject) retjson.get("words_result");result.put("photo", retjson.get("photo"));result.put("name", ((JSONObject) words.get("姓名")).get("words"));result.put("sex", ((JSONObject) words.get("性别")).get("words"));result.put("nation", ((JSONObject) words.get("民族")).get("words"));result.put("borndate", ((JSONObject) words.get("出生")).get("words"));result.put("cardno", ((JSONObject) words.get("公民身份号码")).get("words"));result.put("address", ((JSONObject) words.get("住址")).get("words"));return AjaxResult.success(result);}else{return AjaxResult.error("身份证未识别");}}
百度服务:
package com.ruoyi.framework.web.service;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.baidu.AuthService;
import com.ruoyi.common.baidu.util.GsonUtils;
import com.ruoyi.common.baidu.util.HttpUtil;
import org.springframework.stereotype.Service;import java.net.URLEncoder;/*** @Description: (百度服务)* @Author: 南极熊* @CreateTime: 2024-10-31 09:43*/
@Service
public class BaiduService {/*** https://ai.baidu.com/ai-doc/OCR/rk3h7xzck* 身份证OCR识别* @param imgStr base64码 不带文件头* @return*/public String ocrIdcard(String imgStr) {// 请求urlString url = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard";try {String imgParam = URLEncoder.encode(imgStr, "UTF-8");String param = "id_card_side=front&detect_risk=true&detect_photo=true&image=" + imgParam;String accessToken = AuthService.getOcrAuth();String result = HttpUtil.post(url, accessToken, param);//System.out.println(result);return result;} catch (Exception e) {e.printStackTrace();}return null;}
}
AuthService 服务:
package com.ruoyi.common.baidu;import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;public class AuthService {public static final String OCR_ACCESS_TOKEN_KEY="ocr_access_token_key";public static String getOcrAuth() {RedisCache redisCache= SpringUtils.getBean(RedisCache.class);String token= redisCache.getCacheObject(OCR_ACCESS_TOKEN_KEY);if(StringUtils.isNull(token)){// 官网获取的 API Key 更新为你注册的String clientId = "83oTWLqwQrSytD5bOLkCZffN";// 官网获取的 Secret Key 更新为你注册的String clientSecret = "M4KZpV3lD6zct3xeDQIosHSAQ3b5NRZ6";String access_token = getAuth(clientId, clientSecret);//存入redis 缓存 有效期28 天redisCache.setCacheObject(OCR_ACCESS_TOKEN_KEY,access_token,28, TimeUnit.DAYS);return access_token;}else {return token;}}/*** 获取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 =JSONObject.parseObject(result);String access_token = jsonObject.getString("access_token");return access_token;} catch (Exception e) {System.err.printf("获取token失败!");e.printStackTrace(System.err);}return null;}
}
Idea控制台效果: