BaseController.php 2.89 KB
<?php

namespace app\api\controllers;

use Yii;
use yii\rest\Controller as RestController;
use yii\filters\ContentNegotiator;
use yii\filters\RateLimiter;
use yii\web\Response;
use yii\filters\VerbFilter;
use yii\base\Exception;
use filsh\yii2\oauth2server\models\OauthAccessTokens as OauthAccessTokensModel;
use stdClass;

/**
 * 接口控制器基类
 * Class BaseController
 * @package apps\gdsc\api\controllers
 */
class BaseController extends RestController
{
    /** @var \yii\web\request **/
    public $request;
    /** @var \yii\web\response **/
    public $response;

    /** @inheritdoc **/
    public function behaviors()
    {
        return [
            'contentNegotiator' => [
                'class' => ContentNegotiator::className(),
                'formats' => [
                    'application/json' => Response::FORMAT_JSON
                ],
            ],
            'verbFilter' => [
                'class' => VerbFilter::className(),
                'actions' => $this->verbs(),
            ],
            'rateLimiter' => [
                'class' => RateLimiter::className(),
            ],
        ];
    }

    /**
     * 所有小程序端的API请求均需要调用handleMallAccessCtrl
     * @param \yii\base\Action $action
     * @return bool
     * @throws \yii\web\BadRequestHttpException
     */
    public function beforeAction($action)
    {
        if (!parent::beforeAction($action)) {
            return false;
        }

        // 必须在父类beforeAction之后执行接口访问控制处理
        $this->handleAccessCtrl();

        return true;
    }

    /**
     * @throws Exception
     */
    public function init()
    {
        parent::init();
        $this->request = Yii::$app->getRequest();
        $this->response = Yii::$app->getResponse();
    }

    /**
     * 所有省采接口的统一处理函数: 检查token访问令牌有效性
     * @return bool
     */
    protected function handleAccessCtrl()
    {
        /*$result = new stdClass();
        $result->success = false;

        // 必须使用post请求
        if (!$this->request->isPost) {
            $result->desc = "please_use_post_httP_request";
            exit(json_encode($result));
        }

        // 检查请求参数token是否存在
        $token = $this->request->post('token');
        if (empty($token)) {
            $result = new stdClass();
            $result->success = false;
            $result->desc = "token_not_exist";
            exit(json_encode($result));
        }

        // 检查请求参数token是否过期
        $findAccessTokenModel = OauthAccessTokensModel::findOne(['access_token' => $token]);
        if ($findAccessTokenModel) {
            $expiredAt = strtotime($findAccessTokenModel->expires);
            if (time() <= $expiredAt) {
                return true;
            }
        }

        $result->desc = "token_expired";
        exit(json_encode($result));*/
    }
}