
从开通服务到用户刷脸成功返回结果,人脸核身的接入其实有一条清晰的路径。本文按照实际落地顺序,拆解每一步该做什么、容易卡在哪里,并给出服务端核心代码示例,帮你把整个流程一次走通。
接入之前,有三个问题需要先想清楚:
用哪个版本。 人脸核身有基础版、增强版、Plus 版等不同安全等级的产品,还有意愿核身、实名信息核验等专项能力。选择依据是业务的风险等级和合规要求。
走哪条接入渠道。 常见的渠道包括微信小程序、微信 H5、App SDK、PC 浏览器 H5,以及纯 API 调用。渠道决定了用户在什么界面上完成刷脸。
服务端准备做什么。 人脸核身不是纯客户端能力,需要服务端配合签发核身凭证、拉取核身结果。
腾讯云慧眼 SDK 的集成分为两部分:
客户端集成:将慧眼 SDK 集成到你的业务 App、小程序或网页中,负责采集人脸视频、执行活体检测、完成人脸比对。
服务端集成:在你的服务器上暴露接口,负责向腾讯云慧眼服务端申请核身凭证(SdkToken),并通过 SdkToken 拉取最终的核身结果。
两边配合,才能得到一次完整且可信的核身结论。
一次完整的人脸核身会经过以下步骤:
用户 → App → 业务服务端 → 慧眼服务端
↓ ↓ ↓
触发核身 请求Token 调用GetFaceIdToken
↓ ↓ ↓
收到Token ← 返回Token ← 返回SdkToken
↓
启动SDK(startHuiYanAuth)
↓
活体检测+人脸比对
↓
SDK回调通知结果
↓
业务服务端拉取结果(GetFaceIdResult)
↓
展示核身结果详细步骤说明:
步骤 | 执行方 | 动作 |
|---|---|---|
1 | 用户 | 触发业务流程启动,准备调用核身 |
2 | App | 初始化配置,请求业务服务端获取 SdkToken |
3 | 业务服务端 | 调用慧眼 API |
4 | 慧眼服务端 | 返回 SdkToken |
5 | 业务服务端 | 将 SdkToken 下发给 App |
6 | App | 调用 |
7 | SDK | 采集并上传用户数据(活体数据等) |
8 | 慧眼服务端 | 完成活体检测+人脸比对,返回结果 |
9 | SDK | 回调 App 通知核验完成 |
10 | App | 通知业务服务端获取结果 |
11 | 业务服务端 | 调用 |
12 | 慧眼服务端 | 返回核身结果 |
13 | 业务服务端 | 下发结果给 App |
14 | App | 展示核身结果 |
关键设计要点:第 3 步和第 11 步必须由服务端完成——Token 申请和结果拉取都走服务端签名请求,客户端无法伪造。
服务端需要对接两个核心接口:
接口 | 作用 | 调用时机 |
|---|---|---|
| 获取核身 SdkToken | 用户发起核身前 |
| 获取核身结果 | SDK 回调完成后 |
package main
import (
"encoding/json"
"log"
"net/http"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
faceid "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/faceid/v20180301"
)
var FaceIdClient *faceid.Client
func init() {
prof := profile.NewClientProfile()
prof.HttpProfile.ReqTimeout = 60
// 替换成你的 SecretId 和 SecretKey
credential := common.NewCredential("SecretId", "SecretKey")
var err error
FaceIdClient, err = faceid.NewClient(credential, "ap-guangzhou", prof)
if err != nil {
log.Fatal("FaceIdClient init error: ", err)
}
}
// GetFaceIdToken 获取人脸核身 Token
func GetFaceIdTokenHandler(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
compareLib := r.FormValue("CompareLib")
request := faceid.NewGetFaceIdTokenRequest()
request.CompareLib = &compareLib
response, err := FaceIdClient.GetFaceIdToken(request)
if err != nil {
w.Write([]byte("error: " + err.Error()))
return
}
result := map[string]string{
"FaceIdToken": *response.Response.FaceIdToken,
}
json.NewEncoder(w).Encode(result)
}
// GetFaceIdResult 获取核身结果
func GetFaceIdResultHandler(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
faceIdToken := r.FormValue("FaceIdToken")
request := faceid.NewGetFaceIdResultRequest()
request.FaceIdToken = &faceIdToken
response, err := FaceIdClient.GetFaceIdResult(request)
if err != nil {
w.Write([]byte("error: " + err.Error()))
return
}
result := map[string]string{
"Result": *response.Response.Result,
}
json.NewEncoder(w).Encode(result)
}import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.faceid.v20180301.FaceidClient;
import com.tencentcloudapi.faceid.v20180301.models.*;
public class FaceIdService {
private static final String SECRET_ID = "你的SecretId";
private static final String SECRET_KEY = "你的SecretKey";
private static final String REGION = "ap-guangzhou";
public static FaceidClient getClient() {
Credential cred = new Credential(SECRET_ID, SECRET_KEY);
HttpProfile httpProfile = new HttpProfile();
httpProfile.setReqMethod("POST");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
return new FaceidClient(cred, REGION, clientProfile);
}
// 获取 FaceIdToken
public static String getFaceIdToken(String compareLib) throws Exception {
FaceidClient client = getClient();
GetFaceIdTokenRequest req = new GetFaceIdTokenRequest();
req.setCompareLib(compareLib);
GetFaceIdTokenResponse resp = client.GetFaceIdToken(req);
return resp.getFaceIdToken();
}
// 获取核身结果
public static String getFaceIdResult(String faceIdToken) throws Exception {
FaceidClient client = getClient();
GetFaceIdResultRequest req = new GetFaceIdResultRequest();
req.setFaceIdToken(faceIdToken);
GetFaceIdResultResponse resp = client.GetFaceIdResult(req);
return resp.getResult();
}
}import json
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.faceid.v20180301 import faceid_client, models
class FaceIdService:
def __init__(self, secret_id, secret_key, region="ap-guangzhou"):
self.cred = credential.Credential(secret_id, secret_key)
self.region = region
http_profile = HttpProfile()
http_profile.reqMethod = "POST"
client_profile = ClientProfile()
client_profile.httpProfile = http_profile
self.client = faceid_client.FaceidClient(self.cred, region, client_profile)
def get_face_id_token(self, compare_lib="LIBRARY"):
req = models.GetFaceIdTokenRequest()
req.CompareLib = compare_lib
resp = self.client.GetFaceIdToken(req)
return resp.FaceIdToken
def get_face_id_result(self, face_id_token):
req = models.GetFaceIdResultRequest()
req.FaceIdToken = face_id_token
resp = self.client.GetFaceIdResult(req)
return resp.Result
# 使用示例
if __name__ == "__main__":
service = FaceIdService("你的SecretId", "你的SecretKey")
token = service.get_face_id_token()
print(f"Token: {token}")
# result = service.get_face_id_result(token)
# print(f"Result: {result}")渠道 | 适用场景 | 用户端形态 | 详细教程 |
|---|---|---|---|
微信小程序 | 微信生态内的业务 | 小程序内直接唤起 | 见文章 22 |
微信 H5 | 公众号、朋友圈跳转 | 网页内唤起摄像头 | 见文章 25 |
App SDK (Android) | 自有 Android App | 原生交互体验 | 见文章 23 |
App SDK (iOS) | 自有 iOS App | 原生交互体验 | 见文章 24 |
PC 浏览器 H5 | 网页端业务 | 需摄像头支持 | 见文章 25 |
如果业务主要在微信生态内,优先考虑小程序或微信 H5;如果是自有 App 且对交互体验要求高,选 App SDK。
GetFaceIdToken 接口已联通GetFaceIdResult 接口已联通腾讯云慧眼人脸核身提供小程序、H5、App SDK、API 等多种接入方式,可根据业务形态灵活组合。该系列产品正在限时特惠活动中,低至3.3折:https://cloud.tencent.com/act/pro/happynewyears
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。