upload project
This commit is contained in:
commit
06961cae04
422 changed files with 110626 additions and 0 deletions
152
subpackages/realname/camera-verify.js
Normal file
152
subpackages/realname/camera-verify.js
Normal file
|
|
@ -0,0 +1,152 @@
|
|||
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' });
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue