LoginController.php 9.28 KB
<?php

namespace app\wx\modules\user\controllers;

use Yii;
use app\wx\models\User as ClientUserModel;
use domain\user\User;
use common\helpers\Utils;
use common\helpers\Log as AppLog;
use domain\user\UserRepository;
use common\helpers\ImageManager;
use domain\user\PhoneCode;
use domain\system\SmsMessage;
use stdClass;

/**
 * 注册和登录 控制器
 */
class LoginController extends BaseController
{
    const CODE_EXPIRE = 120;
    /**
     * @return string
     */
    public function actionGetCode()
    {
        $e = new stdClass();
        $e->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/');
    }
}