Files
2024-09-27 01:32:49 +08:00

156 lines
4.9 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\api\controller;
use think\Controller;
use think\Db;
use think\facade\Cache;
use think\Request;
/**
* api 入口文件基类,需要控制权限的控制器都应该继承该类
*/
class ApiController extends Controller
{
protected $middleware = [
'CrossDomain'
];
use SendController;
/** 成功码 */
const SUCCESS = 200;
/** 错误码传递参数提示1xxxxxx; 数据验证提示2xxxxx; 业务提示3xxxxx; */
const ERR_EMPTY_PARAM = 10000;
const ERR_PASSWORD_EMPTY_PARAM = 10001;
const ERR_ACCOUNT_EMPTY_PARAM = 10002;
const ERR_EMPTY_INPUT = 10003;
const ERR_NOT_AGREE_PROTOCOL = 10004;
const ERR_USER_PASSWORD = 20000;
const ERR_USER_TOKEN_INVALID = 40000;
const ERR_NONE = 40001;
const ERR_DENY = 40002;
const ERR_UPLOAD_FILE = 40003;
const ERR_ILLEGAL = 40004;
const ERR_EMPLOYEE_BALANCE = 40005;
const ERR_SMS_SEND = 40006;
const ERR_ERROR_PARAM = 40007;
const ERR_VERSION_MUST_UPGRADE = 40008;
const ERR_USER_TOKEN_EXPIRE = 400013;
const ERR_USER_REFRESH_TOKEN_EXPIRE = 40014;
const ERR_USER_TOKEN = 40015;
const ERR_ACCESS_TOKEN = 40016;
const ERR_APPID = 40017;
const ERR_ORDER_STATUS_ERROR = 80001;
/** 信息提示 */
const message = [
'SUCCESS' => "成功",
'ERR_EMPTY_PARAM' => "参数丢失",
'ERR_EMPTY_INPUT' => "请输入",
'ERR_PASSWORD_EMPTY_PARAM' => "请输入密码",
'ERR_ACCOUNT_EMPTY_PARAM' => "请输入手机号",
'ERR_ACCOUNT_PASSWORD' => "请输入正确的手机号和密码",
'ERR_USER_HAVE_LOCKED' => "账号已被冻结",
'ERR_USER_TOKEN_INVALID' => "请先登录",
'ERR_USER_TOKEN_EXPIRE' => "TOKEN已过期",
'ERR_USER_TOKEN' => "REFRESH_TOKEN错误",
'ERR_USER_REFRESH_TOKEN_EXPIRE' => "REFRESH_TOKEN已过期",
'ERR_ACCESS_TOKEN' => "access_token不存在或为空",
'ERR_APPID' => "appid错误",
'ERR_NONE' => "系统错误",
'ERR_DENY' => "拒绝请求",
'ERR_UPLOAD_FILE' => "文件上传失败,请重试",
'ERR_SMS_SEND' => "短信发送失败,请重试",
'ERR_ILLEGAL' => "非法请求",
'ERR_EMPLOYEE_BALANCE' => "用户账户异常",
'ERR_ERROR_PARAM' => "参数异常",
'ERR_ORDER_STATUS_ERROR' => "订单状态异常",
];
public static function getMessage($error)
{
return self::message[$error];
}
/**
* @var \think\Request Request实例
*/
protected $request;
protected $clientInfo;
protected $uid;
/**
* 不需要鉴权方法
*/
protected $noAuth = [];
/**
* 构造方法
* @param Request $request Request对象
*/
public function __construct(Request $request)
{
parent::__construct();
//初始化系统常量
$system_constant = Cache::get("SYSTEM_CONSTANT");
if (!$system_constant) {
$list = Db::name('constants')->column("param_value","param_name");
$system_constant = array();
foreach ($list as $k => $v) {
$system_constant[$k] = json_decode($v,true);
}
Cache::set('SYSTEM_CONSTANT', $system_constant,120);
}
//注意区别于缓存config方式只对当前请求有效
config('SYSTEM_CONSTANT',$system_constant);
$this->request = $request;
$this->init();
if(isset($this->clientInfo['client'])){
$this->uid = $this->clientInfo['client']['id'];
$this->clientInfo = $this->clientInfo['client'];
}
}
/**
* 初始化
* 检查请求类型,数据格式等
*/
public function init()
{
//所有ajax请求的options预请求都会直接返回200如果需要单独针对某个类中的方法可以在路由规则中进行配置
if ($this->request->isOptions()) {
return self::returnMsg(200, 'success');
}
$oauth = app('app\api\controller\OauthController'); //tp5.1容器,直接绑定类到容器进行实例化
$user_info = $oauth->authenticate();
if (!$oauth->match($this->noAuth)) {
if($user_info){
if(isset($user_info['refresh_expires_time']) && $user_info['refresh_expires_time'] < time()){
return self::returnMsg(self::ERR_USER_REFRESH_TOKEN_EXPIRE,self::getMessage('ERR_USER_REFRESH_TOKEN_EXPIRE'),[]);
}
if(!isset($user_info['expires_time']) || $user_info['expires_time'] < time()){
return self::returnMsg(self::ERR_USER_TOKEN_EXPIRE,self::getMessage('ERR_USER_TOKEN_EXPIRE'),[]);
}
$getCacheAccessToken = $oauth->certification($oauth::getClient());
if(!$getCacheAccessToken){
return self::returnMsg(self::ERR_ACCESS_TOKEN,self::getMessage('ERR_ACCESS_TOKEN'),[]);
}
$this->clientInfo = $user_info;
return $this->clientInfo;
}
return self::returnMsg(self::ERR_USER_TOKEN_INVALID,self::getMessage('ERR_USER_TOKEN_INVALID'));
}
$this->clientInfo = $user_info;
return $this->clientInfo;
}
}