hy-farm/muchang/common/services/SMSServices.php
2026-05-29 19:54:56 +08:00

102 lines
3.0 KiB
PHP

<?php
/**
* Created by PhpStorm.
* User: zn
* Date: 2017/7/14
* Time: 17:47
*/
namespace common\services;
use common\utils\CommUtil;
use DefaultAcsClient;
use DefaultProfile;
use Dysmsapi\Request\V20170525\SendSmsRequest;
use Exception;
use Yii;
class SMSServices
{
public static function sendSMS($phone, $templateCode)
{
$userIp = Yii::$app->request->userIP;
$ipCount = (int)Yii::$app->redis->get('code.sendIp.' . $userIp);
if ($ipCount > 6) throw new Exception("请等待60秒后再发送验证码");
//获取上次发送验证的时间
$lastSendTime = Yii::$app->redis->get('code.sendTime.' . $phone);
//检查再次发送间隔
if ($lastSendTime && time() < ($lastSendTime + 60))
throw new Exception("请等待60秒后再发送验证码");
$code = CommUtil::getRandomNum(4);
//此处需要替换成自己的AK信息
$accessKeyId = Yii::$app->params['sms_accessId'];
$accessKeySecret = Yii::$app->params['sms_accessKey'];
//短信API产品名
$product = "Dysmsapi";
//短信API产品域名
$domain = "dysmsapi.aliyuncs.com";
//暂时不支持多Region
$region = "cn-shanghai";
//初始化访问的acsCleint
$profile = DefaultProfile::getProfile($region, $accessKeyId, $accessKeySecret);
DefaultProfile::addEndpoint("cn-shanghai", "cn-shanghai", $product, $domain);
$acsClient = new DefaultAcsClient($profile);
$request = new SendSmsRequest();
//必填-短信接收号码
$request->setPhoneNumbers($phone);
//必填-短信签名
$request->setSignName(Yii::$app->params['sms_signName']);
//必填-短信模板Code
$request->setTemplateCode($templateCode);
//选填-假如模板中存在变量需要替换则为必填(JSON格式)
$data['code'] = $code;
$dataJson = json_encode($data);
$request->setTemplateParam($dataJson);
//选填-发送短信流水号
// $request->setOutId("1234");
//发起访问请求
$acsResponse = $acsClient->getAcsResponse($request);
if ($acsResponse->Code != 'OK')
throw new Exception($acsResponse->Message);
$ipCount++;
//缓存数据
Yii::$app->redis->set('code.sendTime.' . $phone, time(), 6000);
Yii::$app->redis->set('code.sendCode.' . $phone, $code, 6000);
Yii::$app->redis->set('code.sendIp.' . $userIp, $ipCount, 3600*24);
return true;
}
/**
*验证验证码
* @param $phone
* @return bool
*/
public static function validateCode($phone, $code)
{
if (!$code) return false;
$cacheCode = Yii::$app->redis->get('code.sendCode.' . $phone);
if (!empty($cacheCode) && $cacheCode == $code) return true;
return false;
}
public static function cleanCode($phone)
{
Yii::$app->redis->del('code.sendTime.' . $phone);
Yii::$app->redis->del('code.sendCode.' . $phone);
}
}