verify($params['account'], $params['code'], NoticeEnum::REGISTER_CAPTCHA_STAFF); if (!$result) { throw new Exception('验证码错误'); } $number = CoachUser::count()+1; $sn = sprintf("%03d", $number); $passwordSalt = Config::get('project.unique_identification'); $password = create_password($params['password'], $passwordSalt); $avatar = ConfigService::get('default_image', 'user_avatar'); CoachUser::create([ 'sn' => $sn, 'avatar' => $avatar, 'account' => $params['account'], 'password' => $password, // 'channel' => $params['channel'], ]); return true; } catch (\Exception $e) { self::setError($e->getMessage()); return false; } } /** * @notes 账号/手机号登录,手机号验证码 * @param $params * @return array|false * @author 段誉 * @date 2022/9/6 19:26 */ public static function login($params) { try { $where = ['account' => $params['account']]; $coachUser = CoachUser::where($where)->findOrEmpty(); if ($coachUser->isEmpty()) { throw new \Exception('账号不存在'); } //更新登录信息 $coachUser->login_time = time(); $coachUser->login_ip = request()->ip(); $coachUser->save(); //设置token $coachUserInfo = CoachUserTokenService::setToken($coachUser->id, $params['terminal']); //返回登录信息 $avatar = $coachUser->avatar ?: Config::get('project.default_image.user_avatar'); $avatar = FileService::getFileUrl($avatar); // $coach = Coach::where(['coach_user_id'=>$coachUser->id])->order('id desc')->findOrEmpty(); // if(!$coach->isEmpty()){ // $avatar = $coach->work_photo; // } return [ 'sn' => $coachUserInfo['sn'], 'account' => $coachUserInfo['account'], 'avatar' => $avatar, 'token' => $coachUserInfo['token'], ]; } catch (\Exception $e) { self::setError($e->getMessage()); return false; } } /** * @notes 退出登录 * @param $userInfo * @return bool * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author 段誉 * @date 2022/9/16 17:56 */ public static function logout($coachInfo) { //token不存在,不注销 if (!isset($coachInfo['token'])) { return false; } //设置token过期 return CoachUserTokenService::expireToken($coachInfo['token']); } /** * @notes 获取微信请求code的链接 * @param string $url * @return string * @author 段誉 * @date 2022/9/20 19:47 */ public static function codeUrl(string $url) { return WeChatService::getCodeUrl($url); } /** * @notes 公众号登录 * @param array $params * @return array|false * @throws \GuzzleHttp\Exception\GuzzleException * @author 段誉 * @date 2022/9/20 19:47 */ public static function oaLogin(array $params) { Db::startTrans(); try { //通过code获取微信 openid $response = WeChatService::getOaResByCode($params); $userServer = new WechatUserService($response, UserTerminalEnum::WECHAT_OA); $userInfo = $userServer->getResopnseByUserInfo()->authUserLogin()->getUserInfo(); // 更新登录信息 self::updateLoginInfo($userInfo['id']); Db::commit(); return $userInfo; } catch (\Exception $e) { Db::rollback(); self::$error = $e->getMessage(); return false; } } /** * @notes 小程序-静默登录 * @param array $params * @return array|false * @author 段誉 * @date 2022/9/20 19:47 */ public static function silentLogin(array $params) { try { //通过code获取微信 openid $response = WeChatService::getMnpResByCode($params); $userServer = new WechatUserService($response, UserTerminalEnum::WECHAT_MMP); $userInfo = $userServer->getResopnseByUserInfo('silent')->getUserInfo(); if (!empty($userInfo)) { // 更新登录信息 self::updateLoginInfo($userInfo['id']); } return $userInfo; } catch (\Exception $e) { self::$error = $e->getMessage(); return false; } } /** * @notes 小程序-授权登录 * @param array $params * @return array|false * @author 段誉 * @date 2022/9/20 19:47 */ public static function mnpLogin(array $params) { Db::startTrans(); try { //通过code获取微信 openid $response = WeChatService::getMnpResByCode($params); $userServer = new WechatUserService($response, UserTerminalEnum::WECHAT_MMP); $userInfo = $userServer->getResopnseByUserInfo()->authUserLogin()->getUserInfo(); // 更新登录信息 self::updateLoginInfo($userInfo['id']); Db::commit(); return $userInfo; } catch (\Exception $e) { Db::rollback(); self::$error = $e->getMessage(); return false; } } /** * @notes 更新登录信息 * @param $userId * @throws \Exception * @author 段誉 * @date 2022/9/20 19:46 */ public static function updateLoginInfo($userId) { $user = User::findOrEmpty($userId); if ($user->isEmpty()) { throw new \Exception('用户不存在'); } $time = time(); $user->login_time = $time; $user->login_ip = request()->ip(); $user->update_time = $time; $user->save(); } /** * @notes 小程序端绑定微信 * @param array $params * @return bool * @author 段誉 * @date 2022/9/20 19:46 */ public static function mnpAuthLogin(array $params) { try { //通过code获取微信openid $response = WeChatService::getMnpResByCode($params); $response['user_id'] = $params['user_id']; $response['terminal'] = UserTerminalEnum::WECHAT_MMP; return self::createAuth($response); } catch (\Exception $e) { self::$error = $e->getMessage(); return false; } } /** * @notes 公众号端绑定微信 * @param array $params * @return bool * @throws \GuzzleHttp\Exception\GuzzleException * @author 段誉 * @date 2022/9/16 10:43 */ public static function oaAuthLogin(array $params) { try { //通过code获取微信openid $response = WeChatService::getOaResByCode($params); $response['user_id'] = $params['user_id']; $response['terminal'] = UserTerminalEnum::WECHAT_OA; return self::createAuth($response); } catch (\Exception $e) { self::$error = $e->getMessage(); return false; } } /** * @notes 生成授权记录 * @param $response * @return bool * @throws \Exception * @author 段誉 * @date 2022/9/16 10:43 */ public static function createAuth($response) { //先检查openid是否有记录 $isAuth = UserAuth::where('openid', '=', $response['openid'])->findOrEmpty(); if (!$isAuth->isEmpty()) { throw new \Exception('该微信已经绑定其他账号'); } if (isset($response['unionid']) && !empty($response['unionid'])) { //在用unionid找记录,防止生成两个账号,同个unionid的问题 $userAuth = UserAuth::where(['unionid' => $response['unionid']]) ->findOrEmpty(); if (!$userAuth->isEmpty() && $userAuth->user_id != $response['user_id']) { throw new \Exception('该微信已经绑定其他账号'); } } //如果没有授权,直接生成一条微信授权记录 UserAuth::create([ 'user_id' => $response['user_id'], 'openid' => $response['openid'], 'unionid' => $response['unionid'] ?? '', 'terminal' => $response['terminal'], ]); return true; } /** * @notes 解绑微信(测试用) * @param $user_id * @return bool * @author ljj * @date 2023/1/11 10:35 上午 */ public static function unbinding($user_id) { $session = UserSession::where(['user_id'=>$user_id])->findOrEmpty()->toArray(); UserAuth::where(['user_id'=>$user_id,'terminal'=>$session['terminal']])->delete(); return true; } /** * @notes 更新用户头像昵称 * @param $post * @param $user_id * @return bool * @throws \think\db\exception\DbException * @author ljj * @date 2023/2/2 6:36 下午 */ public static function updateUser($post,$user_id) { Db::name('user')->where(['id'=>$user_id])->update(['nickname'=>$post['nickname'],'avatar'=>FileService::setFileUrl($post['avatar']),'is_new_user'=>0]); return true; } /** * @notes 重置登录密码 * @param $params * @return bool * @author 段誉 * @date 2022/9/16 18:06 */ public function resetPassword(array $params): bool { try { // Db::startTrans(); // 校验验证码 $smsDriver = new SmsDriver(); if (!$smsDriver->verify($params['mobile'], $params['code'], NoticeEnum::RESET_PASSWORD_CAPTCHA_STAFF)) { throw new \Exception('验证码错误'); } // 重置密码 $passwordSalt = Config::get('project.unique_identification'); $password = create_password($params['password'], $passwordSalt); $coachUser = CoachUser::where(['account'=>$params['mobile']])->findOrEmpty(); if($coachUser->isEmpty()){ throw new \Exception('账号不存在'); } // 更新 $coachUser->password = $password; $coachUser->save(); // Coach::where(['coach_user_id'=>$coachUser->id,'audit_status'=>CoachEnum::AUDIT_STATUS_PASS])->update([ // 'mobile' => $params['mobile'] // ]); // Db::commit(); return true; } catch (\Exception $e) { // Db::rollback(); self::setError($e->getMessage()); return false; } } /** * @notes 重置登录密码 * @param $params * @return bool * @author 段誉 * @date 2022/9/16 18:06 */ public function changePassword(array $params): bool { try { // Db::startTrans(); // 重置密码 $passwordSalt = Config::get('project.unique_identification'); $password = create_password($params['password'], $passwordSalt); $coachUser = CoachUser::where(['id'=>$params['coach_info']['coach_user_id']])->findOrEmpty(); // if($coachUser->isEmpty()){ // throw new \Exception('账号不存在'); // } // 更新 $coachUser->password = $password; $coachUser->save(); // Db::commit(); return true; } catch (\Exception $e) { // Db::rollback(); self::setError($e->getMessage()); return false; } } }