Skip to content

短信服务

阿里云

下面介绍阿里云短信服务 的配置。

向军大叔每晚八点在 抖音bilibli 直播

xj-small

短信服务

首先访问阿里云控制台中的短信服务模块

image-20200315144014793

号码白名单

白名单号码不受“验证码”、“短信通知”、“推广短信”类短信发送频率限制。您最多可添加 50 个白名单号码。

image-20220321142705872

短信签名

短信签名是在发送短信时内容里附加个性签名,短信签名必须经过审核才能在短信中使用。系统内置了一些通用的签名已经满足了大部分业务场景。

image-20200315144332597

短信模板

短信模版即具体发送的短信内容。短信模版可以支持验证码、短信通知、推广短信三种模式。验证码和短信通知,通过变量替换实现个性短信定制。

同样系统已经内置了一些通用短信模板,我们也可以添加新的短信模板。

image-20200315145739020

可以根据业务需要添加短信模板

image-20200315150049295

盗刷监控

下面是对验证码防盗刷与发送频道的设置,这可以有效防止用户恶意发送短信,节省短信费用支出。

安全设置

下面是设置短信的验证码防盗刷、发送总量阈值等的设置,更好的保护短信发送并节省费用支出。

image-20220321143404508

发送频道限制

同一个签名,对同一个手机号的发送频率进行设置

image-20220321143039601

发送测试

短信服务提供了非常方便的接口开发,可以在线测试短信同时也会生成代码片段。

image-20220321131645131

SDK

我们可以使用阿里云提升的 SDK 发送短信,也可以使用第三方社区扩展包如easy-sms 发送短信

阿里 SDK

调试成功后点击生成 API Demo,现在看到了生成的代码片段

image-20220321131816688

image-20220321132019987

下面根据你使用的开发语言选择相应的 SDK

image-20220321141507708

安装扩展包后,复制上面生成的示例代码到网站项目中即可。

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' => '身份签名',
                ],
            ],
        ];
    }
}

AppServiceProviderregister 方法中注册短信发送服务

$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']);

常见问题

阿里云发送验证码失败

发送内容存在网址将不允许发送