// +---------------------------------------------------------------------- declare (strict_types = 1); namespace addon\wxchat\controller\member; use addon\wxchat\model\WxchatRealnameAuth; use think\facade\Request; use ywxapp\controller\FrontendBase; /** * 真人认证:多重认证 + AI 智能审核 + 人工复审 */ class Auth extends FrontendBase { /** * 提交认证资料 */ public function submit() { $uid = $this->auth->uid; $realName = trim((string) Request::post('real_name', '')); $idCard = trim((string) Request::post('id_card', '')); $frontImg = trim((string) Request::post('front_img', '')); $backImg = trim((string) Request::post('back_img', '')); $holdImg = trim((string) Request::post('hold_img', '')); $faceImg = trim((string) Request::post('face_img', '')); if (! $realName || strlen($idCard) < 15) { $this->error('请填写真实姓名与证件号'); } // 证件号脱敏存储(保留前4后4) $masked = substr($idCard, 0, 4) . str_repeat('*', max(0, strlen($idCard) - 8)) . substr($idCard, -4); $data = [ 'uid' => $uid, 'real_name' => $realName, 'id_card' => $masked, 'front_img' => $frontImg, 'back_img' => $backImg, 'hold_img' => $holdImg, 'face_img' => $faceImg, 'status' => 0, 'ai_result' => 0, 'ai_score' => 0, 'reject_reason' => '', 'update_at' => time(), ]; $exist = WxchatRealnameAuth::where('uid', $uid)->find(); if ($exist) { $exist->save($data); } else { $data['create_at'] = time(); (new WxchatRealnameAuth())->save($data); } // 触发 AI 智能审核 $this->aiCheck($uid); $this->success([], '已提交,审核中'); } /** * 我的认证状态(补充 AI 审核详情) */ public function status() { $uid = $this->auth->uid; $auth = WxchatRealnameAuth::where('uid', $uid)->find(); $this->success([ 'status' => $auth ? (int) $auth->status : -1, 'ai_result' => $auth ? (int) $auth->ai_result : 0, 'ai_score' => $auth ? (float) $auth->ai_score : 0, 'ai_detail' => $auth ? ($auth->ai_detail ?? '') : '', 'reject_reason' => $auth ? $auth->reject_reason : '', ]); } /** * AI 智能审核(接入 AiAuditService:本地启发式 / 真实 HTTP 服务,可配置切换) */ private function aiCheck($uid) { $auth = WxchatRealnameAuth::where('uid', $uid)->find(); if (! $auth) { return; } $result = \addon\wxchat\service\AiAuditService::audit([ 'uid' => $uid, 'real_name' => $auth->real_name, 'id_card' => $auth->id_card, 'front_img' => $auth->front_img, 'back_img' => $auth->back_img, 'hold_img' => $auth->hold_img, 'face_img' => $auth->face_img, ]); $auth->ai_score = $result['score']; $auth->ai_result = $result['result']; // 1-通过初筛 2-不通过 $auth->ai_detail = $result['detail'] ?? ''; $auth->save(); } /** * 人工复审(后台调用,建议加管理员鉴权) */ public function review() { $id = (int) Request::post('id', 0); $pass = (int) Request::post('pass', 0); $reason = trim((string) Request::post('reason', '')); $auth = WxchatRealnameAuth::find($id); if (! $auth) { $this->error('记录不存在'); } $auth->status = $pass ? 1 : 2; $auth->reject_reason = $pass ? '' : $reason; $auth->reviewer_id = $this->auth->uid ?? 0; $auth->review_at = time(); $auth->save(); // 审核通过 -> 标记资料真人认证 if ($pass) { \ywxapp\model\MemberProfile::where('uid', $auth->uid) ->update(['is_realname' => 1]); } $this->success([], $pass ? '已通过' : '已驳回'); } }