【人脸识别】百度人脸识别H5方案对接
经调研,百度的人脸识别使用场景比较广泛且准确率较高,项目上有用到,这里做一下记录,整体对接没有难度,按照文档操作就行。
一、准备工作
1、需要注册百度云开放平台(企业资质)注册指南
2、创建应用 指南
3、创建项目
二 、方案接入
我这边使用的是通过接口先上传用户信息,之后使用百度的人脸认证链接。
1、获取access_token
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;public class BaiduAuthService {private static final String AUTH_URL = "https://aip.baidubce.com/oauth/2.0/token";public static String getAccessToken(String apiKey, String secretKey) throws Exception {String url = String.format("%s?grant_type=client_credentials&client_id=%s&client_secret=%s",AUTH_URL, apiKey, secretKey);try (CloseableHttpClient httpClient = HttpClients.createDefault()) {HttpGet httpGet = new HttpGet(url);try (CloseableHttpResponse response = httpClient.execute(httpGet)) {if (response.getStatusLine().getStatusCode() == 200) {String responseBody = EntityUtils.toString(response.getEntity());// 解析 JSON 响应,提取 access_tokenreturn parseAccessToken(responseBody);}throw new RuntimeException("获取 Access Token 失败: " + response.getStatusLine());}}}private static String parseAccessToken(String json) throws Exception {ObjectMapper objectMapper = new ObjectMapper();JsonNode node = objectMapper.readTree(json);return node.get("access_token").asText();}
}
2、获取verify_token
private String verifyToken(String accessToken) {try {String url = "https://aip.baidubce.com/rpc/2.0/brain/solution/faceprint/verifyToken/generate?access_token=%s";JSONObject req = new JSONObject();req.put("plan_id", planId);String reqUrl = String.format(url, accessToken);String html = HttpRequestUtil.connect(reqUrl).header("Content-Type", "application/json").charset("utf-8").timeout(5000).json(JSON.toJSONString(req)).post().html();log.info("H5FaceRecognitionService | verifyToken | 获取verifyToken-百度-返回信息:{}", html);if (ObjectUtils.isEmpty(html)) {return "";}TokenData tokenData = JSONObject.parseObject(html, TokenData.class);if (ObjectUtils.isEmpty(tokenData) || !tokenData.isSuccess()) {return "";}JSONObject result = tokenData.getResult();if (ObjectUtils.isEmpty(result.getString("verify_token"))) {return "";}return result.getString("verify_token");} catch (Exception e) {return "";}}@Datapublic static class TokenData {private boolean success;private JSONObject result;private String log_id;}
3、提交用户信息
public SubmitInfoResp submitInfo(String userName, String idCardNumber, String verifyToken, String accessToken) {try {Map<String, Object> req = new HashMap<>();req.put("verify_token", verifyToken);req.put("id_name", userName);req.put("id_no", idCardNumber);req.put("certificate_type", 0);//大陆居民身份证String url = String.format(submitUserInfo, accessToken);//这个工具类HttpRequestUtil,自己完全可以按照okhttp进行请求,一个post请求,怎么实现都OKString resp = HttpRequestUtil.connect(url).header("Content-Type", "application/json").charset("utf-8").timeout(5000).json(JSON.toJSONString(req)).post().html();log.info(String.format("H5FaceRecognitionService | submitInfo | 提交用户信息-百度-返回信息:%s", resp));return JSON.parseObject(resp, SubmitInfoResp.class);} catch (Exception e) {log.error(String.format("H5FaceRecognitionService | submitInfoError 提交用户信息异常,异常信息:%s", e.getMessage()));return null;}}
4、如果提交用户信息成功, 此时构造百度的人脸认证链接:
//h5认证链接private static final String h5AuthUrl = "https://brain.baidu.com/face/print/?token=%s&successUrl=%s&failedUrl=%s";//这里需要给出successUrl/failedUrl:认证成功/失败之后会自动跳转,需要进行编码String.format(h5AuthUrl, verifyToken, successUrl, failedUrl)
最后就是前端页面开发了,这里我使用的是uniapp(不贴代码了,主要是window.location.href )
getH5FaceMatch(req).then((res) => {if (res.code == 200) {window.location.href = res.msg;}});