363 lines
10 KiB
PHP
Executable File
363 lines
10 KiB
PHP
Executable File
<?php
|
||
|
||
# @Author: 嗨噜客(三亚) <fm453>
|
||
# @Date: 2022-05-22T07:38:52+08:00
|
||
# @Email: fm453@lukegzs.com
|
||
# @Last modified by: fm453
|
||
# @Last modified time: 2024-08-09T09:13:59+08:00
|
||
# @Copyright: www.hiluker.cn
|
||
|
||
namespace api\controllers\gm\v1;
|
||
|
||
use Yii;
|
||
use vendor\aliyun\dysms\Sms;
|
||
use common\models\CSms;
|
||
use common\models\CVcode;
|
||
use addons\models\AcPlat;
|
||
|
||
class SmsController extends Common
|
||
{
|
||
public function beforeAction($action)
|
||
{
|
||
if (!$this->pid) {
|
||
$this->result('您正使用本系统内部接口,禁止非法链接使用!');
|
||
}
|
||
return parent::beforeAction($action);
|
||
}
|
||
|
||
public function actionIndex()
|
||
{
|
||
$apis = [
|
||
'vcode' => '获取短信验证码'
|
||
];
|
||
$this->result('您正使用CMTS-CLIENT系统短信管理接口!', $apis, 200);
|
||
}
|
||
|
||
public function actionSend()
|
||
{
|
||
global $START_TIME;
|
||
|
||
$session = Yii::$app->session;
|
||
|
||
//数据取出方法
|
||
$dataPost = Yii::$app->request->post(); //YII应用内的真实或模拟POST数据
|
||
$dataGet = Yii::$app->request->get(); //YII应用内的真实或模拟GET数据
|
||
$params = Yii::$app->params;
|
||
|
||
$config = array();
|
||
$config['accessKeyId'] = isset($dataPost['accessKeyId']) ? $dataPost['accessKeyId'] : $params['aliDySms']['accessKeyId'];
|
||
$config['accessKeySecret'] = isset($dataPost['accessKeySecret']) ? $dataPost['accessKeySecret'] : $params['aliDySms']['accessKeySecret'];
|
||
$config['sign'] = isset($dataPost['sign']) ? $dataPost['sign'] : $params['aliDySms']['sign'];
|
||
if ($config) {
|
||
$session->set('sms::config', $config);
|
||
} else {
|
||
$config = $session->get('sms::config');
|
||
}
|
||
|
||
$option = array();
|
||
$sms = new Sms($option, $config);
|
||
|
||
$address = isset($dataPost['address']) ? $dataPost['address'] : '';
|
||
if ($address) {
|
||
$session->set('sms::address', $address);
|
||
} else {
|
||
$address = $session->get('sms::address');
|
||
}
|
||
|
||
$tmpl = isset($dataPost['tmpl']) ? $dataPost['tmpl'] : '';
|
||
if ($tmpl) {
|
||
$session->set('sms::tmpl', $tmpl);
|
||
} else {
|
||
$tmpl = $session->get('sms::tmpl');
|
||
}
|
||
|
||
$_guests = isset($dataPost['guests']) ? $dataPost['guests'] : '';
|
||
if (!$_guests) {
|
||
$guests = $session->get('sms::guests');
|
||
} else {
|
||
$_guests = explode("\r\n", $_guests);
|
||
$guests = array();
|
||
foreach ($_guests as $c) {
|
||
$_c = explode(',', $c);
|
||
if (count($_c) > 1) {
|
||
$k = trim($_c[1]);
|
||
$v = trim($_c[0]);
|
||
$guests[$k] = $v;
|
||
}
|
||
}
|
||
unset($_c);
|
||
unset($k);
|
||
unset($v);
|
||
$guests = array_unique($guests);
|
||
}
|
||
|
||
if (!$guests) {
|
||
$i = (int)$session->get('sms::success');
|
||
$session->set('sms::success', 0);
|
||
$msg = $session->get('sms::msg');
|
||
$session->set('sms::msg', '');
|
||
$this->result('群发完成,共成功发送' . $i . '条;详情:' . $msg);
|
||
}
|
||
|
||
$results = [];
|
||
$msg = "";
|
||
$content = [];
|
||
$content['address'] = $address;
|
||
$i = 0;
|
||
$j = 50;
|
||
|
||
foreach ($guests as $p => $username) {
|
||
$j--;
|
||
$content['name'] = !empty($username) ? $username . '安诚托车' : '安诚捷顺运车';
|
||
$result = $sms->send($p, $tmpl, $content);
|
||
$results[$p] = $result;
|
||
|
||
if (!$result) {
|
||
$msg .= "【" . $p . "】发送失败,接口提示:" . $sms->errors . "\r\n";
|
||
} else if ($result->Code != 'OK') {
|
||
$msg .= "【" . $p . "】发送失败,接口提示:" . $result->Message . "\r\n";
|
||
} else {
|
||
$i++;
|
||
$msg .= "【" . $p . "】发送成功";
|
||
}
|
||
unset($guests[$p]);
|
||
if ($j == 0) {
|
||
break;
|
||
}
|
||
}
|
||
$session->set('sms::guests', $guests);
|
||
|
||
$i += (int)$session->get('sms::success');
|
||
$session->set('sms::success', $i);
|
||
$msg .= $session->get('sms::msg');
|
||
$session->set('sms::msg', $msg);
|
||
$this->result('群发完成,共成功发送' . $i . '条;详情:' . $msg);
|
||
}
|
||
|
||
//发送验证码
|
||
public function actionVcode()
|
||
{
|
||
$pid = $this->pid;
|
||
$plat = AcPlat::findOne($pid);
|
||
$platExt = json_decode($plat->remark, TRUE);
|
||
|
||
//数据取出方法
|
||
$dataPost = $this->postdata; //YII应用内的真实或模拟POST数据
|
||
$phone = $dataPost['phone'] ?? 0;
|
||
//验证手机号
|
||
$isPhone = FALSE;
|
||
if ($phone) {
|
||
$isPhone = preg_match('/^1\d{10}$/', $phone) ? TRUE : FALSE;
|
||
}
|
||
if (!$isPhone) {
|
||
$this->result('手机号不正确,请确认');
|
||
}
|
||
// 手机号掩码
|
||
$phoneMask = substr($phone, 0, 3) . str_repeat('*', strlen($phone) - 7) . substr($phone, -4);
|
||
|
||
$params = Yii::$app->params;
|
||
$codetype = $dataPost['scence'] ?? 'vcode'; //验证码使用场景
|
||
|
||
$config = array();
|
||
$config['accessKeyId'] = isset($dataPost['accessKeyId']) ? $dataPost['accessKeyId'] : $params['aliDySms']['accessKeyId'];
|
||
$config['accessKeySecret'] = isset($dataPost['accessKeySecret']) ? $dataPost['accessKeySecret'] : $params['aliDySms']['accessKeySecret'];
|
||
$config['sign'] = isset($dataPost['sign']) ? $dataPost['sign'] : $params['aliDySms']['sign'];
|
||
|
||
$option = array();
|
||
$sms = new Sms($option, $config);
|
||
$_time = time();
|
||
$vcodeModel = new CVcode();
|
||
//查询上次发送记录
|
||
$where = [];
|
||
$where['mobile'] = $phone;
|
||
$where['deleted'] = 0;
|
||
$where['type'] = $codetype;
|
||
$res = $vcodeModel->find()->where($where)->one();
|
||
if ($res) {
|
||
if (($_time - $res->create_at) < 300) {
|
||
//设置5分钟内,验证码仍然可用
|
||
$code = $res->code;
|
||
$msg = '上次发送的验证码仍然可用;请注意查看手机 ' . $phoneMask;
|
||
$data = ['errorcode' => 2];
|
||
if (YII_DEBUG) {
|
||
$data['code'] = $code;
|
||
}
|
||
$this->result($msg, $data, 200);
|
||
} else {
|
||
$res->deleted = 1;
|
||
$res->save();
|
||
}
|
||
}
|
||
|
||
$content = [];
|
||
$code = mt_rand(1000, 9999);
|
||
$content['code'] = $code;
|
||
|
||
//验证码准备入库
|
||
$vcode = [];
|
||
$vcode['code'] = $code;
|
||
$vcode['type'] = $codetype;
|
||
$vcode['mobile'] = $phone;
|
||
$vcode['create_at'] = $_time;
|
||
foreach ($vcode as $key => $val) {
|
||
$vcodeModel->$key = $val;
|
||
}
|
||
$tmpls = $params['aliDySms']['tmpl'];
|
||
switch ($codetype) {
|
||
case 'reg':
|
||
$tmpl = $tmpls['regVerify'];
|
||
break;
|
||
case 'login':
|
||
$tmpl = $tmpls['loginVcode'];
|
||
break;
|
||
case 'info':
|
||
$tmpl = $tmpls['infoChange'];
|
||
break;
|
||
case 'passwd':
|
||
$tmpl = $tmpls['passwdChange'];
|
||
break;
|
||
case 'vcode':
|
||
default:
|
||
$tmpl = $tmpls['vcode'];
|
||
break;
|
||
}
|
||
|
||
// 发送前控制
|
||
$host = yii::$app->request->hostName;
|
||
$debug = $params['aliDySms']['debug'] ?? FALSE;
|
||
$domains = $params['aliDySms']['domains'] ?? [];
|
||
$sendable = FALSE;
|
||
if (in_array($host, $domains) || $debug) {
|
||
$sendable = TRUE;
|
||
}
|
||
$result = TRUE;
|
||
if ($sendable) {
|
||
$result = $sms->send($phone, $tmpl, $content);
|
||
}
|
||
|
||
//保存发送记录
|
||
$smsModel = new CSms();
|
||
$smsdata = [];
|
||
$sid = $params['siteId'];
|
||
$smsdata['sid'] = (int)$sid;
|
||
$smsdata['pid'] = $pid;
|
||
$smsdata['uid'] = $this->user_id;
|
||
$smsdata['mid'] = 0;
|
||
$smsdata['mobile'] = $phone;
|
||
$smsdata['content'] = json_encode($content, JSON_UNESCAPED_UNICODE);
|
||
$smsdata['create_at'] = $_time;
|
||
foreach ($smsdata as $key => $val) {
|
||
$smsModel->$key = $val;
|
||
}
|
||
$smsModel->save();
|
||
|
||
$errorcode = 0;
|
||
$msg = '';
|
||
if (!$result) {
|
||
$msg .= "发送失败,接口提示:" . $sms->errors;
|
||
$errorcode = 3;
|
||
} else if (is_array($result) && $result['Code'] != 'OK') {
|
||
$msg .= "发送失败,接口提示:" . $result['Message'];
|
||
$errorcode = 4;
|
||
} else {
|
||
$vcodeModel->save();
|
||
$msg .= "发送成功";
|
||
}
|
||
$data = ['errorcode' => $errorcode];
|
||
if (!$debug || YII_DEBUG) {
|
||
$data['data'] = $content;
|
||
}
|
||
$this->result($msg, $data, 200);
|
||
}
|
||
|
||
//发送给财务
|
||
public function actionCaiwu()
|
||
{
|
||
$pid = $this->pid;
|
||
$plat = AcPlat::findOne($pid);
|
||
$platExt = json_decode($plat->remark, TRUE);
|
||
|
||
$phone = $platExt['cw_phone'];
|
||
if (!$phone) {
|
||
$this->result('还没有配置财务手机号,请联系站长管理员进行设置!', ['errorcode' => 1], 200);
|
||
}
|
||
|
||
$vcodeModel = new CVcode();
|
||
$codetype = 'caiwu';
|
||
//查询上次发送记录
|
||
$_time = time();
|
||
$where = [];
|
||
$where['mobile'] = $phone;
|
||
$where['deleted'] = 0;
|
||
$where['type'] = $codetype;
|
||
$res = $vcodeModel->find()->where($where)->one();
|
||
if ($res) {
|
||
if (($_time - $res->create_at) < 7200) {
|
||
//设置2小时内,验证码仍然可用
|
||
$code = $res->code;
|
||
$this->result('上次发送的验证码仍然可用;请注意查看财务手机!', ['errorcode' => 2], 200);
|
||
} else {
|
||
$res->deleted = 1;
|
||
$res->save();
|
||
}
|
||
}
|
||
|
||
//数据取出方法
|
||
$dataPost = $this->postdata; //YII应用内的真实或模拟POST数据
|
||
$params = Yii::$app->params;
|
||
|
||
$content = [];
|
||
$code = mt_rand(1000, 9999);
|
||
$content['code'] = $code;
|
||
$tmpl = $params['aliDySms']['tmpl']['cwVcode'];
|
||
|
||
//验证码准备入库
|
||
$vcode = [];
|
||
$vcode['code'] = $code;
|
||
$vcode['type'] = $codetype;
|
||
$vcode['mobile'] = $phone;
|
||
$vcode['create_at'] = $_time;
|
||
foreach ($vcode as $key => $val) {
|
||
$vcodeModel->$key = $val;
|
||
}
|
||
|
||
$config = array();
|
||
$config['accessKeyId'] = isset($dataPost['accessKeyId']) ? $dataPost['accessKeyId'] : $params['aliDySms']['accessKeyId'];
|
||
$config['accessKeySecret'] = isset($dataPost['accessKeySecret']) ? $dataPost['accessKeySecret'] : $params['aliDySms']['accessKeySecret'];
|
||
$config['sign'] = isset($dataPost['sign']) ? $dataPost['sign'] : $params['aliDySms']['sign'];
|
||
|
||
$option = array();
|
||
$sms = new Sms($option, $config);
|
||
$result = $sms->send($phone, $tmpl, $content); //编排发送短信
|
||
//保存发送记录
|
||
$smsModel = new CSms();
|
||
$smsdata = [];
|
||
$sid = $params['siteId'];
|
||
$smsdata['sid'] = (int)$sid;
|
||
$smsdata['pid'] = $pid;
|
||
$smsdata['uid'] = $this->user_id;
|
||
$smsdata['mid'] = 0;
|
||
$smsdata['mobile'] = $phone;
|
||
$smsdata['content'] = json_encode($content, JSON_UNESCAPED_UNICODE);
|
||
$smsdata['create_at'] = $_time;
|
||
foreach ($smsdata as $key => $val) {
|
||
$smsModel->$key = $val;
|
||
}
|
||
$smsModel->save();
|
||
|
||
$errorcode = 0;
|
||
$msg = '';
|
||
if (!$result) {
|
||
$msg .= "发送失败,接口提示:" . $sms->errors;
|
||
$errorcode = 3;
|
||
} else if (is_array($result) && $result['Code'] != 'OK') {
|
||
$msg .= "发送失败,接口提示:" . $result['Message'];
|
||
$errorcode = 4;
|
||
} else {
|
||
$vcodeModel->save();
|
||
$msg .= "发送成功";
|
||
}
|
||
$this->result($msg, ['errorcode' => $errorcode], 200);
|
||
}
|
||
}
|