Back.php 11.7 KB
<?php
use Action\WebAction;
use LibModels\Web\Passport\RegData;
use Passport\PassportModel;
use WebPlugin\Helpers;
use LibModels\Web\Passport\BackData;
use WebPlugin\AuthCode;
class BackController extends WebAction {
    
    /**
     * 找回密码
     */
    public function indexAction() {
        $banner = PassportModel::getLeftBanner(PassportModel::BACK_LFFT_BANNER_CODE);
        $data = array (
                'simpleHeader' => PassportModel::getSimpleHeader(),
                'backPage' => true,
                'back' => array (
                        'coverHref' => $banner ['url'],
                        'coverImg' => $banner ['img'],
                        'countryCode' => '86',
                        'countryName' => '中国',
                        'captchaUrl' => Helpers::url('/passport/images?t='.time()),
                        'countryList' => RegData::getAreasData() 
                ) 
        );
        $this->_view->display ( 'index', $data );
    }

    /**
     * 校验验证码
     */
    public function authcodeAction()
    {
        $phoneNum = $this->post('phoneNum', '');
        $area = intval($this->post('area', '86'));
        $verifyCode = $this->post('verifyCode', '');//图形验证码
        $data = array(
            'code' => 200,
            'message' => '验证成功'
        );
        if (PassportModel::verifyCode($verifyCode)) {
            if (Helpers::verifyEmail($phoneNum)) {
                $ret = PassportModel::getUserInfoByEmail($phoneNum);
                if (empty($ret)) {
                    $data['message'] = '该邮件账户不存在';
                    $data['code'] = 401;
                }
            } else if (Helpers::verifyMobile($phoneNum)) {
                $ret = PassportModel::getUserInfoByMobile($area, $phoneNum);
                if (empty($ret)) {
                    $data['message'] = '该手机号不存在';
                    $data['code'] = 402;
                }
            }
        } else {
            $data['message'] = '验证失败';
            $data['code'] = 400;
        }
        echo $this->echoJson($data);
    }
    
    /**
     * 邮箱
     */
    public function emailAction() {
        $phoneNum = $this->post ('phoneNum', '');
        $area = intval ($this->post('area', '86'));
        $verifyCode = $this->post('verifyCode', '');//图形验证码
        $ret = false;
        if(PassportModel::verifyCode($verifyCode)) {
            if (Helpers::verifyEmail($phoneNum)) { // 验证邮箱
                $email = $phoneNum;
                $data = BackData::sendCodeToEmail($email);
                if ($data ['code'] == 200) {
                    $ret = true;
                    $this->setSession('email', $email);
                    return $this->redirect ('sendemail');
                }
            } else if (Helpers::verifyMobile($phoneNum)) { // 验证手机号
                $mobile = $phoneNum;
                $data = BackData::sendCodeToMobile($mobile, $area);
                if ($data['code'] == 200) {
                    $ret = true;
                    $this->setSession ('mobile', $mobile );
                    $this->setSession ('area', $area );
                    $this->setSession ('verifyCode', $verifyCode );
                    return $this->redirect ('verification');
                }
            }
        }
        if(!$ret) {//重新找回密码页
            return $this->redirect('index');
        }
    }
    
    /**
     * 发送找回手机号短信
     * 
     * @return json
     */
    public function sendbackmobileAction()
    {
        $mobile = $this->post ('mobile', '');
        $area = intval ($this->post( 'area', '86' ));
        $verifyCode = $this->post ('verifyCode', '');//图形验证码
        $data = array('code' => 400, 'message' =>'验证失败');
        if(Helpers::verifyMobile($mobile) && PassportModel::verifyCode($verifyCode)) { // 验证手机号
            $data = BackData::sendCodeToMobile($mobile, $area);
        }
        echo $this->echoJson($data);
    }
    
    /**
     * 发送邮件页面
     */
    public function sendemailAction() {
        $email = $this->getSession ('email');
        if (empty ( $email )) {
            $this->redirect ('index');
        }
        $banner = PassportModel::getLeftBanner(PassportModel::BACK_LFFT_BANNER_CODE);
        $emailArr = explode('@', $email);
        $emailUrl = '';//邮箱地址
        $emailUrls = array('yoho.cn' =>'http://smail.yoho.cn');
        if(in_array($emailArr[1], $emailUrls)){
            $emailUrl = $emailUrls[$emailArr[1]];//邮箱后缀
        } else {
            $emailUrl = 'http://mail.'.$emailArr[1];
        }
        $data = array (
                'simpleHeader' => PassportModel::getSimpleHeader(),
                'sendEmail' => array (
                    'coverHref' => $banner ['url'],
                    'coverImg' => $banner ['img'],
                    'countrys' => array (),
                    'email' => $emailUrl
                ) 
        );
        $this->_view->display('send-email', $data);
    }
    
    /**
     * 重置密码页面
     */
    public function backcodeAction() 
    {
        $code = $this->get('code');//加密code兼容以前参数
        $info = $this->checkCode($code);
        $verifyState = false;//验证状态
        $ret = array();
        if (!empty ( $info )) {
            $verifyState = true;
            if(isset($info['uid'])) { //老版修改邮箱密码不处理
                $verifyState = false;//重新找回密码
            }
        } else {
            $ret = BackData::checkEmailCode($code);
            if(isset($ret['data']) && $ret['code'] == 200) {
                $verifyState = true;
            }
        }
        //验证失败
        if(!$verifyState)
        {
            return $this->redirect ('index');
        }
        $banner = PassportModel::getLeftBanner(PassportModel::BACK_LFFT_BANNER_CODE);
        $data = array (
                'simpleHeader' => PassportModel::getSimpleHeader(),
                'resetPage' => true,
                'resetPwd' => array (
                    'coverHref' => $banner ['url'],
                    'coverImg' => $banner ['img'],
                    'countrys' => array(),
                    'code' => $code 
                ) 
        );
        $this->_view->display('reset-pwd', $data);
    }
    
    /**
     * 更新密码接口
     */
    public function updateAction() 
    {
        $code = $this->post('code');//加密code兼容以前参数
        $password = $this->post('pwd');
        $info = $this->checkCode($code);
        $ret = false;
        $successType = '';
        if (Helpers::verifyPassword ($password)) {
            if(!empty($info)) { //手机号找回
                // 修改密码
                if (isset ( $info ['mobile'] )) { // 手机号修改密码
                    $mobile = $info ['mobile'];
                    $token = $info ['token'];
                    $area = $info ['area'];
                    $data = BackData::modifyPasswordByMobile($mobile, $token, $password, $area);
                    if ($data ['code'] == 200) {
                       $successType ='mobile';
                       $ret = true;
                    }
                } else if (isset ($info ['uid'])) { //其他方式修改密码,跳到找回密码首页
                    $ret = false;
                }
            } else { //新版邮箱修改接口
                $data = BackData::modifyPasswordByEmailCode($code, $password);
                if ($data ['code'] == 200) {
                    $successType = 'email';
                    $ret = true;
                }
            }
        } 
        if($ret) { //跳转到成功页
            $this->setSession('successType', $successType);
            return $this->redirect ('resetsuccess');
        }
        else {
            // 跳转错误页面
            return $this->redirect('index');
        }
    }
    
    /**
     * 重置密码成功
     */
    public function resetsuccessAction() 
    {
        $successType = $this->getSession('successType');
        //成功状态标识
        if(empty($successType)) {
            return $this->redirect('index');
        }
        $banner = PassportModel::getLeftBanner ( PassportModel::BACK_LFFT_BANNER_CODE );
        $data = array (
                'simpleHeader' => PassportModel::getSimpleHeader (),
                'resetSuccess' => array (
                    'coverHref' => $banner ['url'],
                    'coverImg' => $banner ['img'],
                    'countrys' => array () 
                ) 
        );
        //清除标识
        $this->setSession('successType', '');
        $this->_view->display ( 'reset-success', $data );
    }
    
    /**
     * 手机验证页面
     */
    public function verificationAction() 
    {
        $mobile = $this->getSession ('mobile');
        $area = $this->getSession ('area');
        $verifyCode = $this->getSession ('verifyCode');//图形验证码
        if (empty ($mobile) || !PassportModel::verifyCode($verifyCode)) {
            $this->redirect ('index');
        }
        $banner = PassportModel::getLeftBanner (PassportModel::BACK_LFFT_BANNER_CODE);
        $data = array (
                'simpleHeader' => PassportModel::getSimpleHeader (),
                'vertificationPage' => true,
                'verification' => array (
                    'coverHref' => $banner ['url'],
                    'coverImg' => $banner ['img'],
                    'mobile' => $mobile,
                    'area' => $area,
                    'verifyCode' => $verifyCode,
                    'countrys' => array () 
                ) 
        );
        $this->_view->display ('verification', $data);
    }
    
    /**
     * 手机找回密码验证
     */
    public function backmobileAction() 
    {
        $mobile = $this->post ( 'mobile' );
        $area = $this->post ( 'area' );
        $verifyCode = $this->post ( 'verifyCode' );//图形验证码
        $code = $this->post ( 'code' ); //手机验证码
        $data = array('code'=> 400, 'message' => '验证码错误!','data' => Helpers::url('/passport/back/index'));
        if ($this->getSession ( 'mobile' ) == $mobile && $this->getSession ( 'area' ) == $area && ! empty($code) 
            && PassportModel::verifyCode($verifyCode)) {
            $result = BackData::validateMobileCode ( $mobile, $code, $area );
            if ($result ['code'] == 200) {
                $str = json_encode ( array (
                        'mobile' => $mobile,
                        'area' => $area,
                        'token' => $result ['data'] ['token'],
                        'create_time' => time () 
                ) );
                $code = AuthCode::encode ( $str, PassportModel::BACK_FIND_SECRET_KEY );
                $url = '/passport/back/backcode?code=' . base64_encode ( $code );
                $data ['code'] = 200;
                $data['message'] = '验证成功';
                $data['data'] = Helpers::url($url);
            }
        }
        $this->echoJson($data);
    }
    
    /**
     * 检查code
     *
     * @param string $code            
     * @return boolean
     */
    private function checkCode($code) 
    {
        $code = base64_decode ( $code );
        $info = json_decode ( AuthCode::decode ( $code, PassportModel::BACK_FIND_SECRET_KEY ), true );
        if ($info ['create_time'] < 1 || (time () - $info ['create_time']) > 86400) {
            return array ();
        }
        return $info;
    }

}