success = false; $e->message = 'ok'; $e->codeDuration = self::CODE_EXPIRE; $action = $this->request->get('action'); $mobile = $this->request->get('mobile'); if (!Utils::isPhone($mobile)) { $e->message = '请输入合格手机号码'; return $this->renderJson($e); } if ('login' == $action) { $userInfo = ClientUserModel::findOne(['mobile' => $mobile]); if (empty($userInfo)) { $e->message = '登录失败,该手机未注册'; return $this->renderJson($e); } $code = $this->getLoginCode($mobile); $sms = new SmsMessage(); if ($code) { // 发送短信 $sms->sendLoginCode($mobile, $code); $e->message = '您的登录码已经发送,请注意查收短信!'; } else { $code = $this->setLoginCode($mobile); // 发送短信 $sms->sendLoginCode($mobile, $code); $e->message = '您的登录码已经发送,请注意查收短信!'; } } else { $userModel = ClientUserModel::findOne(['mobile' => $mobile]); $sms = new SmsMessage(); if ($userModel) { $e->message = '该手机号码已经注册过'; return $this->renderJson($e); } $phoneCode = $this->getRegisterCode($mobile); if ($phoneCode) { $code = $phoneCode; //发送短信 $sms->sendRegCode($mobile, $code); $e->message = '您的注册码已经发送,请注意查收短信!'; } else { $code = $this->setRegisterCode($mobile); //发送短信 $sms->sendRegCode($mobile, $code); $e->message = '您的注册码已经发送,请注意查收短信!'; } } $e->success = true; $e->testCode = $code; return $this->renderJson($e); } /** * @param $mobile * @return string */ private function setRegisterCode($mobile) { $session = Yii::$app->session; $code = Utils::randRegCode(6); $codeKey = $mobile."_".PhoneCode::REGISTER_TYPE; $sessionStr = json_encode(['content' => $code, 'expire_at' => time() + self::CODE_EXPIRE]); $session->set($codeKey, $sessionStr); return $code; } /** * @param $mobile * @return bool */ private function removeRegisterCode($mobile) { $session = Yii::$app->session; $codeKey = $mobile."_".PhoneCode::REGISTER_TYPE; return $session->remove($codeKey); } /** * @param $mobile * @return mixed */ private function getRegisterCode($mobile) { $session = Yii::$app->session; $codeKey = $mobile."_".PhoneCode::REGISTER_TYPE; $sessionContent = $session->get($codeKey); if (!$sessionContent) { return null; } $sessionContent = json_decode($sessionContent, true); if ($sessionContent && isset($sessionContent['expire_at']) && $sessionContent['expire_at'] > time()) { return $sessionContent['content']; } else { $session->remove($codeKey); return null; } } /** * @param $mobile * @return mixed */ private function getLoginCode($mobile) { $session = Yii::$app->session; $codeKey = $mobile."_".PhoneCode::LOGIN_TYPE; $sessionContent = $session->get($codeKey); if (!$sessionContent) { return null; } $sessionContent = json_decode($sessionContent, true); if ($sessionContent && isset($sessionContent['expire_at']) && $sessionContent['expire_at'] > time()) { return $sessionContent['content']; } else { $session->remove($codeKey); return null; } } /** * @param $mobile * @return string */ private function setLoginCode($mobile) { $session = Yii::$app->session; $code = Utils::randRegCode(6); $codeKey = $mobile."_".PhoneCode::LOGIN_TYPE; $sessionStr = json_encode(['content' => $code, 'expire_at' => time() + self::CODE_EXPIRE]); $session->set($codeKey, $sessionStr); return $code; } private function removeLoginCode($mobile) { $session = Yii::$app->session; $codeKey = $mobile."_".PhoneCode::LOGIN_TYPE; $session->remove($codeKey); } /** * 注册界面 * @return string */ public function actionRegister() { $e = new stdClass(); $e->success = false; $e->message = 'ok'; $name = $this->request->post('name'); $mobile = $this->request->post('mobile'); $code = $this->request->post('code'); $licensePic = $this->request->post('licensePic'); if (empty($name)) { $e->message = '车厂名称必填'; return $this->renderJson($e); } if (!Utils::isPhone($mobile)) { $e->message = '手机号码格式不对'; return $this->renderJson($e); } if (empty($code)) { $e->message = '验证码必填'; return $this->renderJson($e); } if (empty($licensePic)) { $e->message = '请上传营业执照'; return $this->renderJson($e); } // 校验验证码 $vcode = $this->getRegisterCode($mobile); if (empty($vcode)) { $e->message = '验证码已经超时请重新发送'; return $this->renderJson($e); } if ($vcode !== $code) { $e->message = '验证码不对'; return $this->renderJson($e); } // 检查车厂名称是否注册了 // 检查手机号码是否注册了 $userMobile = ClientUserModel::findOne(['mobile' => $mobile]); if ($userMobile) { $e->message = '该手机号已经注册过维修厂,请更换其他手机号'; return $this->renderJson($e); } $uData = [ 'mobile' => $mobile, 'name' => $name, 'user_name' => $mobile ]; $userEntity = User::create($uData); $this->removeRegisterCode($mobile); $saveImageInfo = ImageManager::mvUploadImage($licensePic, $userEntity->uuid); $userEntity->license_pic = $saveImageInfo[0].$saveImageInfo[1]; $userEntity->save(); // 必须用 app\wx\models\User 才能登录 $loginUserModel = ClientUserModel::findOne(['id' => $userEntity->id]); if ($this->processLogin($loginUserModel)) { $e->success = true; } else { $e->message = '注册成功但是登录失败'; } return $this->renderJson($e); } /** * @return string */ public function actionLogin() { $e = new stdClass(); $e->success = false; $e->message = 'ok'; $mobile = $this->request->post('mobile'); $code = $this->request->post('code'); if (!Utils::isPhone($mobile)) { $e->message = '手机号码格式不对'; return $this->renderJson($e); } if (empty($code)) { $e->message = '验证码必填'; return $this->renderJson($e); } // 校验验证码 $logVcode = $this->getLoginCode($mobile); if (empty($logVcode)) { $e->message = '该手机登录码过期'; return $this->renderJson($e); } if ($code != $logVcode ) { $e->message = '验证码有误,请确认!'; return $this->renderJson($e); } $where = ['mobile' => $mobile]; $userInfo = ClientUserModel::findOne($where); if (empty($userInfo)) { $e->message = '登录失败,该手机未注册'; return $this->renderJson($e); } if($this->processLogin($userInfo)) { $this->removeLoginCode($mobile); $e->success = true; } else { $e->message = '登录失败'; } return $this->renderJson($e); } /** * 处理用户登录逻辑 * @param User $userEntity * @return bool|void */ protected function processLogin($userEntity) { /** * 登陆时间为7000秒,目前微信API的access token 的 expires_in 为 7200秒 */ if(Yii::$app->getUser()->login($userEntity, 7000)) { return true; } return false; } public function actionLogout() { Yii::$app->user->logout(); $this->redirect('/order/'); } }