BaseController.php 8.05 KB
<?php

namespace app\wx\controllers;

use Yii;
use yii\helpers\Url;
use yii\web\BadRequestHttpException;
use yii\db\Query;
use app\wx\models\Engineer;
use common\helpers\WxHelper;
use common\helpers\ImageManager;
use common\exts\wechat\Log as WxLog;
use common\helpers\Log as AppLog;
use common\helpers\PerformanceUtils;
use common\models\SysSetting;
use domain\engineer\EngineerRole;
use domain\engineer\EngineerStatus;
use domain\engineer\EngineerSkillTagsRepository;
use stdClass;
use function header;
use function in_array;
use function md5;
use function str_replace;
use function urlencode;


/**
 * 只有通过 微信 OAuth 验证后才能访问整个App,
 * 这是所有应用控制器的基类
 * Class BaseController
 * @package app\wx\controllers
 * @author lee.li <34923862@qq.com>
 * @date 2015/07/01
 */
class BaseController extends AppController
{
    /**
     * CSR验证,关闭后可以在不提交CSR验证码的情况下通过POST方式提交数据
     * @var bool
     */
    public $enableCsrfValidation = false;
    /** @var **/
    protected $wx;
    /** @var **/
    protected $site;

    /**
     * 初始化应用控制器,确保 mall id 的存在,有效启动程序,否则抛出异常。
     * @throws yii\web\BadRequestHttpException
     * @throws yii\web\BadRequestHttpException
     */
    public function init()
    {

        $this->initTempFilePaths();

        parent::init();

        $wxArray = $this->getWxArray();

        //重置应用的名称
        Yii::$app->name = $wxArray['name'];

        /**
         * 微信服务号配置
         */
        $this->wx = new stdClass();
        $this->site = new stdClass();

        $this->formatWx($wxArray);
        $this->formatSite($wxArray);

        $view = Yii::$app->view;
        $view->params['site']= $this->site;
    }

    /**
     * @return array|bool
     */
    private function getWxArray()
    {
        $wxArray = [
            'name' => '配件维修',
            'intro' => '报修',
            'logo_path' => '',
            'subscribe_title' => '报修',
            'subscribe_desc' => '报修',
            'subscribe_img'  => '',
            'subscribe_url' => '',
            'appid' => 'appid',
            'appsecret' => 'appsecret',
            'token' => 'token'

        ];
        return $wxArray;
    }

    /**
     * @param $wxArray
     */
    private function formatWx($wxArray)
    {
        /**
         * 工程师微信服务号信息
         */
        $this->wx->name = $wxArray['name'];//名称
        $this->wx->intro = $wxArray['intro'];//简介
        $this->wx->logo_url = $wxArray['logo_path'];//路径
        $this->wx->subscribe_title = $wxArray['subscribe_title']; // 公众号关注图文标题
        $this->wx->subscribe_desc = $wxArray['subscribe_desc']; // 公众号关注图文描述
        $this->wx->subscribe_img = $wxArray['subscribe_img']; // 公众号关注图文消息图片
        $this->wx->subscribe_url = $wxArray['subscribe_url']; // 公众号关注图文url

        $this->wx->appid  = $wxArray['appid'];// APPID
        $this->wx->appsecret = $wxArray['appsecret'];//APPSECRET
        $this->wx->token = $wxArray['token'];//微信TOKEN
    }

    /**
     * 获取 ID
     * @return int|string
     */
    public function getEngineerId()
    {
        return 0;
    }

    /**
     * @param $wxArray
     */
    private function formatSite($wxArray)
    {
        /**
         * 站点信息
         */
        $appUser = Yii::$app->getUser();
        $url = Yii::$app->request->getHostInfo() . Yii::$app->request->url;
        $this->site->url = $url;
        if (YII_ENV_DEV) {
            $this->site->base_url = Yii::$app->request->getHostInfo() . Yii::$app->request->baseUrl;
        } else {
            $this->site->base_url = Yii::$app->request->getHostInfo();
        }

        $am = Yii::$app->view->getAssetManager();
        $assets = $am->getBundle('app\wx\assets\AppAsset');

        $this->site->is_android = (int)$this->isAndroid();
        $this->site->assets_url = $assets->baseUrl;
        $this->site->is_login = !$appUser->isGuest;
        $this->site->title = $wxArray['name'];
        $search = array("\t", "\n", "\r");
        $this->site->desc = str_replace($search, '<br/>', $wxArray['intro']);
        $this->site->icon =  $wxArray['logo_path'];

        // 携带当前用户的邀请码参数,实现推荐用户功能
        $sn = '';

        $baseUrl = $this->site->base_url;
        $this->site->user_bridge_url = $sn ? ($baseUrl . '/wechat/bridging?sn=' . $sn . '&tourl=' . urlencode($this->site->url)) : '';
        $this->site->sn = $sn;

        $this->site->appid = 'appid';
        $this->site->timestamp = time();
        $this->site->noncestr = 'noncestr';
        $this->site->signature = 'signature';
    }

    /**
     * @return yii\web\Response
     */
    protected function handleMallAccessCtrl()
    {
        //AppLog::DEBUG("BaseController: handleMallAccessCtrl()" );
        $appUser = Yii::$app->getUser();
        if(YII_ENV_DEV && $appUser->isGuest){
            $uid = Yii::$app->params['testUID']; // 请在各自的config/params-local.php里配置
            $appUser->login(0);
            $this->goHome();
            return ;
        }
        //test和 prod 环境,进行微信登陆
        if ($appUser->isGuest){
            $this->handleOAuthRedirect();
        } else {
            $path = $this->request->get('jumppath');
            $model= $this->request->get('jumpmodel');
            $paramOne= $this->request->get('paramOne');
            if (!empty($path) && !empty($model)) {
                 $locationUrl = Yii::$app->params["baseUrl"]."/".$model."#".$path;
                 if (!empty($paramOne)) {
                     $locationUrl .= "/".urldecode($paramOne);
                 }
                 header("Location: $locationUrl");exit;
            }
        }

    }

    /**
     * @return yii\web\Response
     */
    private function handleOAuthRedirect()
    {
        $sn = Yii::$app->request->get("sn");

        //Yii::$app->response->redirect($OAuthUrl)->send();
        //Yii::$app->end();
    }


    /**
     * 是否是IOS端
     * 是否通过微信客户端来访问
     * LOG 记录时发现,
     * 在微信公众号里面第一次访问: $_SERVER ['HTTP_USER_AGENT'] 为 Mozilla/4.0
     * 第二次访问: $_SERVER ['HTTP_USER_AGENT'] 为
     * 苹果:
     * Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13E238 MicroMessenger/6.3.16 NetType/WIFI Language/zh_CN
     * 安卓(小米NOTE):
     * Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9b4) Gecko/2008030317 Firefox/3.0b4
     * @return bool
     */
    protected function isAndroid()
    {
//        if(false !== strpos($_SERVER ['HTTP_USER_AGENT'], 'Android') || !isset($_SERVER ['HTTP_USER_AGENT'])){
//            return true;
//        } else {
//            return false;
//        }
        return true;
    }

    //
    public function setPhoneCode($phone, $code)
    {
        Yii::$app->session['v_'.$phone] = array('create_time' => time(),'vCode' => md5($phone.'_'.$code));
    }

    public function getPhoneCode($phone)
    {
        return Yii::$app->session['v_'.$phone];
    }

    // 默认是300秒
    public function validatePhoneCode($phone, $code, $vaTime = 300)
    {
        $pCode = $this->getPhoneCode($phone);
        $cTime = time();
        if (empty($pCode)) {
            return -3;
        }
        if ($cTime > ($pCode['create_time'] + $vaTime)) {
            $this->unsetPhoneCode($phone);
            return -1;
        }
        if($pCode['vCode'] == md5($phone.'_'.$code)){
            return 0;
        }else{
            return -2;
        }
    }

    public function unsetPhoneCode($phone)
    {
        unset(Yii::$app->session['v_'.$phone]);
    }

    /**
     * 初始化web目录文件夹, 完成自动创建
     */
    private function initTempFilePaths()
    {
        // 临时文件
        $webRoot = Yii::getAlias('@webroot');
        $tmpFilePath = $webRoot . '/tmp';
        if (!is_dir($tmpFilePath)) {
            mkdir($tmpFilePath, 0777, true);
        }
    }
}