Appearance
短信服务
阿里云
下面介绍阿里云短信服务 的配置。
短信服务
号码白名单
白名单号码不受“验证码”、“短信通知”、“推广短信”类短信发送频率限制。您最多可添加 50 个白名单号码。
短信签名
短信模版即具体发送的短信内容。短信模版可以支持验证码、短信通知、推广短信三种模式。验证码和短信通知,通过变量替换实现个性短信定制。
同样系统已经内置了一些通用短信模板,我们也可以添加新的短信模板。
可以根据业务需要添加短信模板
盗刷监控
下面是对验证码防盗刷与发送频道的设置,这可以有效防止用户恶意发送短信,节省短信费用支出。
安全设置
下面是设置短信的验证码防盗刷、发送总量阈值等的设置,更好的保护短信发送并节省费用支出。
发送频道限制
同一个签名,对同一个手机号的发送频率进行设置
发送测试
短信服务提供了非常方便的接口开发,可以在线测试短信同时也会生成代码片段。
SDK
我们可以使用阿里云提升的 SDK 发送短信,也可以使用第三方社区扩展包如easy-sms 发送短信
阿里 SDK
调试成功后点击生成 API Demo,现在看到了生成的代码片段
下面根据你使用的开发语言选择相应的 SDK
安装扩展包后,复制上面生成的示例代码到网站项目中即可。
composer require alibabacloud/dysmsapi-20170525 2.0.9
社区扩展包
如果网站只使用阿里云,上面的示例代码方式是简单的选择。但如果你网站使用多种短信服务,使用第三方扩展包是不错的选择。
easy-sms 扩展包集成多种短信服务,首先进行安装
composer require overtrue/easy-sms
项目应用
下面是演示在 Laravel 项目中发送短信,使用社区扩展包 easy-sms 进行开发。
服务
下面是定义的短信发送服务
<?php
namespace Services;
use Auth;
use Illuminate\Contracts\Container\BindingResolutionException;
use Overtrue\EasySms\EasySms;
use Log;
use Cache;
class SmsService
{
/**
* 发送
* @param mixed $mobile 手机号
* @param mixed $template 短信模板
* @param mixed $data 模板数据
* @return mixed
*/
public function send($mobile, $template, $data)
{
$sms = new EasySms($this->config());
return $sms->send($mobile, [
//短信模板
'template' => $template,
//模板变量
'data' => $data
]);
}
/**
* 发送验证码
* @param mixed $mobile
* @return mixed
* @throws BindingResolutionException
*/
public function code($mobile)
{
$code = mt_rand(1000, 9999);
Cache::put("mobile-code-{$mobile}", $code, 600);
$data = [
'code' => $code,
'product' => config('hd.sms.product'),
];
return $this->send($mobile, config('hd.sms.aliyun.template'), $data);
}
/**
* 验证码校对
* @param mixed $mobile
* @param mixed $code
* @return bool
*/
public function checkCode($mobile, $code)
{
return Cache::get("mobile-code-{$mobile}") == $code;
}
/**
* 配置项
* @return array
* @throws BindingResolutionException
*/
protected function config()
{
return [
// HTTP 请求的超时时间(秒)
'timeout' => 5.0,
// 默认发送配置
'default' => [
// 网关调用策略,默认:顺序调用
'strategy' => \Overtrue\EasySms\Strategies\OrderStrategy::class,
// 默认可用的发送网关
'gateways' => ['aliyun'],
],
// 可用的网关配置
'gateways' => [
'errorlog' => [
'file' => './easy-sms.log',
],
'aliyun' => [
'access_key_id' => '阿里云用户 AccessKey ID',
'access_key_secret' => '阿里云用户 AccessKey Secret',
'sign_name' => '身份签名',
],
],
];
}
}
在 AppServiceProvider
的register
方法中注册短信发送服务
$this->app->instance('sms', new SmsService);
控制器
下面是发送验证码的控制器示例代码
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Auth;
class SmsController extends Controller
{
public function code(Request $request)
{
app('sms')->code(Auth::user()->mobile);
return $this->success('短信验证码发送成功');
}
}
限流规则
在 RouteServiceProvider
中定义限流规则
RateLimiter::for('sms', function (Request $request) {
//接口每分钟限制调用1次
return Limit::perMinute(1)->response(function () {
return response('短信发送过于频繁,请稍候再试', 429);
});
});
然后在路由中使用限制中间件
Route::post('sms/code', [SmsController::class, 'code'])->middleware(['auth:sanctum', 'throttle:sms']);
常见问题
阿里云发送验证码失败
发送内容存在网址将不允许发送