You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

471 lines
12 KiB
PHP

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace Common\Controller;
use Think\Controller;
use Org\XiguSDK\Xigu;
use Think\Exception;
use Common\Model\SmsLogModel;
/**
* 短信类
* @author 鹿文学
*/
class SmsController extends Controller {
private $prefix = ''; /*session前缀*/
private static $count_down = 1; /*倒计时时间(分钟)*/
private static $minute_cn = ['零','一','两','三','四','五','六','七','八','九','十'];
/**
* 构造函数
* @param array $config 配置
* 配置 string prefix session_name 前缀
* 配置 boolean use_module 是否强制使用模型名作前缀true强制使用false不使用
* 配置 integer count_down 倒计时时间(分钟)
* @author 鹿文学
*/
public function __construct($config=null) {
if(!empty($config)) {
if($config['use_module']) {
$this->prefix = strtolower(MODULE_NAME) . '_';
} else {
$this->prefix = $config['prefix']?(strtolower($config['prefix']) . '_'):'';
}
self::$count_down = $config['count_down'];
}
}
/**
* 初始化系统配置
* @author 鹿文学
*/
protected function _initialize(){
$config = api('Config/lists');
C($config);
}
/**
* @函数或方法说明
* @发送拉黑信息
* @param string $phone
* @param string $user_account
*
* @author: 郭家屯
* @since: 2019/5/6 9:08
*/
public function send_sms_block($phone='',$user_account=''){
if (empty($phone)) {
return false;
}
$sms_model = M('Short_message');
$data = array(
'pid'=>0,
'phone'=>$phone,
'create_time'=>time(),
);
$sms_id = $sms_model->add($data);
if(get_tool_status('sms_set')) {
$xigu = new Xigu(C('sms_set.smtp'));
$result = json_decode($xigu->sendSMMessage(C('sms_set.smtp_account'),$phone,C('sms_set.smtp_port'),$user_account),true);
if ($result['send_status'] == '000000') {
/* 存储到数据库 */
$result['send_status'] = '000000';
$result['phone'] = $phone;
$result['create_time'] = time();
$result['pid']=0;
$result['create_ip']=get_client_ip();
if($sms_id>0) {
$map['id'] = $sms_id;
$sms_model->where($map)->save($result);
} else {
$sms_model->add($result);
}
}
return true;
}
}
/**
* 发送短信验证码
* @param string $phone 手机号
* @param integer $delay 数据有效时间段默认10分钟
* @param boolean $flag 是否ajax返回默认true ajax返回
* @param integer $pid 渠道编号默认0 官方渠道
* @return mixed
* @author 鹿文学
*/
public function send_sms_code($phone='',$delay=10,$flag=true,$pid=0) {
if (empty($phone)) {
$sms_return = ['code'=>1001,'msg'=>'数据不能为空'];
} else {
$session_name = $this->prefix . $phone;
$sms_model = M('Short_message');
/*检查数据库中的此号码最新一条记录是否存在,存在是否间隔超过几分钟*/
$data_code = $sms_model->field('max(create_time) as time')->where(['pid'=>$pid,'phone'=>$phone])->order('create_time desc')->find();
if(!empty($data_code) && ((time() - $data_code['time'])/60 < self::$count_down) ) {
$sms_return = ['code'=>1139,'msg'=>'请'.self::$minute_cn[self::$count_down].'分钟后再次尝试'];
} else {
$sms_code = session($session_name);
/*检查session中是否存在有效分钟内的短信验证码信息有则直接使用无需生成新的验证码*/
if($sms_code && (time()-$sms_code['time'])/60<$sms_code['delay']) {
$rand = $sms_code['code'];
$new_rand = false;
} else {
session($session_name,null);
$rand = rand(100000,999999);
$new_rand = true;
}
$param = $rand.",".$delay;
$data = array(
'pid'=>$pid,
'phone'=>$phone,
'create_time'=>time(),
);
$sms_id = $sms_model->add($data);
if(get_tool_status('sms_set')) {
$this->check_sms($phone,C('sms_set.limit'),true,$pid);
$xigu = new Xigu(C('sms_set.smtp'));
$result = json_decode($xigu->sendSM(C('sms_set.smtp_account'),$phone,C('sms_set.smtp_port'),$param),true);
if ($result['send_status'] != '000000') {
file_put_contents(dirname(__FILE__).'/'.date('Ymd').'sms.log', date('Y-m-d H:i:s') . ' ---- ' . json_encode($result) . PHP_EOL, FILE_APPEND);
$sms_return = ['code'=>1010,'msg'=>'发送失败,请重新获取'];
}
} elseif(get_tool_status("alidayu")) {
$this->check_sms($phone,C('alidayu.limit'),true,$pid);
$xigu = new Xigu('alidayu');
$result = $xigu->alidayu_send($phone,$rand,$delay);
$result['send_time'] = time();
if($result == false) {
$sms_return = ['code'=>1010,'msg'=>'发送失败,请重新获取'];
}
} elseif(get_tool_status('jiguang')) {
$this->check_sms($phone,C('jiguang.limit'),true,$pid);
$xigu = new Xigu('jiguang');
$result = $xigu->jiguang($phone,$rand,$delay);
$result['send_time'] = time();
if($result == false) {
$sms_return = ['code'=>1010,'msg'=>'发送失败,请重新获取'];
}
} elseif(get_tool_status('alidayunew')) {
$this->check_sms($phone,C('alidayunew.limit'),true,$pid);
$xigu = new Xigu('alidayunew');
$result = $xigu->alidayunew_send($phone,$rand,$delay);
$result['send_time'] = time();
if($result == false) {
$sms_return = ['code'=>1010,'msg'=>'发送失败,请重新获取'];
}
} elseif(get_tool_status('zhongwang')) {
$this->check_sms($phone,C('zhongwang.limit'),true,$pid);
$re = (new SmsLogModel())->sendCode($phone, $rand);
$result['create_time'] = time();
if($re['error'] != 0) {
$sms_return = ['code'=>1010,'msg'=>$re['message']];
}
} else {
$sms_return = ['code'=>1008,'msg'=>'没有配置短信发送'];
}
if(empty($sms_return)) {
/* 存储到数据库 */
$result['send_status'] = '000000';
$result['phone'] = $phone;
$result['create_time'] = time();
$result['pid']=$pid;
$result['create_ip']=get_client_ip();
if($sms_id>0) {
$map['id'] = $sms_id;
$sms_model->where($map)->save($result);
} else {
$sms_model->add($result);
}
/* 记录短信发送记录用于验证 */
$safe_code['code']=$rand;
$safe_code['phone']=$phone;
$safe_code['time']=$new_rand?time():$sms_code['time'];
$safe_code['delay']=$delay;
$safe_code['create']=$result['create_time'];
session($session_name,$safe_code);
$sms_return = ['code'=>200,'msg'=>'验证码已发送,请查收','data'=>$safe_code];
}
}
}
if ($flag) {
echo json_encode($sms_return);exit;
} else {
return $sms_return;
}
}
/**
* 发送短信验证码
* @param string $phone 手机号
* @param integer $delay 数据有效时间段默认10分钟
* @param boolean $flag 是否ajax返回默认true ajax返回
* @param integer $pid 渠道编号默认0 官方渠道
* @return mixed
* @author 鹿文学
*/
public function send_sms_code2($phone='',$delay=10,$flag=true,$pid=0) {
if (empty($phone)) {
$sms_return = ['code'=>1001,'msg'=>'数据不能为空'];
} else {
$session_name = $this->prefix . $phone;
$new_rand = true;
$sms_model = new SmsLogModel();
/*检查数据库中的此号码最新一条记录是否存在,存在是否间隔超过几分钟*/
$data_code = M('sms_log','tab_')->where(['phone' => $data['phone']])->order('id DESC')->getField('create_time');
if(!empty($data_code) && ((time() - $data_code['time'])/60 < self::$count_down) ) {
$sms_return = ['code'=>1139,'msg'=>'请'.self::$minute_cn[self::$count_down].'分钟后再次尝试'];
} else {
$sms_code = session($session_name);
/*检查session中是否存在有效分钟内的短信验证码信息有则直接使用无需生成新的验证码*/
if($sms_code && (time()-$sms_code['time'])/60<$sms_code['delay']) {
$rand = $sms_code['code'];
$new_rand = false;
} else {
$sms_return = $sms_model->sendCode($phone);
if($sms_return['error'] == 0){
/* 记录短信发送记录用于验证 */
$safe_code['code']=$sms_return['code'];
$safe_code['phone']=$phone;
$safe_code['time']=$new_rand?time():$sms_code['time'];
$safe_code['delay']=$delay;
$safe_code['create']=$result['create_time'];
session($session_name,$safe_code);
$sms_return = ['code'=>200,'msg'=>'验证码已发送,请查收','data'=>$safe_code];
} else {
$sms_return = ['code'=>1010,'msg'=>'发送失败,请重新获取'];
}
}
}
}
if ($flag) {
echo json_encode($sms_return);exit;
} else {
return $sms_return;
}
}
/**
* 验证短信验证码
* @param string $phone 手机号
* @param string $vcode 要验证的验证码
* @param boolean $flag 是否ajax返回默认true ajax返回
* @param boolean $destroy 是否销毁session默认true 销毁
* @return mixed
* @author 鹿文学
*/
public function verify_sms_code($phone,$vcode,$flag=true,$destroy=true) {
$session_name = $this->prefix . $phone;
$safe_code = session($session_name);
if(empty($safe_code)) {
$sms_return = ['code'=>1020,'msg'=>'请先获取验证码'];
} else {
$time = (time() - $safe_code['time'])/60;
if ($time<=$safe_code['delay']) {
if (($safe_code['code'] == $vcode) && ($safe_code['phone'] == $phone)) {
unset($safe_code);
if($destroy) {
session($session_name,null);
$sms_return = ['code'=>200,'msg'=>''];
} else {
$sms_return = ['code'=>200,'msg'=>'','session_name'=>$session_name];
}
} else {
$sms_return = ['code'=>1022,'msg'=>'验证码输入有误'];
}
} else {
if($destroy) {
session($session_name,null);unset($safe_code);
$sms_return = ['code'=>1021,'msg'=>'时间超时,请重新获取'];
} else {
$sms_return = ['code'=>1021,'msg'=>'时间超时,请重新获取','session_name'=>$session_name];
}
}
}
if ($flag) {
echo json_encode($sms_return);exit;
} else {
return $sms_return;
}
}
/**
* 检查短信验证码
* @param string $phone 手机号
* @param integer $limit 条数限制
* @param boolean $ischecktime 是否验证时间默认true 验证
* @param integer $pid 渠道编号默认0 官方渠道
* @param boolean $flag 是否ajax返回默认true ajax返回
* @return mixed
* @author 鹿文学
*/
public function check_sms($phone,$limit,$ischecktime=true,$pid=0,$flag=true) {
$sms_model = M('Short_message');
$number = $sms_model->where(array('pid'=>$pid,'create_ip'=>get_client_ip(),'send_status'=>'000000','send_time'=>array(array('egt',strtotime('today')),array('elt',strtotime('tomorrow')))))->count();
if (!empty($limit) && $number>=$limit) {
$sms_return = ['code'=>1138,'msg'=>'每天发送数量不能超过'.$limit.'条'];
} else {
if($ischecktime) {
$request_time = time();
$map = array('phone'=>$phone);
$map['create_time']=array(array('egt',($request_time-self::$count_down*60)),array('elt',$request_time));
$number = $time = $sms_model->where($map)->count();
if ($number>1){
$sms_return = ['code'=>1139,'msg'=>'请'.self::$minute_cn[self::$count_down].'分钟后再次尝试'];
}
}
}
if(!empty($sms_return)) {
if($flag) {
echo json_encode($sms_return);exit;
} else {
return $sms_return;
}
}
}
}