Commit d8410e65 authored by luoboss's avatar luoboss
Browse files

重新上架跨域工单功能。

程序UI改进:登录注册相关页面、前台客户个人中心、提示框增加颜色标示,凸显操作状态、新增四个警告框样式、优化面板的样式效果、优化表格样式。
新增提交工单详细中自定义工单标题的功能。
新增阿里云短信的支持。
新增客户账号注册需要邮件激活验证功能。
新增钉钉企业的支持。
#164 新增提交间隔限制功能。

在工单处理详细页添加关闭工单的链接。
优化列表显示图片的宽高。
优化客户账号登录中输入密码的长度,至少6位长度。
优化通知发送方式:
    当通知发送失败后,消息有4次重新发送的机会。4次之后将停止再次发送。
    消息发送成功默认不马上删除,全部发送消息将在7天后被移除。

修复发送通知,{ticket_link}标签带了微信跳转尾巴的问题。
修复下载应用插件时,因Temp目录不存在而导致下载失败的问题。
修复忘记密码没有调用邮件模板的问题。
修复点击工单关闭跳转链接丢失的问题。
修复已关闭未处理工单依旧执行超时提醒的问题。

移除废弃的文件。

插件相关的:
新增新的事件绑定。
优化应用插件对GMA绑定的参数填写。
parent 1deea750
Showing with 449 additions and 109 deletions
+449 -109
......@@ -104,6 +104,7 @@ class Category extends \Core\Controller\Controller{
'postscript' => $value['ticket_model_postscript'],
'exclusive' => $value['ticket_model_exclusive'],
'organize_id' => $value['ticket_model_organize_id'],
'title_description' => $value['ticket_model_title_description'],
];
$field[$value['ticket_form_id']] = [
'field_name' => $value['ticket_form_name'],
......@@ -162,6 +163,7 @@ class Category extends \Core\Controller\Controller{
$this->_404();
}
$this->ticket();
$this->session()->delete('member');
ob_start();
$this->display('Category_ticket');
$javascript = "var formString = '" . addslashes(preg_replace("/\\n||\\r||\\n\\r/m ", '', ob_get_contents())) . "'\n";
......
......@@ -93,7 +93,7 @@ class Index extends \Core\Controller\Controller {
'table' => 'ticket AS t',
'field' => 't.ticket_id, t.ticket_number, t.ticket_status, t.ticket_submit_time, t.user_id, t.ticket_time_out_sequence, t.ticket_exclusive, tm.ticket_model_group_id, tm.ticket_model_time_out, tm.ticket_model_time_out_sequence',
'join' => "{$this->prefix}ticket_model AS tm ON tm.ticket_model_id = t.ticket_model_id",
'condition' => 't.ticket_status = 0 AND ticket_time_out_sequence < ticket_model_time_out_sequence ',
'condition' => 't.ticket_status = 0 AND t.ticket_close = 0 AND ticket_time_out_sequence < ticket_model_time_out_sequence ',
'lock' => 'FOR UPDATE'
]);
......
......@@ -27,6 +27,7 @@ class Login extends \Core\Controller\Controller {
$this->layout('', 'Login_layout');
}
/**
* 重置密码
*/
......@@ -44,6 +45,36 @@ class Login extends \Core\Controller\Controller {
$this->layout('', 'Login_layout');
}
/**
* 激活账号
*/
public function activation(){
$code = $this->isG('code', '请提交正确的激活码');
$checkCode = $this->db('member_activation')->where('activation_time >= :time AND activation_code = :code ')->find([
'time' => time() - 86400,
'code' => $code
]);
if (empty($checkCode)) {
$this->error('激活码不存在', '/');
}
$this->db('member')->where('member_id = :member_id')->update([
'noset' => [
'member_id' => $checkCode['member_id']
],
'member_status' => 1
]);
$this->db('member_activation')->where('activation_code = :code')->delete([
'code' => $code
]);
$this->success('您的账号已经成功激活!', $this->url('Login-index'));
}
/**
* 退出登录
*/
......
......@@ -3,6 +3,23 @@ namespace App\Form\GET;
class Member extends \Core\Controller\Controller {
/**
* 查看和更新个人信息
*/
public function index(){
$this->assign('title', '个人中心');
$this->assign('member', \Model\Content::findContent('member', $this->session()->get('member')['member_id'], 'member_id'));
$this->ticketList('5');
//经常提交的工单模型
$oftenTicket = $this->db('ticket AS t')->field('tm.ticket_model_name, tm.ticket_model_number')->join("{$this->prefix}ticket_model AS tm ON tm.ticket_model_id = t.ticket_model_id")->where('t.member_id = :member_id')->group('t.ticket_model_id')->select([
'member_id' => $this->session()->get('member')['member_id']
]);
$this->assign('oftenTicket', $oftenTicket);
$this->layout();
}
/**
* 我的工单
* @todo 本来打算将个人的工单编写在Ticket控制器
......@@ -10,7 +27,7 @@ class Member extends \Core\Controller\Controller {
* 因此我将此方法放置于Member控制器
* 若以后有调整,在将此方法进行细分.
*/
public function index(){
public function ticket(){
foreach (range(0,3) as $item){
$statistics[$item] = [
......@@ -61,7 +78,7 @@ class Member extends \Core\Controller\Controller {
/**
* 工单列表
*/
private function ticketList(){
private function ticketList($page = 15){
$condition = '';
$param = ['member_id' => $this->session()->get('member')['member_id']];
//关键词搜索
......@@ -109,7 +126,7 @@ class Member extends \Core\Controller\Controller {
'count' => sprintf($sql, 'count(*)'),
'normal' => sprintf($sql, 't.*, tm.ticket_model_name, tm.ticket_model_cid'),
'param' => $param,
'page' => 15
'page' => $page
]);
$this->assign('page', $result['page']);
......@@ -118,13 +135,4 @@ class Member extends \Core\Controller\Controller {
$this->assign('keyword', empty($keyword) ? '' : $keyword);
}
/**
* 查看和更新个人信息
*/
public function update(){
$this->assign('title', '更新个人信息');
$this->assign('member', \Model\Content::findContent('member', $this->session()->get('member')['member_id'], 'member_id'));
$this->layout();
}
}
\ No newline at end of file
......@@ -46,8 +46,10 @@ class Login extends \Core\Controller\Controller {
$this->error('帐号不存在或者密码错误');
}
if($member['member_status'] == 0){
$this->error('当前账号处于待审核/被禁用,请联系网站管理员解决。');
$statusMsg = $system['member_review'] == 2 ? '请先打开邮箱完成账号激活。' : '当前账号处于待审核/被禁用,请联系网站管理员解决。';
$this->error($statusMsg);
}
unset($member['member_password']);
......@@ -68,23 +70,23 @@ class Login extends \Core\Controller\Controller {
* 注册帐号
*/
public function signup() {
$review = \Core\Func\CoreFunc::$param['system']['member_review'];
$param = [
'member_status' => \Core\Func\CoreFunc::$param['system']['member_review'],
'member_status' => $review == 1 ? 1 : 0,
'member_createtime' => time(),
];
$param['member_account'] = $this->isP('account', '请填写登陆账号');
$param['member_name'] = $this->isP('name', '请填写名字');
$param['member_email'] = $this->isP('email', '请填写邮箱地址');
$param['member_phone'] = $this->isP('phone', '请填写手机号码');
$param['member_organize_id'] = 1;
if(!empty($_POST['weixin'])){
$param['member_weixin'] = $this->p('weixin');
}
$password = $this->isP('password', '请填密码');
$repassword = $this->isP('repassword', '请填写再次确认密码');
$password = \Model\Extra::verifyPassword();
if (\Model\Extra::checkInputValueType($param['member_email'], 1) == false) {
$this->error('请输入正确的邮箱地址');
......@@ -101,23 +103,13 @@ class Login extends \Core\Controller\Controller {
$this->checkRepeatInfo($field, $param, $msg);
}
if (strcmp($password, $repassword) != 0) {
$this->error('两次输入的密码不一致');
}
$param['member_password'] = \Core\Func\CoreFunc::generatePwd($password, 'USER_KEY');
$this->db('member')->insert($param);
$memberID = $this->db('member')->insert($param);
//关闭审核状态,发送欢迎注册邮件
if($param['member_status'] == 1){
$title = '欢迎来到'.\Core\Func\CoreFunc::$param['system']['siteTitle'];
$emailContent = \Model\MailTemplate::mergeMailTemplate("<p>您好!</p><p>{$title},您可以使用此帐号登录系统。尔后,您可以提交和管理工单。</p>");
\Model\Extra::insertSend($param['member_email'], $title, $emailContent, '1');
}
$this->sendSignUpEmail($memberID, $param, $review);
$this->success('注册成功', $this->url('Member-index'));
$this->success('注册成功', $this->url('Login-index', ['signup_complete' => $review]));
}
/**
......@@ -136,6 +128,39 @@ class Login extends \Core\Controller\Controller {
}
}
/**
* 发送欢迎或者激活账号的邮件
* @param $memberID 收到通知的账号
* @param $param 注册时提交的参数
* @param $review 系统的注册审核设置
*/
private function sendSignUpEmail($memberID, $param, $review){
switch ($review){
//关闭审核状态,发送欢迎注册邮件
case '1':
$title = '欢迎来到'.\Core\Func\CoreFunc::$param['system']['siteTitle'];
$emailContent = \Model\MailTemplate::mergeMailTemplate("<p>您好!</p><p>{$title},您可以使用此帐号登录系统。尔后,您可以提交和管理工单。</p>");
\Model\Extra::insertSend($param['member_email'], $title, $emailContent, '1');
break;
//开启邮件激活验证
case '2':
$activationCode = \Model\Extra::getOnlyNumber();
$this->db('member_activation')->insert([
'member_id' => $memberID,
'activation_code' => $activationCode,
'activation_time' => time()
]);
$url = \Core\Func\CoreFunc::$param['system']['domain'].$this->url('Login-activation', ['code' => $activationCode]);
$title = '欢迎来到'.\Core\Func\CoreFunc::$param['system']['siteTitle'].'!您需要进行邮件激活。';
$emailContent = \Model\MailTemplate::mergeMailTemplate("<p>您好!</p><p>{$title}</p><p><a href='{$url}' style='color: #bb0200;font-weight: bold;text-decoration: underline;'>请点击这里立即完成激活</a></p><p>如果上述文字点击无效,请将以下网址复制到浏览器地址栏打开(该链接使用一次或24小时后失效):<br/>{$url}</p>");
\Model\Extra::insertSend($param['member_email'], $title, $emailContent, '1');
break;
}
}
/**
* 查找密码
*/
......@@ -160,7 +185,8 @@ class Login extends \Core\Controller\Controller {
]);
//创建邮件
$mailContent = "<p>您已提交找回密码的请求,请点击此链接完成操作:" . \Core\Func\CoreFunc::$param['system']['domain'] . $this->url(GROUP . '-Login-resetpw', ['mark' => $mark]);
$restPWUrl = \Core\Func\CoreFunc::$param['system']['domain'] . $this->url(GROUP . '-Login-resetpw', ['mark' => $mark]);
$mailContent = \Model\MailTemplate::mergeMailTemplate("<p>您已提交找回密码的请求,请点击此链接完成操作:<a href=\"{$restPWUrl}\">{$restPWUrl}</a>");
\Model\Extra::insertSend($checkmember['member_email'], '重置密码请求', $mailContent, 1);
......@@ -183,12 +209,7 @@ class Login extends \Core\Controller\Controller {
$this->error('MARK不正确或者不存在', $loginUrl);
}
$password = $this->isP('passwd', '请输入新密码');
$repasswd = $this->isP('repasswd', '请输入确认新密码');
if ($password !== $repasswd) {
$this->error('两次密码不正确');
}
$password = \Model\Extra::verifyPassword();
$member = \Model\Content::findContent('member', $checkMark['member_id'], 'member_id');
......@@ -205,6 +226,7 @@ class Login extends \Core\Controller\Controller {
$this->success('密码修改成功!', $loginUrl);
}
/**
* 微信登录
*/
......
......@@ -41,6 +41,9 @@ class Submit extends \Core\Controller\Controller{
$number = $this->isP('number', '请选择您要查看的工单');
$content = $this->isP('content', '请提交回复内容');
\Model\Extra::limitSubmit('submitTicket', '1', '10');
$ticket = \Model\Ticket::getTicketBaseInfo($number);
if(!empty($_POST['back_url'])){
......
......@@ -6,7 +6,7 @@ class Member extends \Core\Controller\Controller {
/**
* 更新个人信息
*/
public function update(){
public function index(){
$param['noset']['member_id'] = $this->session()->get('member')['member_id'];
$param['member_phone'] = $this->isP('phone', '请提交手机号码');
$param['member_name'] = $this->isP('name', '请提交用户昵称');
......@@ -28,11 +28,8 @@ class Member extends \Core\Controller\Controller {
}
$updatepasswd = true;
$password = $this->p('password');
$repassword = $this->p('repassword');
if (strcmp($password, $repassword) != 0) {
$this->error('两次输入的密码不一致');
}
$password = \Model\Extra::verifyPassword();
$param['member_password'] = \Core\Func\CoreFunc::generatePwd($password, 'USER_KEY');
}
......@@ -45,7 +42,7 @@ class Member extends \Core\Controller\Controller {
$member = \Model\Content::findContent('member', $param['noset']['member_id'], 'member_id');
unset($member['member_password']);
$this->session()->set('member', $member);
$url = $this->url('Member-update');
$url = $this->url('Member-index');
}
$this->success('更新个人信息完成', $url);
......
......@@ -121,6 +121,10 @@ class Application extends \Core\Controller\Controller {
private function downloadPlugin($plugin, $version = ''){
$fileName = \Model\Extra::getOnlyNumber().'.zip';
if(!is_dir(APP_PATH.'Temp') && mkdir(APP_PATH.'Temp') === false ){
$this->error('程序创建临时目录失败,请检查程序目录是否有足够的写入权限。');
}
$patchSave = APP_PATH.'Temp/'.$fileName;
$getFile = $this->fetchPlugin($plugin, $version);
......
......@@ -61,14 +61,17 @@ class Setting extends \Core\Controller\Controller {
$viewTicketLinke = \Model\MailTemplate::getViewLink('123456');
$template = \Model\MailTemplate::matchContent(['number' => '123456', 'content' => '测试的内容', 'view' => $viewTicketLinke], $id);
$template = \Model\MailTemplate::matchContent('123456', $id);
$result = (new \Expand\sms())->send([
$param = [
'send_id' => -1,
'send_account' => $mobile,
'send_title' => $template['2'],
'send_title' => '短信测试',
'send_content' => $template['2'],
]);
];
$result = (new \Expand\SMS\SMSMain())->send($param);
echo "<p>当前发送模板: {$template['2']}</p>";
echo '<pre>';
echo "------------接口返回的原始数据-------------<br/><br/>";
......@@ -146,6 +149,33 @@ class Setting extends \Core\Controller\Controller {
exit;
}
/**
* 钉钉企业测试
*/
public function dingtalkTest(){
if(!empty($_GET['debug_access_token'])){
(new \Expand\dingtalk())->debug_access_token();
}
$account = $this->isG('account', '请填写接收消息的钉钉企业帐号');
$result = (new \Expand\dingtalk())->notice($account, '这是测试的消息内容'.date('Y-m-d H:i:s'));
echo '<pre>';
echo "您发送消息的帐号是: {$account} <br/>";
echo '<br/>';
echo "<strong>钉钉每天发送是有限额的:500条/天/人</strong> <br/>";
echo '<br/>';
echo "------------下面格式化后的模板格式-------------<br/>";
print_r(json_decode($result, true));
echo '<br/>';
echo "------------下面是钉钉企业返回的结果---------------<br/>";
print_r($result);
echo '</pre>';
echo '<br/>';
exit;
}
/**
* 检查更新模板
*/
......
......@@ -120,10 +120,10 @@ class Ticket extends \Core\Controller\Controller {
\Model\Notice::addTicketNoticeAction($number, $ticket['ticket_contact_account'], $ticket['ticket_contact'], 6);
if (empty($_POST['back_url'])) {
if (empty($_GET['back_url'])) {
$url = $this->url('Ticket-Ticket-index');
} else {
$url = $_POST['back_url'];
$url = base64_decode($_GET['back_url']);
}
$this->success('工单已被关闭!', $url);
......
......@@ -49,7 +49,8 @@ class Setting extends \Core\Controller\Controller {
'sms',
'login_verify',
'cs_notice_type',
'cs_text'
'cs_text',
'dingtalk',
]
];
foreach ($operate as $type => $item){
......@@ -78,7 +79,7 @@ class Setting extends \Core\Controller\Controller {
$data[$value] = json_encode(explode(',', str_replace(["\r\n", "\r", "\n", " "], '', $_POST[$value])));
}
// $data['crossdomain'] = !empty($_POST['crossdomain']) ? json_encode(explode("\n", str_replace("\r", "", $this->p('crossdomain')))) : '';
$data['crossdomain'] = !empty($_POST['crossdomain']) ? json_encode(explode("\n", str_replace("\r", "", $this->p('crossdomain')))) : '';
if(count($_POST['customstatus']) != '4' && count($_POST['customcolor']) != '4'){
$this->error('请提交工单状态');
......
......@@ -4,26 +4,52 @@ namespace Core\Plugin;
class Plugin{
/**
* 应用插件的注册方法
* @var array
*/
private static $pluginJson = [];
/**
* 记录初始化过的应用插件的对象
* @var array
*/
private static $pluginObj = [];
/**
* 插件按钮事件
* @param $type 事件类型
* @param $arguments 传递参数
* @return bool
*/
public function button($type, $arguments){
$json = json_decode(file_get_contents(PES_CORE.'plugin.json'), true);
if(empty($json) && !is_array($json)){
return false;
public function event($type, $arguments){
if(empty(self::$pluginJson)){
self::$pluginJson = json_decode(file_get_contents(PES_CORE.'plugin.json'), true);
if(empty(self::$pluginJson) && !is_array(self::$pluginJson)){
return false;
}
}
foreach($json as $key => $item){
/**
* @todo 随着应用增多,应该先依据GMA判断存在符合的事件。因此应该将self::$pluginObj调整一个可判断的应用对象变量。
*/
foreach(self::$pluginJson as $key => $item){
if(!$this->checkPluginFile(explode("\\", $key)) || empty($item[$type]) ){
continue;
}
$obj[$key] = new $key();
foreach ($item[$type] as $action => $auth){
if(strcmp($auth, GROUP.MODULE.ACTION) !== 0){
if(strcmp($auth, GROUP.'-'.MODULE.'-'.ACTION) !== 0){
return false;
}
$obj[$key]->$action($arguments);
if(empty(self::$pluginObj[$key])){
self::$pluginObj[$key] = new $key();
}
self::$pluginObj[$key]->$action($arguments);
}
}
}
/**
......@@ -31,6 +57,7 @@ class Plugin{
*/
public function register($class, $action){
$this->writePluginJson($class, $action);
return $this;
}
/**
......@@ -38,6 +65,7 @@ class Plugin{
*/
public function unRegister($class){
$this->writePluginJson($class);
return $this;
}
/**
......
......@@ -25,21 +25,11 @@ defined('VENDOR_PATH') or define('VENDOR_PATH', PES_CORE . 'vendor');
define('PESCMS_URL', 'https://www.pescms.com');
//解决二级目录的问题
define('IS_CGI', (0 === strpos(PHP_SAPI, 'cgi') || false !== strpos(PHP_SAPI, 'fcgi')) ? 1 : 0 );
if (!defined('_PHP_FILE_')) {
if (IS_CGI) {
//CGI/FASTCGI模式下
$_temp = explode('.php', $_SERVER['PHP_SELF']);
define('PHP_FILE', rtrim(str_replace($_SERVER['HTTP_HOST'], '', $_temp[0] . '.php'), '/'));
} else {
define('PHP_FILE', rtrim($_SERVER['SCRIPT_NAME'], '/'));
}
}
if (!defined('DOCUMENT_ROOT')) {
$_root = rtrim(dirname(PHP_FILE), '/');
define('DOCUMENT_ROOT', (($_root == '/' || $_root == '\\') ? '' : $_root));
}
//解决目录的问题
$_temp = explode('.php', $_SERVER['SCRIPT_NAME']);
define('PHP_FILE', rtrim(str_replace($_SERVER['HTTP_HOST'], '', $_temp[0] . '.php'), '/'));
$_root = rtrim(dirname(PHP_FILE), '/');
define('DOCUMENT_ROOT', (($_root == '/' || $_root == '\\') ? '' : $_root));
require PES_CORE . '/Core/App.php';
require PES_CORE . '/vendor/autoload.php';
......
......@@ -36,9 +36,11 @@ class Label {
*/
public function __call($name, $arguments) {
switch ($name) {
case 'addButton':
case 'opButton':
return (new \Core\Plugin\Plugin())->button($name, $arguments);
case 'toolEvent':
case 'opEvent':
case 'loginEvent':
case 'footerEvent':
return (new \Core\Plugin\Plugin())->event($name, $arguments);
break;
default :
return '不存在此方法';
......
......@@ -59,7 +59,7 @@ class Mail {
*/
public function send(array $email) {
if(!empty($this->error)){
\Model\Extra::errorSendResult($email['send_id'], $this->error);
\Model\Extra::stopSend($email['send_id'], $this->error);
return $this->error;
}
......@@ -76,16 +76,26 @@ class Mail {
$this->PHPMailer->Body = htmlspecialchars_decode($email['send_content']);
if ($this->PHPMailer->send() !== false) {
//发送成功,移除成功记录
\Core\Func\CoreFunc::db('send')->where('send_id = :send_id')->delete([
'send_id' => $email['send_id']
]);
$sendStatus = [
'msg' => '邮件发送成功。',
'status' => 2,
'second' => 0,
];
}else{
$msg = '邮件发送失败';
\Model\Extra::errorSendResult($email['send_id'], $msg);
$sendStatus = [
'msg' => '邮件发送失败!',
'status' => 1,
'second' => 600,
];
}
$sendStatus['id'] = $email['send_id'];
$sendStatus['sequence'] = $email['send_sequence'];
\Model\Extra::updateSendStatus($sendStatus);
$this->PHPMailer->ClearAddresses();
return $msg;
return $sendStatus['msg'];
}
/**
......
......@@ -13,6 +13,15 @@
#table-panel{
border-radius:10px; border:1px solid #dedede; margin:0 auto; background-color:#ffffff;
}
.site-title{
margin-top: 20px;
}
.site-title a{
color: #7b7b7b;
}
.site-title span{
box-sizing: border-box;
}
#logo{
width:100px;
border-top-left-radius:10px;
......@@ -29,9 +38,12 @@
display:inline;
}
.mail-content{
font-size: 15px;
font-size: 14px;
line-height: 1.5;
}
.mail-content a{
color: #7b7b7b;
}
.footerContent, .footerContent a{
color: #7b7b7b;
font-size: 0.7rem;
......@@ -65,6 +77,56 @@
text-align: left;
}
}
.selectTdClass {
background-color: #edf5fa !important
}
.mail-content table.noBorderTable td, .mail-content table.noBorderTable th, .mail-content table.noBorderTable caption {
border: 1px dashed #ddd !important
}
.mail-content table {
font-size: 14px;
margin-bottom: 10px;
border-collapse: collapse;
display: table;
}
.mail-content table td, .mail-content table th {
padding: 5px 10px;
border: 1px solid #DDD;
}
.mail-content table caption {
border: 1px dashed #DDD;
border-bottom: 0;
padding: 3px;
text-align: center;
}
.mail-content table th {
border-top: 1px solid #BBB;
background-color: #F7F7F7;
}
.mail-content table tr.firstRow th {
border-top-width: 2px;
}
.mail-content table .ue-table-interlace-color-single {
background-color: #fcfcfc;
}
.mail-content table .ue-table-interlace-color-double {
background-color: #f7faff;
}
.mail-content table td p {
margin: 0;
padding: 0;
}
</style>
</head>
<body>
......@@ -74,7 +136,7 @@
<td align="center" style="background: #f7f9fa;padding:22px 0 15px 0" class="responsive-table">
<table width="552" border="0" cellpadding="0" cellspacing="0" id="table-panel" class="responsive-table">
<tr>
<td style="padding:0 0 40px 0;" align="center" class="padding2">
<td style="padding:0 0 20px 0;" align="center" class="padding2">
<a href="{host}" target="_blank"><img style="" src="{logo}" id="logo"></a>
</td>
</tr>
......
<?php
namespace Expand\SMS;
interface SMSInterface{
public function send($param);
}
\ No newline at end of file
<?php
namespace Expand\SMS;
/**
* 短信接口
*/
class SMSMain {
public function send(array $param) {
$smsConfig = json_decode(\Core\Func\CoreFunc::$param['system']['sms'], true);
switch ($smsConfig['COMPANY']){
case '1':
$name = 'aliyunSMS';
break;
case '2':
$name = 'ihuyiSMS';
break;
default:
$error = '未知的短信接口设置';
\Model\Extra::stopSend($param['send_id'], $error);
return $error;
}
$objName= "\\Expand\\SMS\\{$name}";
$result = (new $objName($smsConfig))->send($param);
return $result;
}
}
\ No newline at end of file
<?php
namespace Expand\SMS;
/**
* 阿里云短信接口
* @author 王浩铭
* 本源码基于 https://www.whmblog.cn/php/102.html 提供的代码进行整合而成。
*/
class aliyunSMS implements SMSInterface {
public $error;
private $accessKeyId = '';
private $accessKeySecret = '';
private $signName = '';
public function __construct($config) {
if (empty($config['aliyun_accessKeyId']) || empty($config['aliyun_accessSecret'])) {
$this->error = '未配置阿里云短信接口信息';
return $this->error;
}
// 配置参数
$this->accessKeyId = $config['aliyun_accessKeyId'];
$this->accessKeySecret = $config['aliyun_accessSecret'];
$this->signName = $config['aliyun_SignName'];
}
private function percentEncode($string) {
$string = urlencode($string);
$string = preg_replace('/\+/', '%20', $string);
$string = preg_replace('/\*/', '%2A', $string);
$string = preg_replace('/%7E/', '~', $string);
return $string;
}
/**
* 签名
* @param $parameters
* @param $accessKeySecret
* @return string
*/
private function computeSignature($parameters, $accessKeySecret) {
ksort($parameters);
$canonicalizedQueryString = '';
foreach ($parameters as $key => $value) {
$canonicalizedQueryString .= '&' . $this->percentEncode($key) . '=' . $this->percentEncode($value);
}
$stringToSign = 'GET&%2F&' . $this->percentencode(substr($canonicalizedQueryString, 1));
$signature = base64_encode(hash_hmac('sha1', $stringToSign, $accessKeySecret . '&', true));
return $signature;
}
/**
* @desc 发送短信
* @param $mobile 手机验证
* @param $code 随机生成的验证码
*/
public function send($param) {
$params = array (
'SignName' => $this->signName,
'Format' => 'JSON',
'Version' => '2017-05-25',
'AccessKeyId' => $this->accessKeyId,
'SignatureVersion' => '1.0',
'SignatureMethod' => 'HMAC-SHA1',
'SignatureNonce' => uniqid(),
'Timestamp' => gmdate('Y-m-d\TH:i:s\Z'),
'Action' => 'SendSms',
'PhoneNumbers' => $param['send_account'],
);
$params = array_merge($params, json_decode($param['send_content'], true));
$params['Signature'] = $this->computeSignature($params, $this->accessKeySecret);
$url = 'http://dysmsapi.aliyuncs.com/?' . http_build_query($params);
$result = json_decode((new \Expand\cURL())->init($url), true);
if ($result['Message'] == 'OK') {
$sendStatus = [
'msg' => '短信发送成功。',
'status' => 2,
'second' => 0,
];
} else {
$sendStatus = [
'msg' => "短信发送失败!{$result['Message']}",
'status' => 1,
'second' => 600,
];
}
$sendStatus['id'] = $param['send_id'];
$sendStatus['sequence'] = $param['send_sequence'];
\Model\Extra::updateSendStatus($sendStatus);
return $sendStatus['msg'];
}
}
\ No newline at end of file
<?php
namespace Expand;
namespace Expand\SMS;
/**
* 短信接口
* 互亿无线短信接口
*/
class sms {
class ihuyiSMS implements SMSInterface {
private $APIID, $APIKEY, $error;
public function __construct() {
$sms_api = json_decode(\Core\Func\CoreFunc::$param['system']['sms'], true);
if(empty($sms_api['APIID']) || empty($sms_api['APIKEY']) ){
$this->error = '未配置短信接口信息';
public function __construct($config) {
if(empty($config['ihuyi_APIID']) || empty($config['ihuyi_APIKEY']) ){
$this->error = '未配置互亿无线短信接口';
return $this->error;
}
$this->APIID = $sms_api['APIID'];
$this->APIKEY = $sms_api['APIKEY'];
$this->APIID = $config['ihuyi_APIID'];
$this->APIKEY = $config['ihuyi_APIKEY'];
}
public function send($param){
if(!empty($this->error)){
\Model\Extra::errorSendResult($param['send_id'], $this->error);
\Model\Extra::stopSend($param['send_id'], $this->error);
return $this->error;
}
......@@ -30,19 +29,24 @@ class sms {
$result= $this->xml_to_array((new \Expand\cURL())->init('http://106.ihuyi.cn/webservice/sms.php?method=Submit', $post_data));
if($result['SubmitResult']['code'] == 2){
\Core\Func\CoreFunc::db('send')->where('send_id = :send_id')->delete([
'send_id' => $param['send_id']
]);
$sendStatus = [
'msg' => '短信发送成功。',
'status' => 2,
'second' => 0,
];
}else{
\Core\Func\CoreFunc::db('send')->where('send_id = :send_id')->update([
'noset' => [
'send_id' => $param['send_id']
],
'send_result' => $result['SubmitResult']['code']
]);
$sendStatus = [
'msg' => "短信发送失败!{$result['SubmitResult']['code']}",
'status' => 1,
'second' => 600,
];
}
$sendStatus['id'] = $param['send_id'];
$sendStatus['sequence'] = $param['send_sequence'];
return json_encode($result);
\Model\Extra::updateSendStatus($sendStatus);
return $sendStatus['msg'];
}
//将 xml数据转换为数组格式。
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment