api/app/controllers/SmsController.php
2023-04-14 12:56:27 +08:00

802 lines
32 KiB
PHP
Raw 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
/**
* Tiffany SMS API重构-接口类
* @author QZQ
*/
header("Content-Type:text/html; Charset=utf-8");
class SmsController extends ControllerBase{
//默认验证码短信模板
public $default_authcode_template = "您的验证码是[$=yzm=$]";
//特定验证码短信模板
public $special_authcode_templates = array(
"7e52ef78-89f1-4f54-ae9b-560e2eca4d79"=>"您的验证码是 [$=yzm=$]60秒内有效。如需协助欢迎致电4009213299。如非本人操作请忽略本短信。",
"3bea8a13-0db4-44cf-ad5b-d585fe5cfc09"=>"您的验证码是 [$=yzm=$]60秒内有效。如需协助欢迎致电4009213299。如非本人操作请忽略本短信。"
);
//特定验证码短信参数
public $special_authcode_params = array(
"1e3ff92c-db9c-4ccf-9903-3be52ac5c25d"=>array("[$=yzm=$]", "[$=params1=$]", "[$=params2=$]", "[$=params3=$]", "[$=params4=$]", "[$=params5=$]"),
"7e52ef78-89f1-4f54-ae9b-560e2eca4d79"=>array("[$=yzm=$]", "[$=params1=$]", "[$=params2=$]", "[$=params3=$]", "[$=params4=$]", "[$=params5=$]"),
"3bea8a13-0db4-44cf-ad5b-d585fe5cfc09"=>array("[$=yzm=$]", "[$=params1=$]", "[$=params2=$]", "[$=params3=$]", "[$=params4=$]", "[$=params5=$]"),
);
function initialize(){
parent::initialize();
}
/**
* 测试方法
* http://127.0.0.1/tiffany/api/sms/test?qaz=wsx
* http://weapp.wemediacn.net/d/tiffany/api/sms/test?qaz=wsx
*/
function testAction(){
//$url = "http://wxapp.wemediacn.com/smsoauth2_qa/api/sms/send";
//$url = "http://127.0.0.1/tiffany/api/sms/send?qaz=wsx";
$url = "http://wxapp.wemediacn.com/smsoauth2_qa/api/sms/authcode";
//$url = "http://127.0.0.1/tiffany/api/sms/authcode?qaz=wsx";
//$url = "http://wxapp.wemediacn.com/smsoauth2_qa/api/sms/query_reports";
//$url = "http://127.0.0.1/tiffany/api/sms/query_reports?qaz=wsx";
$post_arr = array();
$post_arr['appid'] = "0e355010-67b9-4aa6-a53f-c92c972094a7";
$post_arr['mobile'] = "13501882318";
$post_arr['access_token'] = "71ebca94ab954d67a57af759424a94e1";
$post_arr['content'] = "";
$post_arr['format'] = "";
$post_arr['len'] = -1;
$post_arr['type'] = -1;
$post_arr['is_resend'] = true;
$post_arr['min_id'] = "";
$post_json = json_encode($post_arr);
$result = $this->__http_post_request($url, $post_json, true);
print_r($result); die;
}
/**
* 发送短信Send SMS
* http://127.0.0.1/tiffany/api/sms/send?qaz=wsx
* http://weapp.wemediacn.net/d/tiffany/api/sms/send?qaz=wsx
*/
function sendAction(){
//如果是GET请求
if($this->request->isGet()){
//告知请求的资源不支持 http 方法“GET”。
$rs['Message'] = "请求的资源不支持 http 方法“GET”。";
}
//如果未获取到请求数据
elseif(empty(file_get_contents("php://input"))){
//告知用户"系统繁忙,请稍候再试"
$rs['errcode'] = -1;
$rs['errmsg'] = "系统繁忙,请稍候再试";
$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{
//准备获取所传appid、手机号、access_token和短信内容
$rs['errmsg'] = "";
//如果未获取到所传appid
if(empty($request_arr['appid'])){
//告知用户"appid is empty;"
$rs['errmsg'].= "appid is empty;";
}
//如果未获取到所传手机号
if(empty($request_arr['mobile'])){
//告知用户"mobile is empty;"
$rs['errmsg'].= "mobile is empty;";
}
//如果未获取到所传access_token
if(empty($request_arr['access_token'])){
//告知用户"access_token is empty;"
$rs['errmsg'].= "access_token is empty;";
}
//如果未获取到所传短信内容
if(empty($request_arr['content'])){
//告知用户"content is empty;"
$rs['errmsg'].= "content is empty;";
}
//如果以上判断未通过
if(!empty($rs['errmsg'])){
//告知用户"参数错误 error detail:".$rs['errmsg']
$rs['errmsg'] = "参数错误 error detail:".$rs['errmsg'];
$rs['errcode'] = 61451;
$rs['data'] = null;
}
//如果以上判断都通过
else{
//准备判断所传appid是否有效
$appid = $request_arr['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));
//获取当前时间及当天日期
$current_time = time();
$current_datetime = date("Y-m-d H:i:s", $current_time);
$current_date = date("Y-m-d", $current_time);
//获取上次请求日期所在日的请求次数
$today_req_times = $AppInfo->TodayReqTimes;
//获取接口请求次数限制
$day_max_req_times = $AppInfo->DayMaxReqTimes;
//如果上次请求日期是当天日期
if($last_req_date==$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 = $current_datetime;
//其他字段
$AppInfo->TodayReqTimes = $today_req_times;
$AppInfo->LastReqTime = $current_date;
//如果更新失败
if(!($AppInfo->save())){
//告知用户"系统繁忙,请稍候再试"
$rs['errmsg'] = "系统繁忙,请稍候再试";
$rs['errcode'] = -1;
$rs['data'] = null;
}
//如果更新成功
else{
//准备判断所传access_token是否有效
$access_token = $request_arr['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($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($current_datetime>$ExpireTime){
//告知用户"access_token is expired,err detail:accesstoken 已过期"
$rs['errmsg'] = "access_token is expired,err detail:accesstoken 已过期";
$rs['errcode'] = 80105;
$rs['data'] = null;
}
}
//如果以上判断都通过
if(empty($rs['errcode'])){
//设置发送手机号
$mobile = $request_arr['mobile'];
//设置发送FormatID
$FormatID = !empty($request_arr['format'])?$request_arr['format']:8;
//设置发送短信内容
$Content = $request_arr['content'];
//将发送短信内容URL编码
$Content = urlencode($Content);
//设置发送TokenID
$TokenID = $AppInfo->SmsToken;
//开发阶段转为使用测试TokenID
$TokenID = "7100477830459267";
//准备发送短信
$url = "https://www.wemediacn.net/webservice/smsservice.asmx/SendSMS?mobile=$mobile&FormatID=$FormatID&Content=$Content&ScheduleDate=2010-1-1&TokenID=$TokenID";
//获取发送结果
$xml = $this->__https_request($url);
//转换发送结果格式
$array = $this->__change_xml_to_array($xml);
//获取发送结果提示
$string = !empty($array[0])?$array[0]:"";
//如果发送失败
if(!(strpos(strtolower($xml), "ok")!==false)){
//告知用户"发送失败,err detail:短信发送失败:".$string
//ERROR:200:[非手机号码]
//ERROR:108:[FormatID 非法数值]
$rs['errmsg'] = "发送失败,err detail:短信发送失败:".$string;
$rs['errcode'] = 70000;
$rs['data'] = null;
}
//如果发送成功
else{
//获取messageid
//OK:[202304121675878871004778]
$messageid = str_replace("]", "", str_replace("OK:[", "", $string));
//告知用户"ok"
$rs['errmsg'] = "ok";
$rs['errcode'] = 0;
$rs['data']['messageid'] = $messageid;
}
}
}
}
}
}
}
}
}
//输出结果
echo json_encode($rs, JSON_UNESCAPED_UNICODE);
}
/**
* 获取手机验证码Get mobile verification
* http://127.0.0.1/tiffany/api/sms/authcode?qaz=wsx
* http://weapp.wemediacn.net/d/tiffany/api/sms/authcode?qaz=wsx
*/
function authcodeAction(){
//如果是GET请求
if($this->request->isGet()){
//告知请求的资源不支持 http 方法“GET”。
$rs['Message'] = "请求的资源不支持 http 方法“GET”。";
}
//如果未获取到请求数据
elseif(empty(file_get_contents("php://input"))){
//告知用户"系统繁忙,请稍候再试"
$rs['errcode'] = -1;
$rs['errmsg'] = "系统繁忙,请稍候再试";
$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{
//准备获取所传appid、手机号和access_token
$rs['errmsg'] = "";
//如果未获取到所传appid
if(empty($request_arr['appid'])){
//告知用户"appid is empty;"
$rs['errmsg'].= "appid is empty;";
}
//如果未获取到所传手机号
if(empty($request_arr['mobile'])){
//告知用户"mobile is empty;"
$rs['errmsg'].= "mobile is empty;";
}
//如果未获取到所传access_token
if(empty($request_arr['access_token'])){
//告知用户"access_token is empty;"
$rs['errmsg'].= "access_token is empty;";
}
//如果以上判断未通过
if(!empty($rs['errmsg'])){
//告知用户"参数错误 error detail:".$rs['errmsg']
$rs['errmsg'] = "参数错误 error detail:".$rs['errmsg'];
$rs['errcode'] = 61451;
$rs['data'] = null;
}
//如果以上判断都通过
else{
//获取所传验证码长度
//注意:
//原代码逻辑中验证码长度小于等于0则取默认值4
//此处先遵循原代码逻辑,而不按照文档限制判断
$len = !empty($request_arr['len'])?$request_arr['len']:4;
$len = (int)$len;
$len = $len>0?$len:4;
//如果所传验证码长度小于2或大于10
//注意:
//原代码逻辑中验证码长度为大于等于1而小于等于9
//此处则先遵循文档,而不按照原代码逻辑限制判断
if($len<2 || $len>10){
//告知用户"参数错误 error detail:"
$rs['errmsg'] = "参数错误 error detail:";
$rs['errcode'] = 61451;
$rs['data'] = null;
}
//如果所传验证码长度大于等于2且小于等于10
else{
//获取所传验证码类型1 纯数字 2 字母加数字
//注意:
//原代码逻辑中验证码类型小于等于0则取默认值1
//此处先遵循原代码逻辑,而不按照文档限制判断
$type = !empty($request_arr['type'])?$request_arr['type']:1;
$type = (int)$type;
$type = $type>0?$type:1;
//如果所传验证码类型不是1或2
if($type!=1 && $type!=2){
//告知用户"参数错误 error detail:"
$rs['errmsg'] = "参数错误 error detail:";
$rs['errcode'] = 61451;
$rs['data'] = null;
}
//如果所传验证码类型是1或2
else{
//准备判断所传appid是否有效
$appid = $request_arr['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));
//获取当前时间及当天日期
$current_time = time();
$current_datetime = date("Y-m-d H:i:s", $current_time);
$current_date = date("Y-m-d", $current_time);
//获取上次请求日期所在日的请求次数
$today_req_times = $AppInfo->TodayReqTimes;
//获取接口请求次数限制
$day_max_req_times = $AppInfo->DayMaxReqTimes;
//如果上次请求日期是当天日期
if($last_req_date==$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 = $current_datetime;
//其他字段
$AppInfo->TodayReqTimes = $today_req_times;
$AppInfo->LastReqTime = $current_date;
//如果更新失败
if(!($AppInfo->save())){
//告知用户"系统繁忙,请稍候再试"
$rs['errmsg'] = "系统繁忙,请稍候再试";
$rs['errcode'] = -1;
$rs['data'] = null;
}
//如果更新成功
else{
//准备判断所传access_token是否有效
$access_token = $request_arr['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($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($current_datetime>$ExpireTime){
//告知用户"access_token is expired,err detail:accesstoken 已过期"
$rs['errmsg'] = "access_token is expired,err detail:accesstoken 已过期";
$rs['errcode'] = 80105;
$rs['data'] = null;
}
}
//如果以上判断都通过
if(empty($rs['errcode'])){
//设置发送手机号
$mobile = $request_arr['mobile'];
//设置发送FormatID
$FormatID = 8;
//准备设置验证码
$authcode = "";
//获取是否重发上一个验证码
$is_resend = !empty($request_arr['is_resend'])?true:false;
//如果是重发上一个验证码
if($is_resend){
//获取缓存中所传手机号对应的验证码
$authcode = $this->redis->get("tiffany_api_sms_authcode:".$request_arr['mobile']);
}
//如果以上未设置验证码或缓存中所传手机号对应的验证码已失效
if(empty($authcode)){
//按所传验证码长度及验证码类型生成并设置验证码
$authcode = $this->_get_auth_code($len, $type);
}
//获取特定验证码短信模板
$special_authcode_templates = $this->special_authcode_templates;
//如果所传appid无对应的特定验证码短信模板
if(empty($special_authcode_templates[$appid])){
//将验证码短信模板设置为默认验证码短信模板
$authcode_template = $this->default_authcode_template;
}
//如果所传appid有对应的特定验证码短信模板
else{
//将验证码短信模板设置为所传appid对应的特定短信模板
$authcode_template = $special_authcode_templates[$appid];
}
//如果未获取到短信内容
if(empty($request_arr['content'])){
//直接按验证码短信模板设置发送短信内容
$Content = $authcode_template;
//将发送短信内容中的[$=yzm=$]参数替换为验证码
$Content = str_replace("[$=yzm=$]", $authcode, $Content);
}
//如果有获取到短信内容
else{
//获取特定验证码短信参数
$special_authcode_params = $this->special_authcode_params;
//如果所传appid无对应的特定验证码短信参数
if(empty($special_authcode_params[$appid])){
//仍然直接按验证码短信模板设置发送短信内容
$Content = $authcode_template;
//将发送短信内容中的[$=yzm=$]参数替换为验证码
$Content = str_replace("[$=yzm=$]", $authcode, $Content);
}
//如果所传appid有对应的特定验证码短信参数
else{
//则要按所传短信内容设置发送短信内容
$Content = $request_arr['content'];
//循环所传appid对应的特定验证码短信参数
foreach($special_authcode_params[$appid] as $special_authcode_param){
//如果当前循环特定验证码短信参数是[$=yzm=$]
if($special_authcode_param=="[$=yzm=$]"){
//将发送短信内容中的[$=yzm=$]参数替换为验证码
$Content = str_replace("[$=yzm=$]", $authcode, $Content);
}
//如果当前循环特定验证码短信参数不是[$=yzm=$]
else{
//如果有传具体参数内容
if(isset($request_arr[$special_authcode_param])){
//将发送短信内容中的当前循环特定验证码短信参数替换为具体参数内容
$Content = str_replace($special_authcode_param, $request_arr[$special_authcode_param], $Content);
}
}
}
}
}
//将发送短信内容URL编码
$Content = urlencode($Content);
//设置发送TokenID
$TokenID = $AppInfo->SmsToken;
//开发阶段转为使用测试TokenID
$TokenID = "7100477830459267";
//准备发送短信
$url = "https://www.wemediacn.net/webservice/smsservice.asmx/SendSMS?mobile=$mobile&FormatID=$FormatID&Content=$Content&ScheduleDate=2010-1-1&TokenID=$TokenID";
//获取发送结果
$xml = $this->__https_request($url);
//转换发送结果格式
$array = $this->__change_xml_to_array($xml);
//获取发送结果提示
$string = !empty($array[0])?$array[0]:"";
//如果发送失败
if(!(strpos(strtolower($xml), "ok")!==false)){
//告知用户"发送失败,err detail:短信发送失败:".$string
//ERROR:200:[非手机号码]
//ERROR:108:[FormatID 非法数值]
$rs['errmsg'] = "发送失败,err detail:短信发送失败:".$string;
$rs['errcode'] = 70000;
$rs['data'] = null;
}
//如果发送成功
else{
//如果不是重发上一个验证码
if(!$is_resend){
//按手机号维度缓存当前验证码3分钟
$this->redis->set("tiffany_api_sms_authcode:".$mobile, $authcode);
$this->redis->expire("tiffany_api_sms_authcode:".$mobile, 180);
}
//获取messageid
//OK:[202304121675878871004778]
$messageid = str_replace("]", "", str_replace("OK:[", "", $string));
//告知用户"ok"
$rs['errmsg'] = "ok";
$rs['errcode'] = 0;
$rs['data']['messageid'] = $messageid;
$rs['data']['authcode'] = $authcode;
}
}
}
}
}
}
}
}
}
}
}
//输出结果
echo json_encode($rs, JSON_UNESCAPED_UNICODE);
}
/**
* 随机生成字符串
*/
function _get_auth_code($len=4, $type=1){
//初始纯数字字符串
$str = "0123456789";
//如果需要字母
if($type==2){
//加上大写字母字符串I、O两字母除外
$str.= "ABCDEFGHJKLMNPQRSTUVWXYZ";
}
$code = substr(str_shuffle($str), 0, $len);
return $code;
}
/**
* 批量查询最新短信发送结果Batch query for the latest SMS sending result
* http://127.0.0.1/tiffany/api/sms/query_reports?qaz=wsx
*/
function queryReportsAction(){
//如果是GET请求
if($this->request->isGet()){
//告知请求的资源不支持 http 方法“GET”。
$rs['Message'] = "请求的资源不支持 http 方法“GET”。";
}
//如果未获取到请求数据
elseif(empty(file_get_contents("php://input"))){
//告知用户"系统繁忙,请稍候再试"
$rs['errcode'] = -1;
$rs['errmsg'] = "系统繁忙,请稍候再试";
$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{
//准备获取所传appid和access_token
$rs['errmsg'] = "";
//如果未获取到所传appid
if(empty($request_arr['appid'])){
//告知用户"appid is empty;"
$rs['errmsg'].= "appid is empty;";
}
//如果未获取到所传access_token
if(empty($request_arr['access_token'])){
//告知用户"access_token is empty;"
$rs['errmsg'].= "access_token is empty;";
}
//如果以上判断未通过
if(!empty($rs['errmsg'])){
//告知用户"参数错误 error detail:".$rs['errmsg']
$rs['errmsg'] = "参数错误 error detail:".$rs['errmsg'];
$rs['errcode'] = 61451;
$rs['data'] = null;
}
//如果以上判断都通过
else{
//准备判断所传appid是否有效
$appid = $request_arr['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));
//获取当前时间及当天日期
$current_time = time();
$current_datetime = date("Y-m-d H:i:s", $current_time);
$current_date = date("Y-m-d", $current_time);
//获取上次请求日期所在日的请求次数
$today_req_times = $AppInfo->TodayReqTimes;
//获取接口请求次数限制
$day_max_req_times = $AppInfo->DayMaxReqTimes;
//如果上次请求日期是当天日期
if($last_req_date==$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 = $current_datetime;
//其他字段
$AppInfo->TodayReqTimes = $today_req_times;
$AppInfo->LastReqTime = $current_date;
//如果更新失败
if(!($AppInfo->save())){
//告知用户"系统繁忙,请稍候再试"
$rs['errmsg'] = "系统繁忙,请稍候再试";
$rs['errcode'] = -1;
$rs['data'] = null;
}
//如果更新成功
else{
//准备判断所传access_token是否有效
$access_token = $request_arr['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($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($current_datetime>$ExpireTime){
//告知用户"access_token is expired,err detail:accesstoken 已过期"
$rs['errmsg'] = "access_token is expired,err detail:accesstoken 已过期";
$rs['errcode'] = 80105;
$rs['data'] = null;
}
}
//如果以上判断都通过
if(empty($rs['errcode'])){
}
}
}
}
}
}
}
}
//输出结果
echo json_encode($rs, JSON_UNESCAPED_UNICODE);
}
}
?>