Я работаю над проектом торгового центра в компании, так как бэкэнд всего один, то моя очередь регистрироваться по смс. В начале у меня все еще было немного пусто внутри, но, к счастью,
Laravel-china
сообществоsummer
Великий Бог, написал книгу. Он ссылается на свое письмо и идеи в нем и используетeasy-sms
Сумка, на то, чтобы сделать ее гладкой, ушло всего полдня, и я поделюсь ею с вами вечером.
-
Определить оператора SMS
Я видел, что все большие ребята используют облачные планшеты, поэтому я настоятельно рекомендую компании без колебаний использовать эту платформу SMS, но доступны и другие.
- Сначала зарегистрируйте учетную запись самостоятельно, затем найдите это
- Нажмите «Начать доступ», чтобы завершить процесс руководства для новичков.
- Подпись и шаблон второй части необходимо заполнить, аналогично тому, что я заполнил ниже
easy-sms
При отправке пакета содержание установленного текстового сообщения должно быть точно таким же, как и это, иначе будет сообщено об ошибке.Также не забудьте получить APIKEY. В то время настройте его в env.
# 云片
YUNPIAN_API_KEY=9c60bdd**********
-
Установить
easy-sms
Сумка
- С помощью этого пакета вы сможете быстро реализовать функцию отправки СМС.
composer require "overtrue/easy-sms"
Поскольку этот компонент еще не доступен в LaravelServiceProvider
, для удобства мы можем инкапсулировать его сами.
- Сначала добавьте в каталог конфигурации
easysms.php
документ
существуетconfig/easysms.phpЗаполните следующее.
<?php
return [
// HTTP 请求的超时时间(秒)
'timeout' => 5.0,
// 默认发送配置
'default' => [
// 网关调用策略,默认:顺序调用
'strategy' => \Overtrue\EasySms\Strategies\OrderStrategy::class,
// 默认可用的发送网关
'gateways' => [
'yunpian',
],
],
// 可用的网关配置
'gateways' => [
'errorlog' => [
'file' => '/tmp/easy-sms.log',
],
'yunpian' => [
'api_key' => env('YUNPIAN_API_KEY'),
],
],
];
- Затем создайте ServiceProvider
php artisan make:provider EasySmsServiceProvider
Изменить файлapp/providers/EasySmsServiceProvider.php
<?php
namespace App\Providers;
use Overtrue\EasySms\EasySms;
use Illuminate\Support\ServiceProvider;
class EasySmsServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->app->singleton(EasySms::class, function ($app) {
return new EasySms(config('easysms'));
});
$this->app->alias(EasySms::class, 'easysms');
}
}
- Наконец в
config/app.php
существуетproviders
Добавьте сервис, который вы только что создали, и запишите его,App\Providers\EasySmsServiceProvider::class,
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
App\Providers\EasySmsServiceProvider::class, //easy-sms
-
Создание маршрутов и соответствующих контроллеров
- Чтобы сначала создать маршрут, нам нужен метод ajax для запроса кода подтверждения SMS и логический метод для подтверждения регистрации, как показано ниже:
Route::group(['prefix' => 'verificationCodes', 'as' => 'verificationCodes.'], function() {
Route::post('register', 'VerificationCodesController@register')->name('register');
Route::get('ajaxregister', 'VerificationCodesController@ajaxregister')->name('ajaxregister');
});
Маршрут создан, используем команду для генерации контроллера
php artisan make:controller Home\VerificationCodesController
пишите прямо в немregister
иajaxregister
метод
- логика кода
Изменить файл
app/Home/VerificationCodesController.php
<?php
.
.
.
use Overtrue\EasySms\EasySms;
use App\Models\System\User;
class VerificationCodesController extends Controller
{
// 这里验证就不写了。
public function ajaxregister(VerificationCodeRequest $request, EasySms $easySms)
{
//获取前端ajax传过来的手机号
$phone = $request->phone;
// 生成4位随机数,左侧补0
$code = str_pad(random_int(1, 9999), 4, 0, STR_PAD_LEFT);
try {
$result = $easySms->send($mobile, [
'content' => "【安拾商城】您的验证码是{$code}。如非本人操作,请忽略本短信"
]);
} catch (Overtrue\EasySms\Exceptions\NoGatewayAvailableException $exception) {
$response = $exception->getExceptions();
return response()->json($response);
}
//生成一个不重复的key 用来搭配缓存cache判断是否过期
$key = 'verificationCode_' . str_random(15);
$expiredAt = now()->addMinutes(10);
// 缓存验证码 10 分钟过期。
\Cache::put($key, ['mobile' => $mobile, 'code'=> $code], $expiredAt);
return response()->json([
'key' => $key,
'expired_at' => $expiredAt->toDateTimeString(),
], 201);
}
Таким образом, пользователь может получить смс, а веб-интерфейс должен сохранить его.key
, при отправке регистрационной формы она передается в фоновый режим, чтобы определить, истек ли срок ее действия. Далее следует судить о том, истек ли срок его действия и неверный ли проверочный код.
public function register(VerificationCodeRequest $request)
{
//获取刚刚缓存的验证码和key
$verifyData = \Cache::get($request->verification_key);
//如果数据不存在,说明验证码已经失效。
if(!$verifyData) {
return response()->json(['status' =>0, 'message'=> '短信验证码已失效'], 422);
}
// 检验前端传过来的验证码是否和缓存中的一致
if (!hash_equals($verifyData['code'], $request->verification_code) {
return redirect()->back()->with('warning', '短信验证码错误');
}
$user = User::create([
'mobile' => $verifyData['mobile'],
'password' => bcrypt($request->password),
]);
// 清除验证码缓存
\Cache::forget($request->verification_key);
return redirect()->route('login')->with('success', '注册成功!');
}
вышеhash_equals
Это сравнение строк, которое предотвращает атаки по времени~
Выше весь мой процесс.