基于uniapp和uniCloud实现人脸识别

784 阅读1分钟

一,前期准备

需要在uniapp的uniCloud目录下关联云空间和manifest,json文件中勾选FacialRecognitionVerify(实人认证),做完这些需要重新打一个自定义基座的包。

二,流程介绍

image.png

三,编写代码

1. 在uniCloud/cloudfunctions文件夹下新建一个云函数,下面是我的的云函数
'use strict'
const crypto = require('crypto')
exports.main = async (event, context) => {
	// console.log('这个是什么',event.step);
	// return
	// 获取实人认证实例
	const frvManager = await uniCloud.getFacialRecognitionVerifyManager({
		requestId: context.requestId
	})
	if (event.step == 1) {
		try {
			/**
			 * 获取certifyId
			 * @return certifyId 认证id,用于客户端调用认证接口及云函数获取认证结果
			 */
			const result = await frvManager.getCertifyId({
				realName: event.realName,
				idCard: event.idCard,
				metaInfo: event.metaInfo,
				needPicture: true //是否采集人脸照片
			})
			if (result.errCode == 0) return {
				code: 200,
				data: result.certifyId,
				msg: '获取certifyId成功'
			}
			return {
				code: 500,
				data: '',
				msg: `获取certifyId失败:${ result.errMsg }`
			}
		} catch (err) {
			console.log('err', err);
			return {
				code: 500,
				data: '',
				msg: '请检查您填写的姓名与身份证号是否正确'
			}
		}
	} else {
		// 获取认证结果
		const result = await frvManager.getAuthResult({
			certifyId: event.certifyId
		})
		if (result.authState == 'SUCCESS') return {
			code: 200,
			data: result
		}
		// 认证失败
		if (result.authState == 'FAIL') return {
			code: 500,
			data: result.certifyId,
			msg: `认证失败:${ result.errMsg }`
		}
		
	}
}

2.在调用之前可以加,获取摄像头等权限判断

		const metaInfo = uni.getFacialRecognitionMetaInfo()
		console.log(metaInfo)
		if(!metaInfo) {
			//提示当前设备不支持刷脸
			return
		}
        //在调用之前可以自己加一些获取摄像头权限等操作...
        uniCloud.callFunction({
			name: 'getCertifyId',
			data: { metaInfo, realName: idForm.name, idCard: idForm.idCard,step:1},
			success({ result }) {
				// return
				// 3. 客户端调起sdk刷脸认证
				uni.startFacialRecognitionVerify({
					certifyId: result.data,
					success(success) {
						console.log('拿到认证结果',success);
						//获取认证结果
						uniCloud.callFunction({
							name: 'getCertifyId',
							data: { certifyId:result.data},
							success({ result }) {
								console.log('校验成功',result);
								//你的人脸照片 临时链接只有15分钟 需要保存自己的服务器
								let userImgLink = result.pictureUrl
							    //TODO 对接后端...
								
							},
							fail(e) {
								console.log('校验失败',e);
								// uni.$u.toast('认证失败!')
							}
						})	
					},
					fail(e) {
						
					},
				})
			},
			fail(e) {
				//需要做报错处理
				
			}
		})