活体检测需确认三件事:后端已接入合规人脸核验服务;服务支持前端采集+后端比对模式;SDK或接口明确支持H5/小程序双端。

uni-app 调用活体检测接口前必须确认的三件事
活体检测不是直接调 navigator.camera 拍张照就能过审的。你得先确认:
- 后端是否已接入合规的人脸核验服务(如阿里云实人认证、腾讯云慧眼、百度人脸活体检测 API),uni-app 本身不提供活体算法
- 该服务是否支持「前端采集 + 后端比对」模式(绝大多数要求如此,uni-app 只负责调摄像头拍视频/多帧图,上传给后端)
- 你拿到的 SDK 或接口文档是否明确支持 H5/小程序双端(uni-app 编译到微信小程序时,
camera组件行为和 H5 完全不同,权限、帧率、输出格式都受限)
uni-app 中正确调起摄像头并采集活体动作帧
微信小程序端必须用 <camera> 组件,H5 端需 fallback 到 MediaDevices.getUserMedia,二者 API 不互通。不要试图写一套代码跑通两端。
- 小程序端:启用
mode="face"并监听onFaceDetect事件(仅微信基础库 2.27.0+ 支持),但注意它只返回检测状态,不输出图像数据 - 实际采集建议用
takePhoto主动抓帧(小程序)或canvas.getContext('2d').drawImage()截帧(H5),每 300ms 抓一帧,连续捕获 5–8 帧(眨眼、张嘴等动作所需最小帧数) - 所有帧必须转成
base64或压缩为JPEG(单帧 ≤ 200KB),否则后端活体接口会拒绝(如阿里云要求单图 ≤ 2MB,但实际建议 ≤ 150KB 以保成功率)
上传活体帧到后端时绕不开的兼容性坑
uni-app 的 uni.uploadFile 在小程序和 H5 对 formData 处理不一致:
- 小程序端不支持直接传多张 base64 图片进
formData,必须先用uni.getFileSystemManager().writeFile写临时文件,再传filePath - H5 端可构造
FormData直接 append 多个Blob,但需手动将 base64 转为 Blob:fetch('data:image/jpeg;base64,' + str).then(res => res.blob()) - 后端接收字段名必须和接口文档严格一致(如腾讯云要
image_list数组,阿里云要image单图 +image_type=FACE_LIVENESS) - 必须携带有效
Content-Type: multipart/form-data; boundary=...,uni-app 默认会设,但若手动改 header 容易误删
活体检测失败时最常被忽略的两个检查点
错误信息里出现 "LIVENESS_FAIL" 或 "NO_FACE_DETECTED",别急着改算法参数:
- 检查采集时用户是否在强光/暗光/逆光环境下——小程序
<camera>自动曝光不可控,需提示用户“请正对光线均匀的环境” - 检查帧时间戳是否连续——如果用
setTimeout控制截帧间隔,iOS 微信下容易因页面切后台导致定时器堆积,最终上传的几帧其实是同一时刻的重复图
活体检测不是纯前端能力,它依赖后端模型、网络延迟、设备摄像头质量三者协同。把采集逻辑做稳,比调参更重要。


















