api/app/controllers/SmsController.php
2023-05-31 14:23:25 +08:00

501 lines
19 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。如非本人操作请忽略本短信。",
"0e355010-67b9-4aa6-a53f-c92c972094a7"=>"你的验证码是[$=yzm=$]"
);
//特定验证码短信参数
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"),
"0e355010-67b9-4aa6-a53f-c92c972094a7"=>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'] = "18221936436";
$post_arr['access_token'] = "c82fee53ecc8aaa37b3e1584a51448f1";
$post_arr['content'] = "[$=yzm=$]、[$=params1=$]、[$=params2=$]、[$=params3=$]、[$=params4=$]、[$=params5=$]";
$post_arr['format'] = "";
$post_arr['len'] = -1;
$post_arr['type'] = -1;
$post_arr['params1'] = 1;
$post_arr['params2'] = 2;
$post_arr['params3'] = 3;
$post_arr['params4'] = 4;
$post_arr['params5'] = 5;
$post_arr['params6'] = 6;
$post_arr['is_resend'] = true;
$post_arr['min_id'] = 0;
// $post_arr['min_id'] = 4121165901;
// $post_arr['min_id'] = 4120793819;
// $post_arr['min_id'] = 4121165413;
// $post_arr['min_id'] = 4121165408;
$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”。";
}
//如果不是GET请求
else{
//校验是否有收到请求数据
$rs = $this->__check_request_arr();
//如果有收到请求数据
if(!empty($rs['data']['request_arr'])){
//获取请求数据
$request_arr = $rs['data']['request_arr'];
//准备校验基本参数是否都不为空
$params_arr[] = "appid";
$params_arr[] = "mobile";
$params_arr[] = "access_token";
$params_arr[] = "content";
//校验基本参数是否都不为空
$rs = $this->__check_params_arr($request_arr, $params_arr);
//如果基本参数都不为空
if(empty($rs['errcode'])){
//准备校验所传appid是否有效
$appid = $request_arr['appid'];
//校验所传appid是否有效
$rs = $this->__check_appid($appid);
//如果所传appid有效
if(empty($rs['errcode'])){
//获取接口信息
$AppInfo = $rs['data']['AppInfo'];
//准备校验所传access_token是否有效
$access_token = $request_arr['access_token'];
//校验所传access_token是否有效
$rs = $this->__check_access_token($appid, $access_token);
//如果所传access_token有效
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;
//准备发送短信
$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), "error")!==false){
//告知用户"发送失败,err detail:短信发送失败:".$string
//ERROR:200:[非手机号码]
//ERROR:108:[FormatID 非法数值]
$rs['errmsg'] = "发送失败,err detail:短信发送失败:".$string;
$rs['errcode'] = 70000;
$rs['data'] = null;
}
//如果发送失败,且无明确错误说明
elseif(!(strpos(strtolower($xml), "ok")!==false)){
//告知用户"服务器异常,err detail:发送短信失败具体请查看sms日志"
$rs['errmsg'] = "服务器异常,err detail:发送短信失败具体请查看sms日志";
$rs['errcode'] = 50000;
$rs['data'] = null;
}
//如果发送成功
else{
//获取messageid
//OK:[202304121675878871004778]
$messageid = str_replace("]", "", str_replace("OK:[", "", $string));
//告知用户"ok"
$rs['errmsg'] = "ok";
$rs['errcode'] = 0;
$rs['data'] = array();
$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”。";
}
//如果不是GET请求
else{
//校验是否有收到请求数据
$rs = $this->__check_request_arr();
//如果有收到请求数据
if(!empty($rs['data']['request_arr'])){
//获取请求数据
$request_arr = $rs['data']['request_arr'];
//准备校验基本参数是否都不为空
$params_arr[] = "appid";
$params_arr[] = "mobile";
$params_arr[] = "access_token";
//校验基本参数是否都不为空
$rs = $this->__check_params_arr($request_arr, $params_arr);
//如果基本参数都不为空
if(empty($rs['errcode'])){
//获取所传验证码长度
//注意:
//原代码逻辑中验证码长度小于等于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'];
//校验所传appid是否有效
$rs = $this->__check_appid($appid);
//如果所传appid有效
if(empty($rs['errcode'])){
//获取接口信息
$AppInfo = $rs['data']['AppInfo'];
//准备校验所传access_token是否有效
$access_token = $request_arr['access_token'];
//校验所传access_token是否有效
$rs = $this->__check_access_token($appid, $access_token);
//如果所传access_token有效
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=$]参数替换为验证码
$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;
//准备发送短信
$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), "error")!==false){
//告知用户"发送失败,err detail:短信发送失败:".$string
//ERROR:200:[非手机号码]
//ERROR:108:[FormatID 非法数值]
$rs['errmsg'] = "发送失败,err detail:短信发送失败:".$string;
$rs['errcode'] = 70000;
$rs['data'] = null;
}
//如果发送失败,且无明确错误说明
elseif(!(strpos(strtolower($xml), "ok")!==false)){
//告知用户"服务器异常,err detail:发送短信失败具体请查看sms日志"
$rs['errmsg'] = "服务器异常,err detail:发送短信失败具体请查看sms日志";
$rs['errcode'] = 50000;
$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;
}
}
}
}
}
}
}
}
//输出结果
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
* http://weapp.wemediacn.net/d/tiffany/api/sms/query_reports?qaz=wsx
*/
function queryReportsAction(){
//如果是GET请求
if($this->request->isGet()){
//告知请求的资源不支持 http 方法“GET”。
$rs['Message'] = "请求的资源不支持 http 方法“GET”。";
}
//如果不是GET请求
else{
//校验是否有收到请求数据
$rs = $this->__check_request_arr();
//如果有收到请求数据
if(!empty($rs['data']['request_arr'])){
//获取请求数据
$request_arr = $rs['data']['request_arr'];
//准备校验基本参数是否都不为空
$params_arr[] = "appid";
$params_arr[] = "access_token";
//校验基本参数是否都不为空
$rs = $this->__check_params_arr($request_arr, $params_arr);
//如果基本参数都不为空
if(empty($rs['errcode'])){
//准备校验所传appid是否有效
$appid = $request_arr['appid'];
//校验所传appid是否有效
$rs = $this->__check_appid($appid);
//如果所传appid有效
if(empty($rs['errcode'])){
//获取接口信息
$AppInfo = $rs['data']['AppInfo'];
//准备校验所传access_token是否有效
$access_token = $request_arr['access_token'];
//校验所传access_token是否有效
$rs = $this->__check_access_token($appid, $access_token);
//如果所传access_token有效
if(empty($rs['errcode'])){
//设置查询MinID
$MinID = isset($request_arr['min_id'])?$request_arr['min_id']:0;
$MinID = (int)$MinID;
//设置查询TokenID
$TokenID = $AppInfo->SmsToken;
//准备查询下行报告
$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'])){
//告知用户"服务器异常,err detail:获取报告失败"
$rs['errmsg'] = "服务器异常,err detail:获取报告失败";
$rs['errcode'] = 50000;
$rs['data'] = null;
}
//如果查询成功
else{
//告知用户"ok"
//注意:
//原代码逻辑中有多返回一个@count而文档中则没有写到
//此处先遵循原代码逻辑,而不按照文档中所写的不做返回
$rs['errmsg'] = "ok";
$rs['errcode'] = 0;
$rs['data'] = array();
$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;
}
}
}
}
}
}
}
}
//输出结果
echo json_encode($rs, JSON_UNESCAPED_UNICODE);
}
}
?>