From 0da11d41f5624b1ad00ce9d0e707397255b2acb6 Mon Sep 17 00:00:00 2001 From: wangfukang <15630117759@163.com> Date: Tue, 18 Aug 2026 08:26:53 +0800 Subject: [PATCH] 1 --- common/ieApi.js | 61 +++++++++++++++++++++++++++++-- common/ieRealNameAuth.js | 77 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 130 insertions(+), 8 deletions(-) diff --git a/common/ieApi.js b/common/ieApi.js index 05e85b4..40751bc 100644 --- a/common/ieApi.js +++ b/common/ieApi.js @@ -23,16 +23,71 @@ function unwrapIeProfileSave(res) { return res.result !== undefined ? res.result : res } +function isSuccessfulCode(code) { + if (code === undefined || code === null || code === '') return true + const value = Number(code) + if (Number.isNaN(value)) return true + return value === 200 +} + +function pickRealNameMessage(res, payload) { + const sources = [payload, res] + for (const item of sources) { + if (!item || typeof item !== 'object') continue + const message = item.message || item.msg || item.failReason || item.errorMessage || item.errorMsg + if (message) return message + } + return '' +} + +function parseBooleanValue(value) { + if (typeof value === 'boolean') return value + if (typeof value === 'number') return value === 1 + if (typeof value === 'string') { + const normalized = value.trim().toLowerCase() + if (!normalized) return null + if (['true', '1'].indexOf(normalized) !== -1) return true + if (['false', '0'].indexOf(normalized) !== -1) return false + } + return null +} + +function getRealNameVerified(payload) { + const direct = parseBooleanValue(payload) + if (direct !== null) return direct + if (payload && typeof payload === 'object') { + const realNameVerified = parseBooleanValue(payload.realNameVerified) + if (realNameVerified !== null) return realNameVerified + const verified = parseBooleanValue(payload.verified) + if (verified !== null) return verified + } + return false +} + function unwrapIeRealName(res) { if (!res) return null - if (res.success === false) { + const payload = res.result !== undefined ? res.result : (res.data !== undefined ? res.data : res) + const message = pickRealNameMessage(res, payload) + if (res.success === false || !isSuccessfulCode(res.code)) { return { realNameVerified: false, verified: false, - message: res.message || '实名认证未通过,请稍后重试' + message: message || '实名认证未通过,请稍后重试' } } - return res.result !== undefined ? res.result : res + const verified = getRealNameVerified(payload) + if (payload && typeof payload === 'object') { + return { + ...payload, + realNameVerified: verified, + verified + } + } + return { + realNameVerified: verified, + verified, + message + } } function unwrapIeHome(res) { diff --git a/common/ieRealNameAuth.js b/common/ieRealNameAuth.js index 0a0d590..d43a36c 100644 --- a/common/ieRealNameAuth.js +++ b/common/ieRealNameAuth.js @@ -15,6 +15,49 @@ function showLongToast(title, duration = 2000) { uni.showToast({ title: content, icon: 'none', duration }) } +function getErrorMessage(error, fallback) { + if (!error) return fallback + if (typeof error === 'string') return error + return error.message || error.msg || error.errMsg || fallback +} + +function isUserCancel(error) { + const message = getErrorMessage(error, '').toLowerCase() + return message.indexOf('cancel') !== -1 || message.indexOf('取消') !== -1 +} + +function isCameraPermissionError(error) { + const message = getErrorMessage(error, '').toLowerCase() + return message.indexOf('auth') !== -1 + || message.indexOf('permission') !== -1 + || message.indexOf('deny') !== -1 + || message.indexOf('denied') !== -1 + || message.indexOf('scope.camera') !== -1 + || message.indexOf('权限') !== -1 +} + +function showCameraPermissionGuide() { + return new Promise(resolve => { + uni.showModal({ + title: '需要摄像头权限', + content: '实名认证需要拍摄本人正脸照。请点击“去设置”开启小程序摄像头权限;如果 iPhone 系统仍拦截,请到系统设置 > 微信 > 相机中开启。', + confirmText: '去设置', + cancelText: '取消', + success: res => { + if (res.confirm && uni.openSetting) { + uni.openSetting({ + success: () => resolve(), + fail: () => resolve() + }) + return + } + resolve() + }, + fail: () => resolve() + }) + }) +} + function showInfoModal(title, content, confirmText = '知道了') { return new Promise(resolve => { uni.showModal({ @@ -59,6 +102,17 @@ function chooseImage(sourceType = ['camera'], camera = 'front') { const file = res.tempFiles && res.tempFiles[0] resolve((file && (file.tempFilePath || file.path)) || (res.tempFilePaths && res.tempFilePaths[0]) || '') } + const fail = error => { + if (isUserCancel(error)) { + resolve('') + return + } + if (isCameraPermissionError(error)) { + reject(new Error('未获得摄像头权限,请在微信设置中允许摄像头权限后重试')) + return + } + reject(error) + } if (uni.chooseMedia) { uni.chooseMedia({ count: 1, @@ -66,7 +120,7 @@ function chooseImage(sourceType = ['camera'], camera = 'front') { sourceType, camera, success, - fail: reject + fail }) return } @@ -74,7 +128,7 @@ function chooseImage(sourceType = ['camera'], camera = 'front') { count: 1, sourceType, success, - fail: reject + fail }) }) } @@ -209,8 +263,21 @@ async function chooseFacePictureBase64() { '请拍摄本人清晰正脸照片用于身份证三要素核验,照片只用于本次认证并会压缩到50KB以内。' ) if (!confirmed) return '' - const path = await chooseImage(['camera'], 'front') - if (!path) return '' + let path = '' + try { + path = await chooseImage(['camera'], 'front') + } catch (e) { + if (isCameraPermissionError(e)) { + await showCameraPermissionGuide() + } else { + showLongToast(getErrorMessage(e, '无法打开相机,请检查摄像头权限后重试'), 3000) + } + return '' + } + if (!path) { + showLongToast('未拍摄实名核验照片,已取消认证', 2200) + return '' + } uni.showLoading({ title: '照片处理中\n正在压缩图片', mask: true }) const compressOptions = [ { quality: 70, width: 480, height: 480 }, @@ -409,7 +476,7 @@ export async function ensureIeVerifiedBeforeAction(options = {}) { } return true } catch (e) { - showLongToast((e && e.message) || '认证未完成,请稍后重试', 2000) + showLongToast(getErrorMessage(e, '认证未完成,请稍后重试'), 2000) return false } }