middleware('auth')->except(['login', 'wechat', 'wechatCallback']); } public function register(Request $request) { $user = Auth::user(); if ($request->isMethod('post')) { $request->validate([ 'username' => ['required', 'unique:users', new Checkmobile], 'password' => 'required|between:6,32|confirmed', 'password_confirmation' => 'required|between:6,32', 'code' => ['required', 'size:4', function ($attribute, $value, $fail) use ($request) { if ($value != SmsModel::where('mobile', $request->username)->where('used', 0)->latest()->value('code')) { return $fail('验证码不正确'); } }], ], [ 'username.required' => '手机号码必须填写', 'username.unique' => '手机号已经注册', 'code.required' => '验证码必须填写', 'code.size' => '验证码长度为:size位', 'password.required' => '登录密码必须填写', 'password.between' => '登录密码有误', 'password.confirmed' => '确认密码与登录密码不一致', 'password_confirmation.required' => '确认密码必须填写', 'password_confirmation.between' => '确认密码有误', ]); $user->username = $request->username; $user->password = $request->password; $user->save(); return $this->success('设置成功', route('index')); } else { return view('auth.register'); } } /** * 用户登录 * * @Author: * @Date:2018-11-07T13:47:02+0800 * @param Request $request */ public function login(Request $request) { if ($request->isMethod('POST')) { $validator = Validator::make($request->all(), [ 'username' => 'required|mobile|exists:users', 'password' => 'required|between:6,32', ], [ 'username.required' => '手机号码必须填写', 'username.mobile' => '手机号码格式不正确', 'username.exists' => '手机号码不存在', 'password.required' => '登录密码必须填写', 'password.between' => '登录密码应在:min-:max位之间', ]); if ($validator->fails()) { return $this->error($validator->errors()->first()); } $cert = [ 'username' => $request->username, 'password' => $request->password, ]; if (Auth::attempt($cert, true)) { return $this->success('登录成功', route('index')); } else { return $this->error('用户名或密码不存在'); } } else { return view('auth.login'); } } /** * 微信登录 、微信快速注册 * * 注册完之后,在这里没有办法判断推荐关系 * * @Author: * @Date:2018-11-07T13:44:34+0800 * @param Request $request */ public function wechat(Request $request) { if (strpos($request->server('HTTP_USER_AGENT'), 'MicroMessenger') !== false) { if ($request['share_uid']) { session(['parent_id' => $request['share_uid']]); } if ($request['r']) { session(['r' => $request['r']]); } $app = app('wechat.official_account'); $app['config']->set('oauth.callback', 'login/wechatCallback'); return $app->oauth->redirect(); } else { return redirect()->route('authlogin'); } } public function wechatCallback(Request $request) { try { $app = app('wechat.official_account'); $weUser = $app->oauth->user(); $callback = $request['callback'] ?? ''; $openUser = $app->user->get($weUser->id); $oldUser = User::where('openid', $weUser->id)->first(); if ($oldUser) { $oldUser->info()->update([ 'headimgurl' => $weUser->getOriginal()['headimgurl'], 'sex' => $weUser->getOriginal()['sex'], 'country' => $weUser->getOriginal()['country'], 'province' => $weUser->getOriginal()['province'], 'city' => $weUser->getOriginal()['city'], 'subscribe_at' => isset($openUser['subscribe_time']) ? date('Y-m-d H:i:s', $openUser['subscribe_time']) : null, 'subscribe_scene' => isset($openUser['subscribe_scene']) ? $openUser['subscribe_scene'] : '', ]); Auth::login($oldUser, true); if (!$oldUser->username) { return redirect()->route('register'); } else { $r = session('r', ''); if ($r) { return redirect($r); } else { return redirect()->route('index'); } } } else { $parent_id = session('parent_id', 0); $user = User::create( [ 'openid' => $weUser->id, 'parent_id' => $parent_id, ] ); $user->info()->create([ 'nickname' => $weUser->getOriginal()['nickname'], 'headimgurl' => $weUser->getOriginal()['headimgurl'], 'sex' => $weUser->getOriginal()['sex'], 'country' => $weUser->getOriginal()['country'], 'province' => $weUser->getOriginal()['province'], 'city' => $weUser->getOriginal()['city'], 'subscribe_at' => isset($openUser['subscribe_time']) ? date('Y-m-d H:i:s', $openUser['subscribe_time']) : null, 'subscribe_scene' => isset($openUser['subscribe_scene']) ? $openUser['subscribe_scene'] : '', ]); Session::forget('parent_id'); event(new Registered($user)); Auth::login($user, true); return redirect()->route('register'); } /** * 这个注册完成事件,只能把 updateOrCreate 这个方法拆分开来使用了 */ } catch (\Exception $e) { return redirect()->route('login'); } } /** * 退出登录 * @Author: * @Date:2018-11-07T13:46:45+0800 */ public function logout() { Auth::logout(); session()->flush(); return redirect()->route('login'); } /** * 发送验证码 * @Author: * @Date:2018-11-07T13:49:55+0800 * @return */ public function smsCode(Request $request) { $channel = $request->channel; $mobile = $request->username; switch ($channel) { case 'FORGOT': $validator = Validator::make($request->all(), [ 'username' => ['required', new Checkmobile], ], [ 'username.required' => '手机号码必须填写', 'username.mobile' => '手机号码格式不正确', 'username.exists' => '手机号码不存在', ]); break; case 'BIND': // 绑定手机号,要不存在才可以 $channel = 'DEFAULT'; $validator = Validator::make($request->all(), [ 'username' => ['required', 'unique:users', new Checkmobile], ], [ 'username.required' => '手机号码必须填写', 'username.mobile' => '手机号码格式不正确', 'username.unique' => '手机号码已经绑定', ]); break; default: $validator = Validator::make($request->all(), [ 'username' => ['required', new Checkmobile], ], [ 'username.required' => '手机号码必须填写', ]); break; } if ($validator->fails()) { return $this->error($validator->errors()->first()); } $res = SmsModel::verify_code($mobile); if ($res !== true) { return $this->error($res); } try { $code = \Sms::send($mobile, $channel); $config = config('rulong_sms'); if ($config['debug'] != true) { return $this->success('验证码发送成功'); } else { return $this->success('验证码发送成功' . $code); } } catch (\Exception $e) { return $this->error($e->getMessage()); } } }