经调研,百度的人脸识别使用场景比较广泛且准确率较高,项目上有用到,这里做一下记录,整体对接没有难度,按照文档操作就行。

一、准备工作

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;
				}
			});

在这里插入图片描述

Logo

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

更多推荐