347 lines
9.7 KiB
PHP
347 lines
9.7 KiB
PHP
<?php
|
||
/**
|
||
* Tiffany SMS API重构-公共类
|
||
*/
|
||
declare(strict_types=1);
|
||
|
||
class ControllerBase extends Phalcon\Mvc\Controller{
|
||
|
||
//公共助手
|
||
//public $_PublicHelper;
|
||
//日志助手
|
||
public $_LogObj;
|
||
//当前时间戳
|
||
public $current_time;
|
||
//当前时间
|
||
public $current_datetime;
|
||
//当天日期
|
||
public $current_date;
|
||
|
||
function initialize(){
|
||
//$this->_PublicHelper = new PublicHelper();
|
||
//$this->_LogObj = new LogClient();
|
||
//选择redis库(测试及开发为130,正式为30)
|
||
$this->redis->select(REDIS_DB_NUMBER);
|
||
//获取当前时间及当天日期
|
||
$this->current_time = time();
|
||
$this->current_datetime = date("Y-m-d H:i:s", $this->current_time);
|
||
$this->current_date = date("Y-m-d", $this->current_time);
|
||
}
|
||
|
||
/**
|
||
* curl get
|
||
*/
|
||
function __https_request($url){
|
||
$curl = curl_init();
|
||
curl_setopt($curl, CURLOPT_URL, $url);
|
||
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
|
||
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
|
||
curl_setopt($curl, CURLOPT_SSLVERSION, 1);
|
||
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
|
||
$data = curl_exec($curl);
|
||
if (curl_errno($curl)) {
|
||
return 'ERROR ' . curl_error($curl);
|
||
}
|
||
curl_close($curl);
|
||
return $data;
|
||
}
|
||
|
||
/**
|
||
* curl post
|
||
*/
|
||
function __http_post_request($url, $data=null, $is_json=false){
|
||
$curl = curl_init();
|
||
curl_setopt($curl, CURLOPT_URL, $url);
|
||
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
|
||
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
|
||
if(!empty($data)){
|
||
if($is_json && is_array($data)){
|
||
$data = json_encode($data);
|
||
}
|
||
curl_setopt($curl, CURLOPT_POST, 1);
|
||
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
|
||
//发送JSON数据
|
||
if($is_json){
|
||
curl_setopt($curl, CURLOPT_HEADER, 0);
|
||
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8', 'Content-Length:'.strlen($data)));
|
||
}
|
||
}
|
||
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
|
||
$res = curl_exec($curl);
|
||
$errorno = curl_errno($curl);
|
||
if($errorno){
|
||
$error = array();
|
||
$error = array('errorno'=>false, 'errmsg'=>$errorno, 'msg'=>curl_error($curl), 'info'=>curl_getinfo($curl));
|
||
return $error;
|
||
}
|
||
curl_close($curl);
|
||
return $res;
|
||
}
|
||
|
||
/**
|
||
* 跳转页面方法封装,针对后台跳转使用
|
||
*/
|
||
function __response_redirect($url=""){
|
||
header("Location: $url"); exit;
|
||
}
|
||
|
||
/**
|
||
* 获取客户ip
|
||
*/
|
||
function __get_client_ip(){
|
||
if(!empty($_SERVER["HTTP_CLIENT_IP"])){
|
||
$cip = $_SERVER["HTTP_CLIENT_IP"];
|
||
}
|
||
elseif(!empty($_SERVER["HTTP_X_FORWARDED_FOR"])){
|
||
$cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
|
||
}
|
||
elseif(!empty($_SERVER["REMOTE_ADDR"])){
|
||
$cip = $_SERVER["REMOTE_ADDR"];
|
||
}
|
||
else{
|
||
$cip = "UNKNOWN";
|
||
}
|
||
return $cip;
|
||
}
|
||
|
||
/**
|
||
* 清除html标签
|
||
*/
|
||
function __delhtml($str){
|
||
$str = trim($str);
|
||
$str = str_replace(array('"', "'"), array("", ""), $str);
|
||
//开始
|
||
$st = -1;
|
||
//结束
|
||
$et = -1;
|
||
$stmp = array();
|
||
$stmp[] = " ";
|
||
$len = strlen($str);
|
||
for($i=0; $i<$len; $i++){
|
||
$ss = substr($str, $i, 1);
|
||
//ord("<")==60
|
||
if(ord($ss)==60){
|
||
$st = $i;
|
||
}
|
||
//ord(">")==62
|
||
if(ord($ss)==62){
|
||
$et = $i;
|
||
if($st!=-1){
|
||
$stmp [] = substr($str, $st, $et-$st+1);
|
||
}
|
||
}
|
||
}
|
||
$str = str_replace($stmp, "", $str);
|
||
return $str;
|
||
}
|
||
|
||
/**
|
||
* 转换xml为数组
|
||
*/
|
||
function __change_xml_to_array($xmlfile){
|
||
$ob = simplexml_load_string($xmlfile, 'SimpleXMLElement', LIBXML_NOCDATA);
|
||
$json = json_encode($ob);
|
||
$configData = json_decode($json, true);
|
||
return $configData;
|
||
}
|
||
|
||
/**
|
||
* 随机生成字符串
|
||
*/
|
||
function _get_act_code($digit=32){
|
||
$str = 'abcdefghijklmnopqrstuvwxyz0123456789';
|
||
$code = substr(str_shuffle($str), 0, $digit);
|
||
return $code;
|
||
}
|
||
|
||
/**
|
||
* 校验是否有收到请求数据
|
||
*/
|
||
function __check_request_arr(){
|
||
//如果未获取到请求数据
|
||
if(empty(file_get_contents("php://input"))){
|
||
//告知用户"系统繁忙,请稍候再试"
|
||
$rs['errmsg'] = "系统繁忙,请稍候再试";
|
||
$rs['errcode'] = -1;
|
||
$rs['data'] = null;
|
||
}
|
||
//如果有获取到请求数据
|
||
else{
|
||
//准备判断请求数据整体是否为空
|
||
$request_arr = json_decode(file_get_contents("php://input"), true);
|
||
//如果请求数据整体为空
|
||
if(empty($request_arr)){
|
||
//告知用户"系统繁忙,请稍候再试"
|
||
$rs['errmsg'] = "系统繁忙,请稍候再试";
|
||
$rs['errcode'] = -1;
|
||
$rs['data'] = null;
|
||
}
|
||
//如果请求数据整体不为空
|
||
else{
|
||
//告知用户"ok"
|
||
$rs['errmsg'] = "ok";
|
||
$rs['errcode'] = 0;
|
||
$rs['data']['request_arr'] = $request_arr;
|
||
}
|
||
}
|
||
//返回结果
|
||
return $rs;
|
||
}
|
||
|
||
/**
|
||
* 校验基本参数是否都不为空
|
||
*/
|
||
function __check_params_arr($request_arr=array(), $params_arr=array()){
|
||
//准备校验基本参数
|
||
$rs['errmsg'] = "";
|
||
//循环需判断的参数字段
|
||
foreach($params_arr as $param_name){
|
||
//如果未获取到appid
|
||
if(empty($request_arr[$param_name])){
|
||
//告知用户$param_name." is empty;"
|
||
$rs['errmsg'].= $param_name." is empty;";
|
||
}
|
||
}
|
||
//如果以上判断未通过
|
||
if(!empty($rs['errmsg'])){
|
||
//告知用户"参数错误 error detail:".$rs['errmsg']
|
||
$rs['errmsg'] = "参数错误 error detail:".$rs['errmsg'];
|
||
$rs['errcode'] = 61451;
|
||
$rs['data'] = null;
|
||
}
|
||
//如果以上判断都通过
|
||
else{
|
||
//告知用户"ok"
|
||
$rs['errmsg'] = "ok";
|
||
$rs['errcode'] = 0;
|
||
$rs['data'] = null;
|
||
}
|
||
//返回结果
|
||
return $rs;
|
||
}
|
||
|
||
/**
|
||
* 更新接口请求次数
|
||
*/
|
||
function __update_app_info($appid=""){
|
||
//查询接口信息
|
||
$AppInfo = AppInfo::findFirst("AppId = '$appid' AND Enable = 0");
|
||
//如果未查询到接口信息
|
||
if(empty($AppInfo)){
|
||
//告知用户"找不到app配置信息,appid无效,err detail:找不到app配置信息"
|
||
$rs['errmsg'] = "找不到app配置信息,appid无效,err detail:找不到app配置信息";
|
||
$rs['errcode'] = 40036;
|
||
$rs['data'] = null;
|
||
}
|
||
//如果有查询到接口信息
|
||
else{
|
||
//获取上次请求日期
|
||
$last_req_time = $AppInfo->LastReqTime;
|
||
$last_req_date = date("Y-m-d", strtotime($last_req_time));
|
||
//获取上次请求日期所在日的请求次数
|
||
$today_req_times = $AppInfo->TodayReqTimes;
|
||
//获取接口请求次数限制
|
||
$day_max_req_times = $AppInfo->DayMaxReqTimes;
|
||
//如果上次请求日期是当天日期
|
||
if($last_req_date==$this->current_date){
|
||
//如果当天请求次数已达到接口请求次数限制
|
||
if($today_req_times>=$day_max_req_times){
|
||
//告知用户"request today reached the request limit,err detail:超过请求上限限制"
|
||
$rs['errmsg'] = "request today reached the request limit,err detail:超过请求上限限制";
|
||
$rs['errcode'] = 80102;
|
||
$rs['data'] = null;
|
||
}
|
||
//如果当天请求次数尚未达到接口请求次数限制
|
||
else{
|
||
//当天请求次数加一
|
||
$today_req_times = $today_req_times+1;
|
||
}
|
||
}
|
||
//如果上次请求日期不是当天日期
|
||
else{
|
||
//如果接口请求次数限制不大于0
|
||
if($day_max_req_times<=0){
|
||
//告知用户"request today reached the request limit,err detail:超过请求上限限制"
|
||
$rs['errmsg'] = "request today reached the request limit,err detail:超过请求上限限制";
|
||
$rs['errcode'] = 80102;
|
||
$rs['data'] = null;
|
||
}
|
||
//如果接口请求次数限制大于0
|
||
else{
|
||
//初始当天请求次数
|
||
$today_req_times = 1;
|
||
}
|
||
}
|
||
//如果以上判断都通过
|
||
if(empty($rs['errcode'])){
|
||
//准备更新当天请求次数
|
||
$AppInfo->LastModifiedTime = $this->current_datetime;
|
||
//其他字段
|
||
$AppInfo->TodayReqTimes = $today_req_times;
|
||
$AppInfo->LastReqTime = $this->current_date;
|
||
//如果更新失败
|
||
if(!($AppInfo->save())){
|
||
//告知用户"系统繁忙,请稍候再试"
|
||
$rs['errmsg'] = "系统繁忙,请稍候再试";
|
||
$rs['errcode'] = -1;
|
||
$rs['data'] = null;
|
||
}
|
||
//如果更新成功
|
||
else{
|
||
//告知用户"ok"
|
||
$rs['errmsg'] = "ok";
|
||
$rs['errcode'] = 0;
|
||
$rs['data']['AppInfo'] = $AppInfo;
|
||
}
|
||
}
|
||
}
|
||
//返回结果
|
||
return $rs;
|
||
}
|
||
|
||
/**
|
||
* 校验所传access_token是否有效
|
||
*/
|
||
function __check_access_token($appid="", $access_token=""){
|
||
//查询接口信息
|
||
$AccessToken = AccessToken::findFirst("AppId = '$appid' AND (AccessToken = '$access_token' OR PrevAccessToken = '$access_token')");
|
||
//如果未查询到接口信息
|
||
if(empty($AccessToken)){
|
||
//告知用户"accesstoken 不正确,err detail:找不到accesstoken信息"
|
||
$rs['errmsg'] = "accesstoken 不正确,err detail:找不到accesstoken信息";
|
||
$rs['errcode'] = 40039;
|
||
$rs['data'] = null;
|
||
}
|
||
//如果有查询到接口信息
|
||
else{
|
||
//获取现access_token到期时间
|
||
$ExpireTime = $AccessToken->ExpireTime;
|
||
//获取前access_token到期时间
|
||
$PrevExpireTime = date("Y-m-d H:i:s", strtotime($AccessToken->ExpireTime)-14400+600);
|
||
//如果所传access_token匹配前access_token
|
||
if($access_token==$AccessToken->PrevAccessToken){
|
||
//如果前access_token已过期
|
||
//注意:
|
||
//原代码逻辑中前access_token似乎也按现access_token的到期时间算
|
||
//此处先遵循文档,按照现access_token生成时间后10分钟算到期时间
|
||
if($this->current_datetime>$PrevExpireTime){
|
||
//告知用户"access_token is expired,err detail:accesstoken 已过期"
|
||
$rs['errmsg'] = "access_token is expired,err detail:accesstoken 已过期";
|
||
$rs['errcode'] = 80105;
|
||
$rs['data'] = null;
|
||
}
|
||
}
|
||
//如果所传access_token匹配现access_token
|
||
else{
|
||
//如果现access_token已过期
|
||
if($this->current_datetime>$ExpireTime){
|
||
//告知用户"access_token is expired,err detail:accesstoken 已过期"
|
||
$rs['errmsg'] = "access_token is expired,err detail:accesstoken 已过期";
|
||
$rs['errcode'] = 80105;
|
||
$rs['data']['AccessToken'] = $AccessToken;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
?>
|