152 lines
4.7 KiB
JavaScript
152 lines
4.7 KiB
JavaScript
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' });
|
||
}
|
||
});
|
||
|
||
|