RestController.php 4.23 KB
<?php

namespace filsh\yii2\oauth2server\controllers;

use Yii;
use yii\helpers\ArrayHelper;
use common\providers\MallLog;
use filsh\yii2\oauth2server\models\OauthClients;
use filsh\yii2\oauth2server\filters\ErrorToExceptionFilter;
use stdClass;
use function md5;

class RestController extends \yii\rest\Controller
{
    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return ArrayHelper::merge(parent::behaviors(), [
            'exceptionFilter' => [
                'class' => ErrorToExceptionFilter::className()
            ],
        ]);
    }

    /**
     * 封装给省采商城调用的API
     * @return bool|stdClass
     */
    public function actionGetAccessToken()
    {
        $result = new stdClass();

        $request = $this->module->getRequest();
        $requestData = $request->request;

        if (empty($requestData)) {
            $result->success = false;
            $result->desc = '请求参数不能为空';
            return $result;
        }

        MallLog::debug('封装给省采商城调用的API:  请求数据=>' . json_encode($requestData));
        // 参数检查
        if (!isset($requestData['timestamp']) || empty($requestData['timestamp'])) {
            $result->success = false;
            $result->desc = 'timestamp请求参数不能为空';
            return $result;
        }
        if (!isset($requestData['username']) || empty($requestData['username'])) {
            $result->success = false;
            $result->desc = 'username请求参数不能为空';
            return $result;
        }
        if (!isset($requestData['password']) || empty($requestData['password'])) {
            $result->success = false;
            $result->desc = 'password请求参数不能为空';
            return $result;
        }
        if (!isset($requestData['sign']) || empty($requestData['sign'])) {
            $result->success = false;
            $result->desc = 'sign请求参数不能为空';
            return $result;
        }

        $timestamp = $requestData['timestamp'];
        $username = $requestData['username'];
        $password = $requestData['password'];
        $sign = $requestData['sign'];

        // 将 username+password+timestamp+password MD5加密后转为小写
        $combineStr = $username . $password . $timestamp . $password;
        $validSign = strtolower(md5($combineStr));
        if (strcmp($validSign, $sign) != 0) {
            $result->success = false;
            $result->desc = '签名校验失败';
            return $result;
        }

        // 重设请求参数
        unset($request->request['timestamp'], $request->request['username'], $request->request['password'], $request->request['sign']);
        $request->request['grant_type'] = 'client_credentials';
        $request->request['client_id'] = $username;
        $request->request['client_secret'] = $password;
        $request->request['scope'] = 'user';

        // 校验参数成功, 返回API访问令牌
        $server = $this->module->getServer();
        $response = $server->handleTokenRequest($request);
        $responseParamters = $response->getParameters();
        // {"access_token":"d26aa8ed51462e79de2f2c5c06c6d7f996a462df","expires_in":86400,"token_type":"Bearer","scope":"user"}
        $result->success = true;
        $result->access_token = $responseParamters['access_token'];
        $result->expires_at = $responseParamters['expires_in'];

        // 更新数据库数据
        $oauthClient = OauthClients::findOne(["client_id" => $username, "client_secret" => $password]);
        if ($oauthClient) {
            $oauthClient->access_token = $result->access_token;
            $oauthClient->expired_at = $result->expires_at + time();
            $oauthClient->save();
        }
        return $result;
    }

    public function actionToken()
    {
        $server = $this->module->getServer();
        $request = $this->module->getRequest();
        $response = $server->handleTokenRequest($request);

        return $response->getParameters();
    }

    public function actionRevoke()
    {
        $server = $this->module->getServer();
        $request = $this->module->getRequest();
        $response = $server->handleRevokeRequest($request);

        return $response->getParameters();
    }
}