findme-miniprogram-frontend/subpackages/realname/camera-verify.js
2025-12-27 17:16:03 +08:00

152 lines
4.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Page({
data:{
photoPath: '',
livenessSteps: ['请正对镜头', '请张张嘴', '请左右摇头', '请眨眨眼'],
stepIndex: 0,
isCapturing: false,
isUploading: false
},
onLoad(){
// 页面加载时检查并申请摄像头权限
this.checkCameraPermission();
},
async checkCameraPermission(){
try{
const setting = await new Promise((resolve) => {
wx.getSetting({ success: resolve, fail: () => resolve({}) });
});
// 检查是否已授权
if(!setting.authSetting || !setting.authSetting['scope.camera']){
// 未授权,主动申请
const result = await new Promise((resolve) => {
wx.authorize({
scope: 'scope.camera',
success: () => resolve({ granted: true }),
fail: () => resolve({ granted: false })
});
});
if(!result.granted){
// 用户拒绝了授权,需要引导去设置页
wx.showModal({
title: '需要摄像头权限',
content: '为了完成实名认证,需要访问您的摄像头。请在设置中开启摄像头权限。',
confirmText: '去设置',
success: (res) => {
if(res.confirm){
wx.openSetting({
success: (settingRes) => {
if(settingRes.authSetting && settingRes.authSetting['scope.camera']){
wx.showToast({ title: '授权成功', icon: 'success' });
} else {
wx.showToast({ title: '授权失败,无法使用摄像头', icon: 'none' });
}
}
});
}
}
});
}
}
}catch(err){
console.error('检查摄像头权限失败:', err);
}
},
onCameraError(e){
console.error('camera error', e);
let msg = '摄像头打开失败';
if(e.detail && e.detail.errMsg){
if(e.detail.errMsg.includes('permission')){
msg = '摄像头权限被拒绝,请前往设置开启';
} else if(e.detail.errMsg.includes('not available')){
msg = '摄像头不可用,请检查设备';
}
}
wx.showModal({
title: '摄像头错误',
content: msg,
confirmText: '去设置',
success: (res) => {
if(res.confirm){
wx.openSetting();
}
}
});
},
get currentHint(){
const { livenessSteps, stepIndex } = this.data;
return livenessSteps[Math.min(stepIndex, livenessSteps.length - 1)] || '';
},
canCapture(){
const { stepIndex, livenessSteps } = this.data;
return stepIndex >= livenessSteps.length;
},
onNextAction(){
const { stepIndex, livenessSteps } = this.data;
if (stepIndex < livenessSteps.length) {
const nextIndex = stepIndex + 1;
this.setData({ stepIndex: nextIndex }, () => {
// 若所有动作完成,自动拍照
if (nextIndex >= livenessSteps.length) {
setTimeout(() => {
this.onCapture();
}, 600);
}
});
}
},
async onCapture(){
if (!this.canCapture()){
wx.showToast({ title: '请先完成动作提示', icon: 'none' });
return;
}
if(this.data.isCapturing){
return; // 防止重复点击
}
this.setData({ isCapturing: true });
wx.showLoading({ title: '拍照中...', mask: true });
try{
const ctx = wx.createCameraContext();
const res = await new Promise((resolve, reject)=>{
ctx.takePhoto({
quality: 'high',
success: resolve,
fail: reject
});
});
// 临时文件需要及时处理,这里先保存路径
// 注意tempImagePath 仅在当前会话有效,需要尽快上传
this.setData({
photoPath: res.tempImagePath,
isCapturing: false
});
wx.hideLoading();
wx.showToast({ title: '拍照成功', icon: 'success', duration: 1500 });
}catch(err){
this.setData({ isCapturing: false });
wx.hideLoading();
console.error('拍照失败:', err);
let msg = '拍照失败,请重试';
if(err.errMsg){
if(err.errMsg.includes('permission')){
msg = '摄像头权限被拒绝,请前往设置开启';
} else if(err.errMsg.includes('not available')){
msg = '摄像头不可用';
}
}
wx.showToast({ title: msg, icon: 'none', duration: 2000 });
}
},
onRetake(){
this.setData({ photoPath: '' });
},
onSubmit(){
if(!this.data.photoPath){
wx.showToast({ title: '请先拍照', icon: 'none' });
return;
}
// TODO: 上传并提交认证
wx.showToast({ title: '已提交', icon: 'success' });
}
});