wxConfig = ['app_id' => env("WECHAT_MINI_PROGRAM_APPID"), 'secret' => env("WECHAT_MINI_PROGRAM_SECRET"), 'response_type' => 'array']; } //注册 public function register(Request $request) { $mobile = $request->input('mobile', ''); $password = $request->input('password', ''); $validator = Validator::make($request->all(), [ 'mobile' => 'required', 'password' => 'required|min:6', ]); if ($validator->fails()) { return $this->error($validator->errors()->first()); } if (UserService::checkUserByMobile($mobile)) { return $this->error('手机号已被占用'); } try { //手机验证码验证 if (\App::environment('production')){ SmsServer::checkSmsCodeByVerifyKey($mobile, $request->code); } } catch (Exception $exception) { return $this->error($exception->getMessage()); } $user = \App::make('getUserInstance'); //在 app/Providers/AppServiceProvider.php 里面可以创一个单例模式 $user->nickname = 'User' . mb_substr($mobile, 0, 6); $user->avatar = ''; $user->mobile = $mobile; $user->password = $password; //这个不是直接存密码,User模型中使用了修改器 //$user->register_ip = request()->ip(); $user->save(); return $this->success('创建成功!'); } //账号密码登录 public function login(Request $request) { $account = $request->input('account'); $password = $request->input('password'); $jpush_reg_id = $request->input('jpush_reg_id'); if (!$user = User::query()->where(['mobile' => $account])->orWhere(['email' => $account])->first()) { return $this->error('账号不存在'); } $credentials1 = ['mobile' => $account, 'password' => $password]; $credentials2 = ['email' => $account, 'password' => $password]; if (!auth('api')->attempt($credentials1) && !auth('api')->attempt($credentials2)) { return $this->error('密码错误!'); } $data = $this->doLogin($user, $jpush_reg_id); return $this->success($data); } //短信验证码登录 public function loginBySmsCode(Request $request) { try { if (!$user = User::query()->where(['mobile' => $request->mobile])->first()) { return $this->error('账号不存在'); } //手机验证码验证 SmsServer::checkSmsCodeByVerifyKey($request->mobile, $request->smsCode); //如果登录类型和 openid 不为空 $type = $request->type; if (isset($type) && !empty($type)) { if ($type == 'weixin') { if ($user->wx_openid != '') { return $this->error('已经绑定微信'); } $user->wx_openid = $request->openid; $user->save(); } } $data = $this->doLogin($request->mobile, $request->post('jpush_reg_id', '')); } catch (\Exception $exception) { return $this->error($exception); } return $this->success($data); } //APP第三方授权登录(微信) public function authLogin(Request $request) { try { $socialite = Socialite::driver('weixin')->stateless()->user(); $user = User::query()->where('open_id', $socialite->getId())->first(); if (!$user) { $data['open_id'] = $socialite->getId(); $data['user'] = []; } else { $account = $user->mobile ?: $user->email; $data = $this->doLogin($account, $request->post('jpush_reg_id', '')); } } catch (Exception $exception) { ErrorMsgServive::write($exception, requst()->url()); return $this->error('微信授权登录出错~'); } return $this->success($data); } //微信小程序登录(微信) public function miniProgram(Request $request) { try { $mini = Factory::miniProgram($this->wxConfig); $newMini = $mini->auth->session($request->input('code')); $iv = $request->input('iv'); $encryptData = $request->input('encryptData'); $decryptedData = $mini->encryptor->decryptData($newMini['session_key'], $iv, $encryptData); $openId = $decryptedData['openid']; $user = User::query()->where('open_id', $openId)->first(); if (!$user) { $data['open_id'] = $openId; $data['user'] = []; } else { $account = $user->mobile ?: $user->email; $data = $this->doLogin($account, $request->post('jpush_reg_id', '')); } } catch (Exception $exception) { ErrorMsgServive::write($exception, requst()->url()); return $this->error('微信授权登录出错~'); } return $this->success($data); } //微信小程序获取手机号 public function decryptPhone(Request $request) { $user = auth('api')->user(); try { $mini = Factory::miniProgram($this->wxConfig); $newMini = $mini->auth->session($request->input('code')); $iv = $request->input('iv'); $encryptData = $request->input('encryptData'); $decryptedData = $mini->encryptor->decryptData($newMini['session_key'], $iv, $encryptData); $user = User::query()->where('id', $user->id)->first(); $user->mobile = $decryptedData['purePhoneNumber']; $user->save(); } catch (\Exception $exception) { ErrorMsgServive::write($exception, requst()->url()); return $this->error('获取手机号出错~'); } return $this->success(); } //H5 应用进行微信授权登录 public function h5Oauth() { } //微信小程序 code public function miniCode() { } //执行登录 public function doLogin($user, $jpush_reg_id = null) { if (!empty($jpush_reg_id)) { //清除登陆过本设备的账号设备id User::query()->where('jpush_reg_id', $jpush_reg_id)->update(['jpush_reg_id' => '']); //当前登录用户绑定设备 $user->jpush_reg_id = $jpush_reg_id; //清除别名 JPushService::deleteAlias('user_id_' . $user->id); //设置极光推送别名 JPushService::updateAlias($user->jpush_reg_id, 'user_id_' . $user->id); } $user->online = 1; $user->last_login_time = date('Y-m-d H:i:s'); $user->last_login_ip = request()->ip(); if (!$user->save()) { return $this->error('数据保存失败'); } $token = Auth::guard('api')->fromUser($user); $userInfo = UserService::getUserInfoById($user->id); $data = [ 'token' => "Bearer " . $token, 'user_info' => $userInfo, ]; return $data; } //用户是否存在 public function isUserExist($account) { $user = User::where(['mobile' => $account]) ->orWhere(['email' => $account]) ->first(); if (!$user) { return false; } return $user; } //忘记密码 public function forgetPassword(Request $request) { if ($request->new_password != $request->confirm_password) { return $this->error('两次密码不一致'); } try { $user = User::find($this->user->id); //手机验证码验证 SmsServer::checkSmsCodeByVerifyKey($user->mobile, $request->smsCode); } catch (Exception $exception) { return $this->error($exception->getMessage()); } $user->password = $request->new_password; $user->save(); return $this->success(); } //退出 public function logout() { $user = auth('api')->user(); //清空极光别名 JPushService::updateAlias($user->jpush_reg_id, ''); $user->online = 0; $user->save(); auth('api')->logout(); return $this->success(); } }