短信记录
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
孟凡懂 2022-07-09 04:30:11 +08:00
parent ebc7f2be88
commit 64cb3601aa
2 changed files with 436 additions and 0 deletions

View 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
View 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;
}
}
}