This commit is contained in:
parent
ebc7f2be88
commit
64cb3601aa
142
application/admin/view/user4s/user/sms.html
Normal file
142
application/admin/view/user4s/user/sms.html
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
<form id="sms-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
|
||||||
|
{:token()}
|
||||||
|
<div class="panel panel-warning">
|
||||||
|
<div class="panel-heading"><b>用户和平台信息</div>
|
||||||
|
<div class="panel-body">
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label col-xs-4 col-sm-2">用户数:</label>
|
||||||
|
<div class="col-xs-6 col-sm-8">
|
||||||
|
<label class="control-label">{$user_num|htmlentities}</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label col-xs-4 col-sm-2">姓名电话:</label>
|
||||||
|
<div class="col-xs-6 col-sm-8">
|
||||||
|
<label class="control-label" style="text-align: left;">
|
||||||
|
{foreach $row as $vo}
|
||||||
|
<span class="label label-info" id="status_{$vo['id']}">{$vo['name']}({$vo['tel']})</span>
|
||||||
|
{/foreach}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label col-xs-4 col-sm-2">发送状态:</label>
|
||||||
|
<div class="col-xs-8 col-sm-10">
|
||||||
|
<label class="control-label" style="text-align: left;" id="sms_status">
|
||||||
|
未发送
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label col-xs-4 col-sm-2">短信余额:</label>
|
||||||
|
<div class="col-xs-6 col-sm-8">
|
||||||
|
<label class="control-label">{$sms_info.overage|htmlentities}元</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label col-xs-4 col-sm-2">短信总点数:</label>
|
||||||
|
<div class="col-xs-6 col-sm-8">
|
||||||
|
<label class="control-label">{$sms_info.sendTotal|htmlentities}</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label col-xs-12 col-sm-2">{:__('短信内容')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<textarea name="sms_content" class="form-control" data-rule="" rows="5" >【比亚迪汽车】亲爱的[姓氏][称呼],祝您生日快乐,平安健康,美好常伴。退订回T</textarea>
|
||||||
|
<span id="helpBlock" class="help-block">短信内容需要以“【公司名称】”开头,以“退订回T”结尾,支持环境变量。</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label col-xs-12 col-sm-2">{:__('环境变量示例')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<label class="control-label" style="text-align: left;">
|
||||||
|
|
||||||
|
<span class="label label-primary">[ID] 示例值:1</span>
|
||||||
|
<span class="label label-primary">[姓名] 示例值:张三</span>
|
||||||
|
<span class="label label-primary">[姓氏] 示例值:张</span>
|
||||||
|
<span class="label label-primary">[联系方式] 示例值:1526425507</span>
|
||||||
|
<span class="label label-primary">[余额] 示例值:1.00</span>
|
||||||
|
<span class="label label-primary">[积分] 示例值:100</span>
|
||||||
|
<span class="label label-primary">[性别] 示例值:男 女</span>
|
||||||
|
<span class="label label-primary">[称呼] 示例值:先生 女士</span>
|
||||||
|
<span class="label label-primary">[身份证] 示例值:3713261xxxxxxxxx</span>
|
||||||
|
<span class="label label-primary">[生日] 示例值:2022-05-08</span>
|
||||||
|
<span class="label label-primary">[购车日期] 示例值:2022-05-08</span>
|
||||||
|
<span class="label label-primary">[车牌号码] 示例值:鲁Q12345</span>
|
||||||
|
<span class="label label-primary">[车架号] 示例值:LGXC14DF6L0127066</span>
|
||||||
|
<span class="label label-primary">[车型] 示例值:宋经典手动</span>
|
||||||
|
<span class="label label-primary">[颜色] 示例值:水晶白</span>
|
||||||
|
<span class="label label-primary">[保险类型] 示例值:交强险</span>
|
||||||
|
<span class="label label-primary">[保险公司] 示例值:平安保险 人保</span>
|
||||||
|
<span class="label label-primary">[保险日期] 示例值:2022-05-08</span>
|
||||||
|
<span class="label label-primary">[备注]</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group layer-footer">
|
||||||
|
<label class="control-label col-xs-12 col-sm-2"></label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<button type="submit" class="btn btn-primary btn-embossed">{:__('发送')}</button>
|
||||||
|
<button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<style>
|
||||||
|
.bs-callout {
|
||||||
|
padding: 20px;
|
||||||
|
margin: 20px 0;
|
||||||
|
border: 1px solid #eee;
|
||||||
|
border-left-width: 5px;
|
||||||
|
border-radius: 3px;
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
+.bs-callout {
|
||||||
|
margin-top: -5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-callout-danger {
|
||||||
|
border-left-color: #ce4844;
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
color: #ce4844;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-callout-warning {
|
||||||
|
border-left-color: #aa6708;
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
color: #aa6708;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.bs-callout-info {
|
||||||
|
border-left-color: #1b809e;
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
color: #1b809e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
294
extend/car/Sms.php
Normal file
294
extend/car/Sms.php
Normal file
@ -0,0 +1,294 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Copyright (c) 2011 http://thinkphp.cn All rights reserved.
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | Author: luofei614 <weibo.com/luofei614>
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
// | 修改者: anuo (本权限类在原3.2.3的基础上修改过来的)
|
||||||
|
// +----------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace car;
|
||||||
|
|
||||||
|
use think\Db;
|
||||||
|
use think\Config;
|
||||||
|
use think\Session;
|
||||||
|
use think\Request;
|
||||||
|
use fast\Http;
|
||||||
|
use app\common\model\user4s\User;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 企信通短信
|
||||||
|
*/
|
||||||
|
class Sms
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var object 对象实例
|
||||||
|
*/
|
||||||
|
protected static $instance;
|
||||||
|
protected $rules = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* http实例
|
||||||
|
* @var Http
|
||||||
|
*/
|
||||||
|
protected $http;
|
||||||
|
//默认配置
|
||||||
|
protected $config = [
|
||||||
|
'url' => 'http://47.106.229.82:8888/', // 接口地址
|
||||||
|
'userid' => 1, // 企业ID
|
||||||
|
'account' => '', // 账号
|
||||||
|
'password' => '', // 密码
|
||||||
|
];
|
||||||
|
|
||||||
|
public function __construct($options = [])
|
||||||
|
{
|
||||||
|
if ($auth = Config::get('sms')) {
|
||||||
|
$this->config = array_merge($this->config, $auth);
|
||||||
|
}
|
||||||
|
if(!empty($options)){
|
||||||
|
$this->config = array_merge($this->config, $options);
|
||||||
|
}
|
||||||
|
$this->http = new Http;
|
||||||
|
return self::$instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 给用户发送短信 支持变量模板
|
||||||
|
[ID]
|
||||||
|
[姓名] 张三
|
||||||
|
[姓氏] 张
|
||||||
|
[联系方式] 1526425507
|
||||||
|
[余额] 1.00
|
||||||
|
[积分] 100
|
||||||
|
[性别] 男 女
|
||||||
|
[称呼] 先生 女士
|
||||||
|
[身份证] 3713261xxxxxxxxx
|
||||||
|
[生日] 2022-05-08
|
||||||
|
[购车日期] 2022-05-08
|
||||||
|
[车牌号码] 鲁Q12345
|
||||||
|
[车架号] LGXC14DF6L0127066
|
||||||
|
[车型] 宋经典手动
|
||||||
|
[颜色] 水晶白
|
||||||
|
[保险类型] 交强险
|
||||||
|
[保险公司] 平安保险 人保
|
||||||
|
[保险日期] 2022-05-08
|
||||||
|
[备注]
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function send($uid,$content,$sendTime='')
|
||||||
|
{
|
||||||
|
if(!is_array($uid)){
|
||||||
|
$user_ids[] = $uid;
|
||||||
|
}else{
|
||||||
|
$user_ids = $uid;
|
||||||
|
}
|
||||||
|
if(empty($user_ids) || empty($content)){
|
||||||
|
$res['code'] = 0;
|
||||||
|
$res['msg'] = '用户ID或内容为空';
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
$return = array('code' => 1, 'total' => 0, 'success' => 0);
|
||||||
|
$user = new User;
|
||||||
|
$list = User::where('id', 'in', $user_ids)->select();
|
||||||
|
$list = collection($list)->toarray();
|
||||||
|
$user_list = array_column($list, null, 'id');
|
||||||
|
|
||||||
|
$prefix = Config::get('database.prefix');
|
||||||
|
$fieldArr = [];
|
||||||
|
$table = $prefix . 'user4s_user';
|
||||||
|
$database = Config::get('database.database');
|
||||||
|
$pk = Db::getTableInfo($table, 'pk');
|
||||||
|
$list = db()->query(
|
||||||
|
"SELECT COLUMN_NAME,COLUMN_COMMENT,COLUMN_TYPE,IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ? AND TABLE_SCHEMA = ?",
|
||||||
|
[$table, $database]
|
||||||
|
);
|
||||||
|
foreach ($list as $k => $v) {
|
||||||
|
if ($v['COLUMN_NAME'] !== $pk) {
|
||||||
|
$fieldArr[$v['COLUMN_COMMENT']] = $v; //['COLUMN_NAME']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach ($user_ids as $u) {
|
||||||
|
if (!empty($user_list[$u]['tel'])) {
|
||||||
|
foreach ($fieldArr as $name => $field) {
|
||||||
|
if (stripos($name, ':') != false) {
|
||||||
|
$name = explode(':', $name, 2)[0];
|
||||||
|
}
|
||||||
|
if (stripos($content, '[' . $name . ']') != false && !empty($user_list[$u][$field['COLUMN_NAME']])) {
|
||||||
|
$content = str_replace('[' . $name . ']', $user_list[$u][$field['COLUMN_NAME']], $content);
|
||||||
|
}
|
||||||
|
if(stripos($content, '[称呼]') != false){
|
||||||
|
if ($user_list[$u]['genderdata'] == 'female') {
|
||||||
|
$content = str_replace('[称呼]', '女士', $content);
|
||||||
|
}else{
|
||||||
|
$content = str_replace('[称呼]', '先生', $content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(stripos($content, '[姓氏]') != false){
|
||||||
|
$xingshi = mb_substr($user_list[$u]['name'], 0, 1, 'utf-8');
|
||||||
|
$content = str_replace('[姓氏]', $xingshi, $content);
|
||||||
|
}
|
||||||
|
if (stripos($content, 'male') != false) {
|
||||||
|
$content = str_replace('male', '男', $content);
|
||||||
|
}
|
||||||
|
if (stripos($content, 'female') != false) {
|
||||||
|
$content = str_replace('female', '女', $content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//todo:测试
|
||||||
|
$res = $this->sendsms($user_list[$u]['tel'], $content, $sendTime,$user_list[$u]['id']);
|
||||||
|
//$res = array('status'=>false,'message'=>'手机号为空');
|
||||||
|
if ($res['status'] == true) {
|
||||||
|
$return['status'][] = array('code' => 1,'name'=>$user_list[$u]['name'],'tel'=>$user_list[$u]['tel'], 'msg' => '发送成功');
|
||||||
|
$return['total'] = $return['total'] + 1;
|
||||||
|
$return['success'] = $return['success'] + 1;
|
||||||
|
} else {
|
||||||
|
$return['status'][] = array('code' => 0,'name'=>$user_list[$u]['name'],'tel'=>$user_list[$u]['tel'], 'msg' => $res['message']);
|
||||||
|
$return['total'] = $return['total'] + 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$return['total'] = $return['total'] + 1;
|
||||||
|
$return['status'][] = array('code' => 0,'name'=>$user_list[$u]['name'],'tel'=>$user_list[$u]['tel'], 'msg' => '手机号为空');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 根据手机号发送短信
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function sendsms($mobile,$content,$sendTime='',$user_id=0)
|
||||||
|
{
|
||||||
|
if(empty($mobile) || empty($content)){
|
||||||
|
$res['status'] = false;
|
||||||
|
$res['message'] = '手机号或内容为空';
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
$url = $this->config['url'].'sms.aspx';
|
||||||
|
$params = $this->config;
|
||||||
|
unset($params['url']);
|
||||||
|
$params['action'] = 'send';
|
||||||
|
$params['extno'] = '';
|
||||||
|
$params['mobile'] = is_array($mobile)?implode(',', $mobile):$mobile;
|
||||||
|
$params['content'] = $content;
|
||||||
|
$params['sendTime'] = !empty($sendTime)?date('Y-m-d H:i:s',strtotime($sendTime)):'';
|
||||||
|
$xml = $this->http->post($url,$params);
|
||||||
|
//var_dump($url,$params,$xml);
|
||||||
|
$res = (array)simplexml_load_string($xml);
|
||||||
|
$log = array(
|
||||||
|
'user_id'=>$user_id,
|
||||||
|
'mobile'=>$mobile,
|
||||||
|
'content'=>$content,
|
||||||
|
'createtime'=>time(),
|
||||||
|
'res'=>json_encode($res,true),
|
||||||
|
'status'=>0,
|
||||||
|
);
|
||||||
|
if($res['returnstatus'] == 'Faild'){
|
||||||
|
$res['status'] = false;
|
||||||
|
}else{
|
||||||
|
$res['status'] = true;
|
||||||
|
$log['status'] = 1;
|
||||||
|
}
|
||||||
|
//$table = Config::get('database.prefix') . 'car_smslog';
|
||||||
|
Db::name('smslog')->insert($log);
|
||||||
|
//var_dump(Db::getlastsql());
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 上行接口
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getCall()
|
||||||
|
{
|
||||||
|
$url = $this->config['url'].'callApi.aspx';
|
||||||
|
$params = $this->config;
|
||||||
|
unset($params['url']);
|
||||||
|
$params['action'] = 'query';
|
||||||
|
$xml = $this->http->post($url,$params);
|
||||||
|
//var_dump($url,$params,$xml);
|
||||||
|
$res = (array)simplexml_load_string($xml);
|
||||||
|
if(isset($res['errorstatus'])){
|
||||||
|
$res['status'] = false;
|
||||||
|
$res['count'] = 0;
|
||||||
|
return $res;
|
||||||
|
}else{
|
||||||
|
$res['status'] = true;
|
||||||
|
$res['count'] = isset($res['returnsms'])?count($res['returnsms']):0;
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 状态报告
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getStatus()
|
||||||
|
{
|
||||||
|
$url = $this->config['url'].'statusApi.aspx';
|
||||||
|
$params = $this->config;
|
||||||
|
unset($params['url']);
|
||||||
|
$params['action'] = 'query';
|
||||||
|
$xml = $this->http->post($url,$params);
|
||||||
|
//var_dump($url,$params,$xml);
|
||||||
|
$res = (array)simplexml_load_string($xml);
|
||||||
|
if(isset($res['errorstatus'])){
|
||||||
|
$res['status'] = false;
|
||||||
|
return $res;
|
||||||
|
}else{
|
||||||
|
$res['status'] = true;
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 非法关键词查询
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function check($content)
|
||||||
|
{
|
||||||
|
if(empty($content)){
|
||||||
|
return '短信内容为空';
|
||||||
|
}
|
||||||
|
$url = $this->config['url'].'sms.aspx';
|
||||||
|
$params = $this->config;
|
||||||
|
unset($params['url']);
|
||||||
|
$params['action'] = 'checkkeyword';
|
||||||
|
$params['content'] = $content;
|
||||||
|
$xml = $this->http->post($url,$params);
|
||||||
|
//var_dump($url,$params,$xml);
|
||||||
|
$res = (array)simplexml_load_string($xml);
|
||||||
|
if($res['returnstatus'] == 'Faild'){
|
||||||
|
return $res['message'];
|
||||||
|
}else{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 余额及已发送量查询
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function getOverage($params=[])
|
||||||
|
{
|
||||||
|
$url = $this->config['url'].'sms.aspx';
|
||||||
|
$params = array_merge($this->config, $params);
|
||||||
|
unset($params['url']);
|
||||||
|
$params['action'] = 'overage';
|
||||||
|
$xml = $this->http->post($url,$params);
|
||||||
|
$res = (array)simplexml_load_string($xml);
|
||||||
|
if($res['returnstatus'] == 'Faild'){
|
||||||
|
$res['status'] = false;
|
||||||
|
return $res;
|
||||||
|
}else{
|
||||||
|
$res['status'] = true;
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user