uni-app活体检测需前后端协同:前端按小程序/H5差异采集视频帧,压缩后上传;后端调用阿里云等合规服务判定,须严格匹配接口规范。

uni-app 本身不提供活体检测算法,调用活体检测 = 前端采集 + 后端调用合规云服务(如百度、阿里、腾讯)完成比对和判断。直接写 uni.chooseImage 或 camera.takePhoto 拍张照就上传,99% 过不了审。
必须确认后端已接入合规活体检测服务
活体检测不是前端能独立完成的事。你得先确认三件事:
- 后端是否已接入阿里云实人认证、腾讯云慧眼、百度人脸活体检测等具备等保/金融级资质的服务
- 该服务是否明确支持「前端采集视频帧 + 后端做活体判定」模式(绝大多数生产环境只接受这种模式)
- 你拿到的接口文档或 SDK 是否标注支持 H5 / 微信小程序 / App 三端(尤其注意:微信小程序
<camera></camera>的onFaceDetect事件只返回状态,不输出图像数据)
小程序和 H5 必须分开实现摄像头采集
二者 API 完全不互通,强行共用一套逻辑必崩:
- 微信小程序端:必须用
<camera mode="face"></camera>,基础库 ≥ 2.27.0 才有onFaceDetect;但实际采集要用takePhoto主动抓帧,每 300ms 一次,连续 5–8 帧(眨眼/张嘴动作最低要求) - H5 端:用
navigator.mediaDevices.getUserMedia获取流,再用canvas.getContext('2d').drawImage()截帧;iOS Safari 对getUserMedia支持不稳定,需 fallback 到input type="file" capture="user" - 所有帧必须压缩为 JPEG,单帧 ≤ 150KB(阿里云虽允 2MB,但超 200KB 易触发超时或被限流)
上传多帧时 uni.uploadFile 的双端陷阱
uni.uploadFile 在小程序和 H5 对 formData 处理逻辑完全不同:
- 小程序端:不支持直接 append base64 字符串;必须先用
uni.getFileSystemManager().writeFile写入临时文件,再传filePath - H5 端:可构造
FormData,但要把 base64 转成 Blob:fetch('data:image/jpeg;base64,' + str).then(res => res.blob()) - 后端接收字段名必须严格匹配——腾讯云要
image_list数组,阿里云要image单图 +image_type=FACE_LIVENESS,错一个字段名就返回LIVENESS_FAIL
活体失败时优先查光照和帧时间戳
看到 NO_FACE_DETECTED 或 LIVENESS_FAIL,别急着调后端参数:
- 小程序
<camera></camera>自动曝光不可控,强光/逆光/暗光下极易失败;必须在 UI 提示“请正对光线均匀的环境”,不能只靠算法扛 - 用
setTimeout控制截帧间隔在 iOS 微信里可能严重失准(JS 线程被节流),建议改用requestAnimationFrame+ 时间戳校验,确保帧间隔误差 - 后端返回的
liveness_score若接近阈值(如 0.69 vs 要求 0.7),大概率是单帧质量差,不是算法问题
最常被忽略的是:你以为在调“活体检测”,其实只是在把图传给后端;真正决定成败的,是采集帧的质量稳定性、上传路径的双端一致性、以及对云服务接口细节的抠字眼程度。


















