【人脸识别】百度人脸识别H5方案对接
百度人脸识别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_token
return 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 "";
}
}
@Data
public 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请求,怎么实现都OK
String 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;
}
});

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)