love_php/app/Http/Controllers/SmsController.php
2026-04-02 09:20:51 +08:00

530 lines
14 KiB
PHP

<?php namespace App\Http\Controllers;
use App\Services\AptchaVerifier;
use App\Utils\IP;
use App\Jobs\CheckMobile;
use Illuminate\Http\Request;
use App\Models\Message;
use App\Utils\Str;
use App\Utils\Messenger;
use App\Http\Requests;
use App\Models\Paas;
use App\Repositories\Eloquent\SmsRepository as Sms;
use App\Contracts\SmsContract;
use Illuminate\Support\Facades\Redis;
class SmsController extends Controller
{
/**
* @var Sms
*/
protected $sms;
protected $smsCon;
/**
* SmsController constructor.
* @param Sms $sms
*/
public function __construct(Sms $sms, SmsContract $smsCon)
{
$this->sms = $sms;
$this->smsCon = $smsCon;
}
//发送注册验证码
public function sendResetCode(Request $request){
$mobile = $request->input('mobile');
if(strlen($mobile) == 11){
// $result = $this->checkMobile($mobile);
// if(!$result){
// return $this->failure('手机号无效!');
// }
}
$ip = IP::getip();
//限制请求次数
$key = $mobile.'sendResetCode';
$is_request = Redis::get($key);
if($is_request){
return $this->failure('请求频率过快');
}
Redis::setex($key, 60, 1);
if(false){
//todo 是否为友福用户
return $this->failure('手机号不未注册友福!');
}
$result = $this->sendCode($mobile, 'reset');
return $result;
}
/** 发送重置验证码 */
public function sendRegisterCode(Request $request){
$mobile = $request->input('mobile');
if(false){
//todo 是否已注册友福用户
return $this->failure('手机号不未注册友福!');
}
$result = $this->sendCode($mobile, 'register');
return $result;
}
/**
* 登录验证码
*/
public function sendLoginCode(Request $request){
$mobile = $request->input('mobile');
if(false){
//todo 是否已注册友福用户
return $this->failure('手机号未注册友福!');
}
if(strlen($mobile) != 11){
return $this->failure('手机号码格式错误');
}
// $result = $this->sendCode($mobile, 'login');
if (env('APP_ENV') == 'production') {
$result = $this->smsCon->sendCode($mobile, 'login');
if (empty($result)) return $this->failure('验证码发送失败,请稍后再试');
if ($result && is_array($result) && $result['code']) return $this->failure($result['msg']);
}else{
$result = $this->sendCode($mobile, 'login');
}
return $this->success('ok');
}
public function sendOfficialRegisterCode(Request $request){
$mobile = $request->input('mobile');
if(strlen($mobile) == 11){
// $result = $this->checkMobile($mobile);
// if(!$result){
// return $this->failure('手机号无效!');
// }
}
$ip = IP::getip();
//限制请求次数
$key = $mobile.'sendOfficialRegisterCode';
$is_request = Redis::get($key);
if($is_request){
return $this->failure('请求频率过快');
}
Redis::setex($key, 60, 1);
if(false){
//todo 是否已注册友福用户
return $this->failure('手机号不未注册友福!');
}
$result = $this->sendCode($mobile, 'register', ['paas'=>$request->input('paas')]);
return $result;
}
//发送通用验证码
public function sendGeneralCode(Request $request){
$mobile = $request->input('mobile');
if(empty($mobile)){
if(!\Auth::user()){
return $this->failure('未登录');
}
$mobile = auth()->user()->mobile;
}
$result = $this->sendCode($mobile, 'general');
return $result;
}
/**
* do send code
* @param [type] $mobile mobile number
* @param [type] $key [description]
* @param array $params [description]
* @return [type] [description]
*/
private function sendCode($mobile, $key, $params=[]){
if(!Str::isMobile($mobile)){
return $this->failure('手机号无效');
}
$now_time = date('Y-m-d H:i:s');
$start_time = date('Y-m-d 00:00:00');
$end_time = date('Y-m-d 23:59:59');
//一分钟内不能多次发送
$created_at = Message::where('phone', $mobile)->orderBy('id', 'desc')->value('created_at');
if ($created_at) {
$created_at = $created_at->toDateTimeString();
$result = time() - strtotime($created_at);
if ($result < 60) {
return $this->failure('操作频繁,请稍后再试');
}
}
//该手机号是否到达限制
$count = Message::where('phone', $mobile)->whereBetween('created_at', [$start_time, $end_time])->count();
if ($count > 50) {
return $this->failure('短信发送失败, 短信服务次数限制');
}
$this->sms->create([
'phone' => $mobile,
'message' => [$key, $params],
'ip' => request()->ip(),
'confirmed' => 0
]);
return $this->success('短信已发送');
}
/**
* 所有短信的发送记录
*/
public function messages()
{
$list = $this->sms->list();
return $this->success('message lists', $list);
}
//发送普通消息
function sentMessage($mobile, $message){
$this->model->create([
'phone'=>$mobile,
'message'=>$message,
'confirmed' => 1,
'ip' => request()?request()->ip():'127.0.0.1',
]);
Messenger::sendSMS($mobile, $message);
return true;
}
/*
* 检查是否合法
* 1. 正常返回false
* 2. 失败返回原因
*
* todo:
* 1. 只有最近, 旧的失效
*/
function check($mobile, $code){
if(!$code){
return '请填写验证码';
}
//测试用万能验证码
// if(/*(config('app.testing') && $code=='999999999')*/ $code=='999999999' || $mobile=='13800138000'){
// Message::where('phone', $mobile)->update(['confirmed'=>1]);
// return false;
// }
$record = Message::where(['phone'=>$mobile, 'code'=>$code])/*->orderBy('id', 'desc')*/->first();
if(empty($record)){
return '验证码有误';
}
if($record->created_at->timestamp < (time()-10*60)){
return '验证码过期';
}
if($record->confirmed){
return '验证码已使用';
}
Message::where('id', $record->id)->update(['confirmed'=>1]);
return false;
}
public function getIdiom(){
$idiom_config = [
"久负盛名",
"鱼米之乡",
"星罗棋布",
"前车之鉴",
"莫名其妙",
"沆瀣一气",
"家喻户晓",
"权宜之计",
"百发百中",
"风驰电掣",
"刚正不阿",
"五彩缤纷",
"登峰造极",
"刀山火海",
"锦绣前程",
"安然无恙",
"明知故问",
"重见天日",
"大智若愚",
"水乳交融",
"心猿意马",
"名落孙山",
"鸡飞狗跳",
"春暖花开",
"目不转睛",
"衣锦还乡",
"守株待兔",
"风雨同舟",
"七嘴八舌",
"鹰击长空",
"胸有成竹",
"山清水秀",
"千方百计",
"锦上添花",
"耳濡目染",
"如火如荼",
"日新月异",
"纸上谈兵",
"珠光宝气",
"大海捞针",
"珠联璧合",
"谈笑风生",
"花花公子",
"雪上加霜",
"纸醉金迷",
"杯弓蛇影",
"赤子之心",
"鹤立鸡群",
"雷霆万钧",
"画蛇添足",
"弄巧成拙",
"金玉满堂",
"百里挑一",
"翻山越岭",
"江山如画",
"呆若木鸡",
"苦心孤诣",
"张牙舞爪",
"坐井观天",
"井底之蛙",
"苦心积虑",
"涸辙之鲋",
"凤毛麟角",
"涓滴不漏",
"拔苗助长",
"欲盖弥彰",
"闭门造车",
"画龙点睛",
"鹤发童颜",
"虚与委蛇",
"相濡以沫",
"眉飞色舞",
"心有灵犀",
"临渴掘井",
"弱不禁风",
"百折不挠",
"舍生忘死",
"吃里扒外",
"指鹿为马",
"以逸待劳",
"废寝忘食",
"投笔从戎",
"顺水推舟",
"谁为情种",
"有口无心",
"杀鸡取卵",
"背水一战",
"衣食父母",
"一石二鸟",
"入木三分",
"以卵击石",
"一箭双雕",
"五光十色",
"一身是胆",
"一视同仁",
"瓜田李下",
"苦海无边",
"白云苍狗",
"白头偕老",
"骑虎难下",
"拔刀相助",
"东山再起",
"一败涂地",
"遗臭万年",
"鸡犬不宁",
"三长两短",
"一诺千金",
"九牛一毛",
"一曝十寒",
"朝三暮四",
"一鼓作气",
"一败涂地",
"两败俱伤",
"一丝不苟",
"一举两得",
"有口难言",
"一言为定",
"不偏不倚",
"无与伦比",
"千军万马",
"熟能生巧",
"白马王子",
"一无是处",
"一日千里",
"自相矛盾",
"人山人海",
"一波三折",
"一年四季",
"三人成虎",
"二八佳人",
"百折不挠",
"百发百中",
"三十而立",
"一心一意",
"四分五裂",
"三生有幸",
"十全十美",
"一事无成",
"一语中的",
"一泻千里",
"三更半夜",
"四通八达",
"一本正经",
"六亲不认",
"一箭双雕",
"三长两短",
"百战百胜",
"万马奔腾",
"四面楚歌",
"三顾茅庐",
"百折不挠",
"一语成谶",
"百家争鸣",
"五彩缤纷",
"六亲不认",
"十室九空",
"三生有幸",
"百折不挠",
"四面楚歌",
"五光十色",
"百花齐放",
"六道轮回",
"七上八下",
"八仙过海",
"九死一生",
"十拿九稳",
"百折不挠",
"千载难逢",
"万紫千红",
"一鸣惊人",
"九霄云外",
"一笑倾城",
"百里挑一",
"三生有幸",
"千山万水",
"一石二鸟",
"四面楚歌",
"五光十色",
"六亲不认",
"七嘴八舌",
"风和日丽",
"笑逐颜开",
"急功近利",
"悠然自得",
"无所作为",
"坐井观天",
"孤芳自赏",
"开门见山",
"百折不挠",
"独具匠心",
"百发百中",
"百花齐放",
"口若悬河",
"纸上谈兵",
"水到渠成",
"随波逐流",
"春风得意",
"鞭长莫及",
"青出于蓝",
"纸包不住",
"文质彬彬",
"望洋兴叹",
"人云亦云",
"秋高气爽",
"心有灵犀",
"言而无信",
"欣欣向荣",
"望穿秋水",
"水深火热",
"心领神会",
"草木皆兵",
"笨鸟先飞",
"井底之蛙",
"见仁见智",
"粉墨登场",
"开宗明义",
"形影不离",
"言简意赅",
"跳梁小丑",
"形影相吊",
"栩栩如生",
"言过其实",
"如鱼得水",
"涛声依旧",
"珠光宝气",
"锦上添花",
"锦绣前程",
"水滴石穿",
"涸辙之鲋",
"秀外慧中",
"枝繁叶茂",
"心照不宣",
"相辅相成",
"心悦诚服",
"心平气和",
"相见恨晚",
"莺飞草长",
"相得益彰",
"草木皆兵",
"鹤立鸡群",
"守株待兔",
"柳暗花明",
"龙马精神",
"弱不禁风",
"口是心非",
"哑口无言",
"势如破竹",
"抱薪救火",
"守口如瓶",
"百家争鸣",
"刚柔并济",
"纸短情长",
"贵而贱目",
"掩耳盗铃",
"欲速不达",
"勇往直前",
"山穷水尽",
"沧海桑田",
"龙潭虎穴",
"鱼贯而入",
"星罗棋布",
"雷霆万钧",
"花好月圆",
"雪上加霜",
"马到成功",
"金玉满堂",
"鸟语花香",
"一波三折",
"柳暗花明",
"天长地久",
"水落石出",
"山穷水尽",
"强弩之末",
"金蝉脱壳",
"狐假虎威",
"狼狈为奸",
"虎头蛇尾",
"龙飞凤舞",
];
// 从数组中随机取一个成语
$idiom = $idiom_config[array_rand($idiom_config)];
return $this->success('ok',$idiom);
}
}