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