备份提交

This commit is contained in:
qinzongqing 2023-04-17 13:52:24 +08:00
parent 03724ecea4
commit 77fd3244f1
4 changed files with 668 additions and 1182 deletions

View File

@ -10,12 +10,22 @@ class ControllerBase extends Phalcon\Mvc\Controller{
//public $_PublicHelper; //public $_PublicHelper;
//日志助手 //日志助手
public $_LogObj; public $_LogObj;
//当前时间戳
public $current_time;
//当前时间
public $current_datetime;
//当天日期
public $current_date;
function initialize(){ function initialize(){
//$this->_PublicHelper = new PublicHelper(); //$this->_PublicHelper = new PublicHelper();
//$this->_LogObj = new LogClient(); //$this->_LogObj = new LogClient();
//选择redis库测试及开发为130正式为30 //选择redis库测试及开发为130正式为30
$this->redis->select(REDIS_DB_NUMBER); $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);
} }
/** /**
@ -144,5 +154,194 @@ class ControllerBase extends Phalcon\Mvc\Controller{
return $code; 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;
}
}
}
}
} }
?> ?>

View File

@ -36,147 +36,56 @@ class Oauth2Controller extends ControllerBase{
* http://weapp.wemediacn.net/d/tiffany/api/oauth2/code?qaz=wsx * http://weapp.wemediacn.net/d/tiffany/api/oauth2/code?qaz=wsx
*/ */
function codeAction(){ function codeAction(){
//如果未获取到请求数据 //获取请求数据
if(empty(file_get_contents("php://input"))){ $rs = $this->__get_request_arr();
//告知用户"系统繁忙,请稍候再试"
$rs['errmsg'] = "系统繁忙,请稍候再试";
$rs['errcode'] = -1;
$rs['data'] = null;
}
//如果有获取到请求数据 //如果有获取到请求数据
else{ if(!empty($rs['data']['request_arr'])){
//准备判断请求数据整体是否为空 //准备校验基本参数
$request_arr = json_decode(file_get_contents("php://input"), true); $request_arr = $rs['data']['request_arr'];
//如果请求数据整体为空 $params_arr[] = "appid";
if(empty($request_arr)){ //校验基本参数
//告知用户"系统繁忙,请稍候再试" $rs = $this->__check_params_arr($request_arr, $params_arr);
$rs['errmsg'] = "系统繁忙,请稍候再试"; //如果基本参数校验通过
$rs['errcode'] = -1; if(empty($rs['errcode'])){
$rs['data'] = null; //准备更新接口请求次数
} $appid = $request_arr['appid'];
//如果请求数据整体不为空 //更新接口请求次数
else{ $rs = $this->__update_app_info($appid);
//准备获取所传appid //如果接口请求次数更新成功
$rs['errmsg'] = ""; if(empty($rs['errcode'])){
//如果未获取到appid //查询当前接口过去是否有生成过code
if(empty($request_arr['appid'])){ $TempCode = TempCode::findFirst("AppId = '$appid'");
//告知用户"appid is empty;" //如果当前接口过去未生成过code
$rs['errmsg'].= "appid is empty;"; if(empty($TempCode)){
} //准备新增临时code
//如果以上判断未通过 $TempCode = new TempCode();
if(!empty($rs['errmsg'])){ $TempCode->AppId = $appid;
//告知用户"参数错误 error detail:".$rs['errmsg'] $TempCode->CreateTime = $this->current_datetime;
$rs['errmsg'] = "参数错误 error detail:".$rs['errmsg']; $TempCode->LastModifiedTime = $this->current_datetime;
$rs['errcode'] = 61451; }
$rs['data'] = null; //如果当前接口过去有生成过code
} else{
//如果以上判断都通过 //准备更新临时code
else{ $TempCode->LastModifiedTime = $this->current_datetime;
//准备判断所传appid是否有效 }
$appid = $request_arr['appid']; //其他字段
//查询接口信息 $TempCode->Code = $code = $this->_get_act_code(32);
$AppInfo = AppInfo::findFirst("AppId = '$appid' AND Enable = 0"); $TempCode->IsUsed = 0;
//如果未查询到接口信息 $TempCode->ExpireTime = date("Y-m-d H:i:s", $this->current_time+300);
if(empty($AppInfo)){ //如果保存失败
//告知用户"找不到app配置信息,appid无效,err detail:找不到app配置信息" if(!($TempCode->save())){
$rs['errmsg'] = "找不到app配置信息,appid无效,err detail:找不到app配置信息"; //告知用户"系统繁忙,请稍候再试"
$rs['errcode'] = 40036; $rs['errmsg'] = "系统繁忙,请稍候再试";
$rs['errcode'] = -1;
$rs['data'] = null; $rs['data'] = null;
} }
//如果有查询到接口信息 //如果保存成功
else{ else{
//获取上次请求日期 //告知用户"ok"
$last_req_time = $AppInfo->LastReqTime; $rs['errmsg'] = "ok";
$last_req_date = date("Y-m-d", strtotime($last_req_time)); $rs['errcode'] = 0;
//获取当前时间及当天日期 $rs['data'] = array()
$current_time = time(); $rs['data']['code'] = $code;
$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{
//查询当前接口过去是否有生成过code
$TempCode = TempCode::findFirst("AppId = '$appid'");
//如果当前接口过去未生成过code
if(empty($TempCode)){
//准备新增临时code
$TempCode = new TempCode();
$TempCode->AppId = $appid;
$TempCode->CreateTime = $current_datetime;
$TempCode->LastModifiedTime = $current_datetime;
}
//如果当前接口过去有生成过code
else{
//准备更新临时code
$TempCode->LastModifiedTime = $current_datetime;
}
//其他字段
$TempCode->Code = $code = $this->_get_act_code(32);
$TempCode->IsUsed = 0;
$TempCode->ExpireTime = date("Y-m-d H:i:s", $current_time+300);
//如果保存失败
if(!($TempCode->save())){
//告知用户"系统繁忙,请稍候再试"
$rs['errmsg'] = "系统繁忙,请稍候再试";
$rs['errcode'] = -1;
$rs['data'] = null;
}
//如果保存成功
else{
//告知用户"ok"
$rs['errmsg'] = "ok";
$rs['errcode'] = 0;
$rs['data']['code'] = $code;
}
}
}
} }
} }
} }
@ -191,238 +100,141 @@ class Oauth2Controller extends ControllerBase{
* http://weapp.wemediacn.net/d/tiffany/api/oauth2/accesstoken?qaz=wsx * http://weapp.wemediacn.net/d/tiffany/api/oauth2/accesstoken?qaz=wsx
*/ */
function accesstokenAction(){ function accesstokenAction(){
//如果未获取到请求数据 //获取请求数据
if(empty(file_get_contents("php://input"))){ $rs = $this->__get_request_arr();
//告知用户"系统繁忙,请稍候再试"
$rs['errmsg'] = "系统繁忙,请稍候再试";
$rs['errcode'] = -1;
$rs['data'] = null;
}
//如果有获取到请求数据 //如果有获取到请求数据
else{ if(!empty($rs['data']['request_arr'])){
//准备判断请求数据整体是否为空 //准备校验基本参数
$request_arr = json_decode(file_get_contents("php://input"), true); //注意:
//如果请求数据整体为空 //接口中的appsecrect字段本身就是用了错别词比secret多了一个字母
if(empty($request_arr)){ //但接口信息表AppInfo里的AppSecret字段则没有多出一个字母要当心
//告知用户"系统繁忙,请稍候再试" $request_arr = $rs['data']['request_arr'];
$rs['errmsg'] = "系统繁忙,请稍候再试"; $params_arr[] = "appid";
$rs['errcode'] = -1; $params_arr[] = "appsecrect";
$rs['data'] = null; $params_arr[] = "code";
} //校验基本参数
//如果请求数据整体不为空 $rs = $this->__check_params_arr($request_arr, $params_arr);
else{ //如果基本参数校验通过
//准备获取所传appid、appsecrect和code if(empty($rs['errcode'])){
//注意: //准备更新接口请求次数
//接口中的appsecrect字段本身就是用了错别词比secret多了一个字母 $appid = $request_arr['appid'];
//但接口信息表AppInfo里的AppSecret字段则没有多出一个字母要当心 //更新接口请求次数
$rs['errmsg'] = ""; $rs = $this->__update_app_info($appid);
//如果未获取到所传appid //如果接口请求次数更新成功
if(empty($request_arr['appid'])){ if(empty($rs['errcode'])){
//告知用户"appid is empty;" //获取接口信息
$rs['errmsg'].= "appid is empty;"; $AppInfo = $rs['data']['AppInfo'];
} //准备判断appsecrect是否匹配
//如果未获取到所传appsecrect $appsecrect = $request_arr['appsecrect'];
if(empty($request_arr['appsecrect'])){ //如果appsecrect不匹配
//告知用户"appsecrect is empty;" if($appsecrect!=$AppInfo->AppSecret){
$rs['errmsg'].= "appsecrect is empty;"; //告知用户"密钥不匹配,err detail:密钥不匹配"
} $rs['errmsg'] = "密钥不匹配,err detail:密钥不匹配";
//如果未获取到所传code $rs['errcode'] = 40037;
if(empty($request_arr['code'])){
//告知用户"code is empty;"
$rs['errmsg'].= "code 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; $rs['data'] = null;
} }
//如果有查询到接口信息 //如果appsecrect匹配
else{ else{
//获取上次请求日期 //准备判断所传code是否匹配
$last_req_time = $AppInfo->LastReqTime; $code = $request_arr['code'];
$last_req_date = date("Y-m-d", strtotime($last_req_time)); //查询临时code
//获取当前时间及当天日期 $TempCode = TempCode::findFirst("AppId = '$appid' AND Code = '$code'");
$current_time = time(); //如果未查询到临时code
$current_datetime = date("Y-m-d H:i:s", $current_time); if(empty($TempCode)){
$current_date = date("Y-m-d", $current_time); //告知用户"code 不正确,err detail:code 不匹配"
//获取上次请求日期所在日的请求次数 $rs['errmsg'] = "code 不正确,err detail:code 不匹配";
$today_req_times = $AppInfo->TodayReqTimes; $rs['errcode'] = 40038;
//获取接口请求次数限制 $rs['data'] = null;
$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;
}
} }
//如果上次请求日期不是当天日期 //如果有查询到临时code
else{ else{
//如果接口请求次数限制不大于0 //准备判断所传code是否已失效
if($day_max_req_times<=0){ $expire_time = $TempCode->ExpireTime;
//告知用户"request today reached the request limit,err detail:超过请求上限限制" //如果所传code已失效
$rs['errmsg'] = "request today reached the request limit,err detail:超过请求上限限制"; if($this->current_datetime>=$expire_time){
$rs['errcode'] = 80102; //告知用户"authorize code is expired,err detail:code 已过期"
$rs['errmsg'] = "authorize code is expired,err detail:code 已过期";
$rs['errcode'] = 80103;
$rs['data'] = null; $rs['data'] = null;
} }
//如果接口请求次数限制大于0 //如果所传code未失效
else{ else{
//初始当天请求次数 //准备判断所传code是否已使用过
$today_req_times = 1; $is_used = $TempCode->IsUsed;
} //如果所传code已使用过
} if(!empty($is_used)){
//如果以上判断都通过 //告知用户"authorize code is used,err detail:code已使用"
if(empty($rs['errcode'])){ $rs['errmsg'] = "authorize code is used,err detail:code已使用";
//准备更新当天请求次数 $rs['errcode'] = 80104;
$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{
//准备判断appsecrect是否匹配
$appsecrect = $request_arr['appsecrect'];
//如果appsecrect不匹配
if($appsecrect!=$AppInfo->AppSecret){
//告知用户"密钥不匹配,err detail:密钥不匹配"
$rs['errmsg'] = "密钥不匹配,err detail:密钥不匹配";
$rs['errcode'] = 40037;
$rs['data'] = null; $rs['data'] = null;
} }
//如果appsecrect匹配 //如果所传code未使用过
else{ else{
//准备判断所传code是否匹配 //开启事务
$code = $request_arr['code']; $this->db->begin();
//查询临时code //准备更新临时code
$TempCode = TempCode::findFirst("AppId = '$appid' AND Code = '$code'"); $TempCode->LastModifiedTime = $this->current_datetime;
//如果未查询到临时code //其他字段
if(empty($TempCode)){ $TempCode->IsUsed = 1;
//告知用户"code 不正确,err detail:code 不匹配" //如果保存失败
$rs['errmsg'] = "code 不正确,err detail:code 不匹配"; if(!($TempCode->save())){
$rs['errcode'] = 40038; //回滚事务
$this->db->rollback();
//告知用户"系统繁忙,请稍候再试"
$rs['errmsg'] = "系统繁忙,请稍候再试";
$rs['errcode'] = -1;
$rs['data'] = null; $rs['data'] = null;
} }
//如果有查询到临时code //如果保存成功
else{ else{
//准备判断所传code是否已失效 //查询当前接口过去是否有生成过access_token
$expire_time = $TempCode->ExpireTime; $AccessToken = AccessToken::findFirst("AppId = '$appid'");
//如果所传code已失效 //如果当前接口过去未生成过access_token
if($current_datetime>=$expire_time){ if(empty($AccessToken)){
//告知用户"authorize code is expired,err detail:code 已过期" //准备新增AccessToken
$rs['errmsg'] = "authorize code is expired,err detail:code 已过期"; $AccessToken = new AccessToken();
$rs['errcode'] = 80103; $AccessToken->Id = $this->_get_act_code(32);
$AccessToken->AppId = $appid;
$AccessToken->PrevAccessToken = null;
$AccessToken->CreateTime = $this->current_datetime;
$AccessToken->LastModifiedTime = $this->current_datetime;
}
//如果当前接口过去有生成过access_token
else{
//准备更新AccessToken
$AccessToken->LastModifiedTime = $this->current_datetime;
//如果前access_token已过期
if($this->current_datetime>$AccessToken->ExpireTime){
$AccessToken->PrevAccessToken = null;
}
//如果前access_token未过期
else{
$AccessToken->PrevAccessToken = $AccessToken->AccessToken;
}
}
//其他字段
$AccessToken->AccessToken = $access_token = $this->_get_act_code(32);
$AccessToken->ExpireTime = date("Y-m-d H:i:s", $this->current_time+14400);
//如果保存失败
if(!($AccessToken->save())){
//回滚事务
$this->db->rollback();
//告知用户"系统繁忙,请稍候再试"
$rs['errmsg'] = "系统繁忙,请稍候再试";
$rs['errcode'] = -1;
$rs['data'] = null; $rs['data'] = null;
} }
//如果所传code未失效 //如果保存成功
else{ else{
//准备判断所传code是否已使用过 //执行事务
$is_used = $TempCode->IsUsed; $this->db->commit();
//如果所传code已使用过 //告知用户"ok"
if(!empty($is_used)){ $rs['errmsg'] = "ok";
//告知用户"authorize code is used,err detail:code已使用" $rs['errcode'] = 0;
$rs['errmsg'] = "authorize code is used,err detail:code已使用"; $rs['data'] = array();
$rs['errcode'] = 80104; $rs['data']['access_token'] = $access_token;
$rs['data'] = null; $rs['data']['expire_in'] = 14400;
} $rs['data']['refresh_token'] = null;
//如果所传code未使用过
else{
//开启事务
$this->db->begin();
//准备更新临时code
$TempCode->LastModifiedTime = $current_datetime;
//其他字段
$TempCode->IsUsed = 1;
//如果保存失败
if(!($TempCode->save())){
//回滚事务
$this->db->rollback();
//告知用户"系统繁忙,请稍候再试"
$rs['errmsg'] = "系统繁忙,请稍候再试";
$rs['errcode'] = -1;
$rs['data'] = null;
}
//如果保存成功
else{
//查询当前接口过去是否有生成过access_token
$AccessToken = AccessToken::findFirst("AppId = '$appid'");
//如果当前接口过去未生成过access_token
if(empty($AccessToken)){
//准备新增AccessToken
$AccessToken = new AccessToken();
$AccessToken->Id = $this->_get_act_code(32);
$AccessToken->AppId = $appid;
$AccessToken->PrevAccessToken = null;
$AccessToken->CreateTime = $current_datetime;
$AccessToken->LastModifiedTime = $current_datetime;
}
//如果当前接口过去有生成过access_token
else{
//准备更新AccessToken
$AccessToken->LastModifiedTime = $current_datetime;
//如果前access_token已过期
if($current_datetime>$AccessToken->ExpireTime){
$AccessToken->PrevAccessToken = null;
}
//如果前access_token未过期
else{
$AccessToken->PrevAccessToken = $AccessToken->AccessToken;
}
}
//其他字段
$AccessToken->AccessToken = $access_token = $this->_get_act_code(32);
$AccessToken->ExpireTime = date("Y-m-d H:i:s", $current_time+14400);
//如果保存失败
if(!($AccessToken->save())){
//回滚事务
$this->db->rollback();
//告知用户"系统繁忙,请稍候再试"
$rs['errmsg'] = "系统繁忙,请稍候再试";
$rs['errcode'] = -1;
$rs['data'] = null;
}
//如果保存成功
else{
//执行事务
$this->db->commit();
//告知用户"ok"
$rs['errmsg'] = "ok";
$rs['errcode'] = 0;
$rs['data']['access_token'] = $access_token;
$rs['data']['expire_in'] = 14400;
$rs['data']['refresh_token'] = null;
}
}
}
} }
} }
} }

View File

@ -77,210 +77,75 @@ class SmsController extends ControllerBase{
//告知请求的资源不支持 http 方法“GET”。 //告知请求的资源不支持 http 方法“GET”。
$rs['Message'] = "请求的资源不支持 http 方法“GET”。"; $rs['Message'] = "请求的资源不支持 http 方法“GET”。";
} }
//如果未获取到请求数据 //如果不是GET请求
elseif(empty(file_get_contents("php://input"))){
//告知用户"系统繁忙,请稍候再试"
$rs['errcode'] = -1;
$rs['errmsg'] = "系统繁忙,请稍候再试";
$rs['data'] = null;
}
//如果有获取到请求数据
else{ else{
//准备判断请求数据整体是否为空 //获取请求数据
$request_arr = json_decode(file_get_contents("php://input"), true); $rs = $this->__get_request_arr();
//如果请求数据整体为空 //如果有获取到请求数据
if(empty($request_arr)){ if(!empty($rs['data']['request_arr'])){
//告知用户"系统繁忙,请稍候再试" //准备校验基本参数
$rs['errmsg'] = "系统繁忙,请稍候再试"; $request_arr = $rs['data']['request_arr'];
$rs['errcode'] = -1; $params_arr[] = "appid";
$rs['data'] = null; $params_arr[] = "mobile";
} $params_arr[] = "access_token";
//如果请求数据整体不为空 $params_arr[] = "content";
else{ //校验基本参数
//准备获取所传appid、手机号、access_token和短信内容 $rs = $this->__check_params_arr($request_arr, $params_arr);
$rs['errmsg'] = ""; //如果基本参数校验通过
//如果未获取到所传appid if(empty($rs['errcode'])){
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']; $appid = $request_arr['appid'];
//查询接口信息 //更新接口请求次数
$AppInfo = AppInfo::findFirst("AppId = '$appid' AND Enable = 0"); $rs = $this->__update_app_info($appid);
//如果未查询到接口信息 //如果接口请求次数更新成功
if(empty($AppInfo)){ if(empty($rs['errcode'])){
//告知用户"找不到app配置信息,appid无效,err detail:找不到app配置信息" //获取接口信息
$rs['errmsg'] = "找不到app配置信息,appid无效,err detail:找不到app配置信息"; $AppInfo = $rs['data']['AppInfo'];
$rs['errcode'] = 40036; //准备校验所传access_token是否有效
$rs['data'] = null; $access_token = $request_arr['access_token'];
} //校验所传access_token是否有效
//如果有查询到接口信息 $rs = $this->__check_access_token($appid, $access_token);
else{ //如果所传access_token有效
//获取上次请求日期
$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'])){ if(empty($rs['errcode'])){
//准备更新当天请求次数 //设置发送手机号
$AppInfo->LastModifiedTime = $current_datetime; $mobile = $request_arr['mobile'];
//其他字段 //设置发送FormatID
$AppInfo->TodayReqTimes = $today_req_times; $FormatID = !empty($request_arr['format'])?$request_arr['format']:8;
$AppInfo->LastReqTime = $current_date; //设置发送短信内容
//如果更新失败 $Content = $request_arr['content'];
if(!($AppInfo->save())){ //将发送短信内容URL编码
//告知用户"系统繁忙,请稍候再试" $Content = urlencode($Content);
$rs['errmsg'] = "系统繁忙,请稍候再试"; //设置发送TokenID
$rs['errcode'] = -1; $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; $rs['data'] = null;
} }
//如果更新成功 //如果发送成功
else{ else{
//准备判断所传access_token是否有效 //获取messageid
$access_token = $request_arr['access_token']; //OK:[202304121675878871004778]
//查询接口信息 $messageid = str_replace("]", "", str_replace("OK:[", "", $string));
$AccessToken = AccessToken::findFirst("AppId = '$appid' AND (AccessToken = '$access_token' OR PrevAccessToken = '$access_token')"); //告知用户"ok"
//如果未查询到接口信息 $rs['errmsg'] = "ok";
if(empty($AccessToken)){ $rs['errcode'] = 0;
//告知用户"accesstoken 不正确,err detail:找不到accesstoken信息" $rs['data'] = array()
$rs['errmsg'] = "accesstoken 不正确,err detail:找不到accesstoken信息"; $rs['data']['messageid'] = $messageid;
$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;
}
}
}
} }
} }
} }
@ -302,52 +167,21 @@ class SmsController extends ControllerBase{
//告知请求的资源不支持 http 方法“GET”。 //告知请求的资源不支持 http 方法“GET”。
$rs['Message'] = "请求的资源不支持 http 方法“GET”。"; $rs['Message'] = "请求的资源不支持 http 方法“GET”。";
} }
//如果未获取到请求数据 //如果不是GET请求
elseif(empty(file_get_contents("php://input"))){
//告知用户"系统繁忙,请稍候再试"
$rs['errcode'] = -1;
$rs['errmsg'] = "系统繁忙,请稍候再试";
$rs['data'] = null;
}
//如果有获取到请求数据
else{ else{
//准备判断请求数据整体是否为空 //获取请求数据
$request_arr = json_decode(file_get_contents("php://input"), true); $rs = $this->__get_request_arr();
//如果请求数据整体为空 //如果有获取到请求数据
if(empty($request_arr)){ if(!empty($rs['data']['request_arr'])){
//告知用户"系统繁忙,请稍候再试" //准备校验基本参数
$rs['errmsg'] = "系统繁忙,请稍候再试"; $request_arr = $rs['data']['request_arr'];
$rs['errcode'] = -1; $params_arr[] = "appid";
$rs['data'] = null; $params_arr[] = "mobile";
} $params_arr[] = "access_token";
//如果请求数据整体不为空 //校验基本参数
else{ $rs = $this->__check_params_arr($request_arr, $params_arr);
//准备获取所传appid、手机号和access_token //如果基本参数校验通过
$rs['errmsg'] = ""; if(empty($rs['errcode'])){
//如果未获取到所传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 //原代码逻辑中验证码长度小于等于0则取默认值4
@ -383,234 +217,134 @@ class SmsController extends ControllerBase{
} }
//如果所传验证码类型是1或2 //如果所传验证码类型是1或2
else{ else{
//准备判断所传appid是否有效 //准备更新接口请求次数
$appid = $request_arr['appid']; $appid = $request_arr['appid'];
//查询接口信息 //更新接口请求次数
$AppInfo = AppInfo::findFirst("AppId = '$appid' AND Enable = 0"); $rs = $this->__update_app_info($appid);
//如果未查询到接口信息 //如果接口请求次数更新成功
if(empty($AppInfo)){ if(empty($rs['errcode'])){
//告知用户"找不到app配置信息,appid无效,err detail:找不到app配置信息" //获取接口信息
$rs['errmsg'] = "找不到app配置信息,appid无效,err detail:找不到app配置信息"; $AppInfo = $rs['data']['AppInfo'];
$rs['errcode'] = 40036; //准备校验所传access_token是否有效
$rs['data'] = null; $access_token = $request_arr['access_token'];
} //校验所传access_token是否有效
//如果有查询到接口信息 $rs = $this->__check_access_token($appid, $access_token);
else{ //如果所传access_token有效
//获取上次请求日期
$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'])){ if(empty($rs['errcode'])){
//准备更新当天请求次数 //设置发送手机号
$AppInfo->LastModifiedTime = $current_datetime; $mobile = $request_arr['mobile'];
//其他字段 //设置发送FormatID
$AppInfo->TodayReqTimes = $today_req_times; $FormatID = 8;
$AppInfo->LastReqTime = $current_date; //准备设置验证码
//如果更新失败 $authcode = "";
if(!($AppInfo->save())){ //获取是否重发上一个验证码
//告知用户"系统繁忙,请稍候再试" $is_resend = isset($request_arr['is_resend'])?$request_arr['is_resend']:false;
$rs['errmsg'] = "系统繁忙,请稍候再试"; $is_resend = $is_resend?true:false;
$rs['errcode'] = -1; //如果是重发上一个验证码
$rs['data'] = null; if($is_resend){
//获取缓存中所传手机号对应的验证码
$authcode = $this->redis->get("tiffany_api_sms_authcode:".$request_arr['mobile']);
} }
//如果更新成功 //如果以上未设置验证码或缓存中所传手机号对应的验证码已失效
if(empty($authcode)){
//重置是否重发标识
$is_resend = false;
//按所传验证码长度及验证码类型生成并设置验证码
$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{ else{
//准备判断所传access_token是否有效 //将验证码短信模板设置为所传appid对应的特定短信模板
$access_token = $request_arr['access_token']; $authcode_template = $special_authcode_templates[$appid];
//查询接口信息 }
$AccessToken = AccessToken::findFirst("AppId = '$appid' AND (AccessToken = '$access_token' OR PrevAccessToken = '$access_token')"); //如果未获取到短信内容
//如果未查询到接口信息 if(empty($request_arr['content'])){
if(empty($AccessToken)){ //直接按验证码短信模板设置发送短信内容
//告知用户"accesstoken 不正确,err detail:找不到accesstoken信息" $Content = $authcode_template;
$rs['errmsg'] = "accesstoken 不正确,err detail:找不到accesstoken信息"; //将发送短信内容中的[$=yzm=$]参数替换为验证码
$rs['errcode'] = 40039; $Content = str_replace("[$=yzm=$]", $authcode, $Content);
$rs['data'] = null; }
//如果有获取到短信内容
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{ else{
//获取现access_token到期时间 //则要按所传短信内容设置发送短信内容
$ExpireTime = $AccessToken->ExpireTime; $Content = $request_arr['content'];
//获取前access_token到期时间 //循环所传appid对应的特定验证码短信参数
$PrevExpireTime = date("Y-m-d H:i:s", strtotime($AccessToken->ExpireTime)-14400+600); foreach($special_authcode_params[$appid] as $special_authcode_param){
//如果所传access_token匹配前access_token //如果当前循环特定验证码短信参数是yzm
if($access_token==$AccessToken->PrevAccessToken){ if($special_authcode_param=="yzm"){
//如果前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 = isset($request_arr['is_resend'])?$request_arr['is_resend']:false;
$is_resend = $is_resend?true:false;
//如果是重发上一个验证码
if($is_resend){
//获取缓存中所传手机号对应的验证码
$authcode = $this->redis->get("tiffany_api_sms_authcode:".$request_arr['mobile']);
}
//如果以上未设置验证码或缓存中所传手机号对应的验证码已失效
if(empty($authcode)){
//重置是否重发标识
$is_resend = false;
//按所传验证码长度及验证码类型生成并设置验证码
$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=$]参数替换为验证码 //将发送短信内容中的[$=yzm=$]参数替换为验证码
$Content = str_replace("[$=yzm=$]", $authcode, $Content); $Content = str_replace("[$=yzm=$]", $authcode, $Content);
} }
//如果有获取到短信内容 //如果当前循环特定验证码短信参数不是[$=yzm=$]
else{ else{
//获取特定验证码短信参数 //如果有传具体参数内容
$special_authcode_params = $this->special_authcode_params; if(isset($request_arr[$special_authcode_param])){
//如果所传appid无对应的特定验证码短信参数 //将发送短信内容中的当前循环特定验证码短信参数替换为具体参数内容
if(empty($special_authcode_params[$appid])){ $Content = str_replace("[$=".$special_authcode_param."=$]", $request_arr[$special_authcode_param], $Content);
//仍然直接按验证码短信模板设置发送短信内容
$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;
} }
} }
} }
} }
//将发送短信内容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'] = array()
$rs['data']['messageid'] = $messageid;
$rs['data']['authcode'] = $authcode;
}
} }
} }
} }
@ -648,215 +382,87 @@ class SmsController extends ControllerBase{
//告知请求的资源不支持 http 方法“GET”。 //告知请求的资源不支持 http 方法“GET”。
$rs['Message'] = "请求的资源不支持 http 方法“GET”。"; $rs['Message'] = "请求的资源不支持 http 方法“GET”。";
} }
//如果未获取到请求数据 //如果不是GET请求
elseif(empty(file_get_contents("php://input"))){
//告知用户"系统繁忙,请稍候再试"
$rs['errcode'] = -1;
$rs['errmsg'] = "系统繁忙,请稍候再试";
$rs['data'] = null;
}
//如果有获取到请求数据
else{ else{
//准备判断请求数据整体是否为空 //获取请求数据
$request_arr = json_decode(file_get_contents("php://input"), true); $rs = $this->__get_request_arr();
//如果请求数据整体为空 //如果有获取到请求数据
if(empty($request_arr)){ if(!empty($rs['data']['request_arr'])){
//告知用户"系统繁忙,请稍候再试" //准备校验基本参数
$rs['errmsg'] = "系统繁忙,请稍候再试"; $request_arr = $rs['data']['request_arr'];
$rs['errcode'] = -1; $params_arr[] = "appid";
$rs['data'] = null; $params_arr[] = "access_token";
} //校验基本参数
//如果请求数据整体不为空 $rs = $this->__check_params_arr($request_arr, $params_arr);
else{ //如果基本参数校验通过
//准备获取所传appid和access_token if(empty($rs['errcode'])){
$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']; $appid = $request_arr['appid'];
//查询接口信息 //更新接口请求次数
$AppInfo = AppInfo::findFirst("AppId = '$appid' AND Enable = 0"); $rs = $this->__update_app_info($appid);
//如果未查询到接口信息 //如果接口请求次数更新成功
if(empty($AppInfo)){ if(empty($rs['errcode'])){
//告知用户"找不到app配置信息,appid无效,err detail:找不到app配置信息" //获取接口信息
$rs['errmsg'] = "找不到app配置信息,appid无效,err detail:找不到app配置信息"; $AppInfo = $rs['data']['AppInfo'];
$rs['errcode'] = 40036; //准备校验所传access_token是否有效
$rs['data'] = null; $access_token = $request_arr['access_token'];
} //校验所传access_token是否有效
//如果有查询到接口信息 $rs = $this->__check_access_token($appid, $access_token);
else{ //如果所传access_token有效
//获取上次请求日期
$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'])){ if(empty($rs['errcode'])){
//准备更新当天请求次数 //设置查询MinID
$AppInfo->LastModifiedTime = $current_datetime; $MinID = isset($request_arr['min_id'])?$request_arr['min_id']:0;
//其他字段 $MinID = (int)$MinID;
$AppInfo->TodayReqTimes = $today_req_times; //设置查询TokenID
$AppInfo->LastReqTime = $current_date; $TokenID = $AppInfo->SmsToken;
//如果更新失败 //开发阶段转为使用测试TokenID
if(!($AppInfo->save())){ $TokenID = "7100477830459267";
//准备查询下行报告
$url = "https://www.wemediacn.net/webservice/smsservice.asmx/QuerySmsSeqReport?TokenID=$TokenID&MinID=$MinID";
//获取查询结果
$xml = $this->__https_request($url);
//转换查询结果格式
$array = $this->__change_xml_to_array($xml);
//获取查询结果提示
$string = !empty($array[0])?$array[0]:"";
//如果查询失败
if(!isset($array['@attributes'])){
//告知用户"系统繁忙,请稍候再试" //告知用户"系统繁忙,请稍候再试"
$rs['errmsg'] = "系统繁忙,请稍候再试";
$rs['errcode'] = -1; $rs['errcode'] = -1;
$rs['errmsg'] = "系统繁忙,请稍候再试";
$rs['data'] = null; $rs['data'] = null;
} }
//如果更新成功 //如果查询成功
else{ else{
//准备判断所传access_token是否有效 //告知用户"ok"
$access_token = $request_arr['access_token']; //注意:
//查询接口信息 //原代码逻辑中有多返回一个@count而文档中则没有写到
$AccessToken = AccessToken::findFirst("AppId = '$appid' AND (AccessToken = '$access_token' OR PrevAccessToken = '$access_token')"); //此处先遵循原代码逻辑,而不按照文档中所写的不做返回
//如果未查询到接口信息 $rs['errmsg'] = "ok";
if(empty($AccessToken)){ $rs['errcode'] = 0;
//告知用户"accesstoken 不正确,err detail:找不到accesstoken信息" $rs['data'] = array()
$rs['errmsg'] = "accesstoken 不正确,err detail:找不到accesstoken信息"; $rs['data']['NewDataSet']['@nextID'] = $array['@attributes']['nextID'];
$rs['errcode'] = 40039; $rs['data']['NewDataSet']['@count'] = $array['@attributes']['count'];
$rs['data'] = null; $rs['data']['NewDataSet']['@xmlns'] = "";
//如果无新下行报告
if(empty($array['result'])){
//设置返回结果
$rs['data']['NewDataSet']['result'] = array();
} }
//如果有查询到接口信息 //如果有新下行报告
else{ else{
//获取现access_token到期时间 //如果有新下行报告,但只有一条
$ExpireTime = $AccessToken->ExpireTime; if($array['@attributes']['count']==1){
//获取前access_token到期时间 //转换为多维数组
$PrevExpireTime = date("Y-m-d H:i:s", strtotime($AccessToken->ExpireTime)-14400+600); $array['result'] = array(0=>$array['result']);
//如果所传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{ foreach($array['result'] as $result){
//如果现access_token已过期 //转换查询结果
if($current_datetime>$ExpireTime){ $result['org_messageid'] = $result['org_messageid']!=array()?$result['org_messageid'][0]:null;
//告知用户"access_token is expired,err detail:accesstoken 已过期" $result['ip'] = $result['ip']!=array()?$result['ip'][0]:null;
$rs['errmsg'] = "access_token is expired,err detail:accesstoken 已过期"; //设置返回结果
$rs['errcode'] = 80105; $rs['data']['NewDataSet']['result'][] = $result;
$rs['data'] = null;
}
}
//如果以上判断都通过
if(empty($rs['errcode'])){
//设置查询MinID
$MinID = isset($request_arr['min_id'])?$request_arr['min_id']:0;
$MinID = (int)$MinID;
//设置查询TokenID
$TokenID = $AppInfo->SmsToken;
//开发阶段转为使用测试TokenID
$TokenID = "7100477830459267";
//准备查询下行报告
$url = "https://www.wemediacn.net/webservice/smsservice.asmx/QuerySmsSeqReport?TokenID=$TokenID&MinID=$MinID";
//获取查询结果
$xml = $this->__https_request($url);
//转换查询结果格式
$array = $this->__change_xml_to_array($xml);
//获取查询结果提示
$string = !empty($array[0])?$array[0]:"";
//如果查询失败
if(!isset($array['@attributes'])){
//告知用户"系统繁忙,请稍候再试"
$rs['errcode'] = -1;
$rs['errmsg'] = "系统繁忙,请稍候再试";
$rs['data'] = null;
}
//如果查询成功
else{
//告知用户"ok"
//注意:
//原代码逻辑中有多返回一个@count而文档中则没有写到
//此处先遵循原代码逻辑,而不按照文档中所写的不做返回
$rs['errmsg'] = "ok";
$rs['errcode'] = 0;
$rs['data']['NewDataSet']['@nextID'] = $array['@attributes']['nextID'];
$rs['data']['NewDataSet']['@count'] = $array['@attributes']['count'];
$rs['data']['NewDataSet']['@xmlns'] = "";
//如果无新下行报告
if(empty($array['result'])){
//设置返回结果
$rs['data']['NewDataSet']['result'] = array();
}
//如果有新下行报告
else{
//如果有新下行报告,但只有一条
if($array['@attributes']['count']==1){
//转换为多维数组
$array['result'] = array(0=>$array['result']);
}
//循环新下行报告
foreach($array['result'] as $result){
//转换查询结果
$result['org_messageid'] = $result['org_messageid']!=array()?$result['org_messageid'][0]:null;
$result['ip'] = $result['ip']!=array()?$result['ip'][0]:null;
//设置返回结果
$rs['data']['NewDataSet']['result'][] = $result;
}
}
}
} }
} }
} }

View File

@ -40,192 +40,61 @@ class UrlsController extends ControllerBase{
//告知请求的资源不支持 http 方法“GET”。 //告知请求的资源不支持 http 方法“GET”。
$rs['Message'] = "请求的资源不支持 http 方法“GET”。"; $rs['Message'] = "请求的资源不支持 http 方法“GET”。";
} }
//如果未获取到请求数据 //如果不是GET请求
elseif(empty(file_get_contents("php://input"))){
//告知用户"系统繁忙,请稍候再试"
$rs['errcode'] = -1;
$rs['errmsg'] = "系统繁忙,请稍候再试";
$rs['data'] = null;
}
//如果有获取到请求数据
else{ else{
//准备判断请求数据整体是否为空 //获取请求数据
$request_arr = json_decode(file_get_contents("php://input"), true); $rs = $this->__get_request_arr();
//如果请求数据整体为空 //如果有获取到请求数据
if(empty($request_arr)){ if(!empty($rs['data']['request_arr'])){
//告知用户"系统繁忙,请稍候再试" //准备校验基本参数
$rs['errmsg'] = "系统繁忙,请稍候再试"; $request_arr = $rs['data']['request_arr'];
$rs['errcode'] = -1; $params_arr[] = "appid";
$rs['data'] = null; $params_arr[] = "url";
} $params_arr[] = "access_token";
//如果请求数据整体不为空 //校验基本参数
else{ $rs = $this->__check_params_arr($request_arr, $params_arr);
//准备获取所传appid、长链接和access_token //如果基本参数校验通过
$rs['errmsg'] = ""; if(empty($rs['errcode'])){
//如果未获取到所传appid //准备更新接口请求次数
if(empty($request_arr['appid'])){
//告知用户"appid is empty;"
$rs['errmsg'].= "appid is empty;";
}
//如果未获取到所传长链接
if(empty($request_arr['url'])){
//告知用户"url is empty;"
$rs['errmsg'].= "url 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']; $appid = $request_arr['appid'];
//查询接口信息 //更新接口请求次数
$AppInfo = AppInfo::findFirst("AppId = '$appid' AND Enable = 0"); $rs = $this->__update_app_info($appid);
//如果未查询到接口信息 //如果接口请求次数更新成功
if(empty($AppInfo)){ if(empty($rs['errcode'])){
//告知用户"找不到app配置信息,appid无效,err detail:找不到app配置信息" //获取接口信息
$rs['errmsg'] = "找不到app配置信息,appid无效,err detail:找不到app配置信息"; $AppInfo = $rs['data']['AppInfo'];
$rs['errcode'] = 40036; //准备校验所传access_token是否有效
$rs['data'] = null; $access_token = $request_arr['access_token'];
} //校验所传access_token是否有效
//如果有查询到接口信息 $rs = $this->__check_access_token($appid, $access_token);
else{ //如果所传access_token有效
//获取上次请求日期
$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'])){ if(empty($rs['errcode'])){
//准备更新当天请求次数 //设置生成长链接
$AppInfo->LastModifiedTime = $current_datetime; $post_arr['urls'] = json_encode(array($request_arr['url']));
//其他字段 //设置生成TokenID
$AppInfo->TodayReqTimes = $today_req_times; $post_arr['TokenID'] = "TH3UOn1Z4p7aJFS5q8eE6Kmt9xWQsocw";
$AppInfo->LastReqTime = $current_date; //开发阶段转为使用测试TokenID
//如果更新失败 $post_arr['TokenID'] = "DAdlkwahhODpoiQPKwndkwaMDsdIN59P";
if(!($AppInfo->save())){ //准备生成短链接
$url = "https://weapp.wemediacn.com/we/surl/api/get";
//获取生成结果
$json = $this->__http_post_request($url, $post_arr);
//转换生成结果
$array = json_decode($json, true);
//如果生成失败
if(!(strpos(strtolower($json), "ok")!==false)){
//告知用户"系统繁忙,请稍候再试" //告知用户"系统繁忙,请稍候再试"
$rs['errmsg'] = "系统繁忙,请稍候再试"; $rs['errmsg'] = "系统繁忙,请稍候再试";
$rs['errcode'] = -1; $rs['errcode'] = -1;
$rs['data'] = null; $rs['data'] = null;
} }
//如果更新成功 //如果生成成功
else{ else{
//准备判断所传access_token是否有效 //告知用户"ok"
$access_token = $request_arr['access_token']; $rs['errmsg'] = "ok";
//查询接口信息 $rs['errcode'] = 0;
$AccessToken = AccessToken::findFirst("AppId = '$appid' AND (AccessToken = '$access_token' OR PrevAccessToken = '$access_token')"); $rs['data'] = array()
//如果未查询到接口信息 $rs['data']['shorturl'] = $array['urls'][0]['surl'];
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'])){
//设置生成长链接
$post_arr['urls'] = json_encode(array($request_arr['url']));
//设置生成TokenID
$post_arr['TokenID'] = "TH3UOn1Z4p7aJFS5q8eE6Kmt9xWQsocw";
//开发阶段转为使用测试TokenID
$post_arr['TokenID'] = "DAdlkwahhODpoiQPKwndkwaMDsdIN59P";
//准备生成短链接
$url = "https://weapp.wemediacn.com/we/surl/api/get";
//获取生成结果
$json = $this->__http_post_request($url, $post_arr);
//转换生成结果
$array = json_decode($json, true);
//如果生成失败
if(!(strpos(strtolower($json), "ok")!==false)){
//告知用户"系统繁忙,请稍候再试"
$rs['errmsg'] = "系统繁忙,请稍候再试";
$rs['errcode'] = -1;
$rs['data'] = null;
}
//如果生成成功
else{
//告知用户"ok"
$rs['errmsg'] = "ok";
$rs['errcode'] = 0;
$rs['data']['shorturl'] = $array['urls'][0]['surl'];
}
}
}
} }
} }
} }