papalapa / laravel-smsc
通过 SMSC.ru 网关发送短信验证码
dev-main
2021-04-30 05:04 UTC
This package is auto-updated.
Last update: 2024-09-29 05:43:10 UTC
README
此包可用于通过 SMSC.ru 发送短信和短信验证码
安装
composer require papalapa/laravel-smsc
php artisan vendor:publish --provider="Papalapa\Laravel\Smsc\SmscServiceProvider"
php artisan migrate
以下设置可以在 ./config/smsc.php 中更改
return [ // API URL 'api_url' => 'https://smsc.ru/sys/send.php', // API Login and Password 'api_login' => env('SMSC_LOGIN'), 'api_password' => env('SMSC_PASSWORD'), // Sender name 'sender_name' => env('SMSC_SENDER_NAME'), // Uses fake send // SMS will be stored in application log 'fake_send' => env('SMSC_FAKE_SEND', true), // Code size // Max size is 6 'code_size' => env('SMSC_CODE_SIZE', 6), // Lifetime of code and token in seconds 'code_lifetime' => env('SMSC_CODE_LIFETIME', 120), 'token_lifetime' => env('SMSC_TOKEN_LIFETIME', 600), // Connection for queueing jobs to be send // NULL - uses default app queue connection 'queue_connection' => env('SMSC_QUEUE_CONNECTION'), // Throttle requests to using SMS-API // Max tries per minute 'throttling_limit' => env('SMSC_THROTTLING_LIMIT', 2), ];
如何用于短信验证码检查
use Illuminate\Http\Request; use Illuminate\Validation\ValidationException; use Papalapa\Laravel\Smsc\PhoneNumber; use Papalapa\Laravel\Smsc\Services\MessageHandler; class SmsController { public function sendCode( Request $request, MessageHandler $messageHandler, ): array { $tel = PhoneNumber::fromString($request->input('tel')); $sms = $messageHandler->sendCode($tel); return ['sent_to' => $sms->phoneNumber()->numeric()]; } public function checkCode( Request $request, MessageHandler $messageHandler, ): array { $tel = PhoneNumber::fromString($request->input('tel')); $code = $request->input('code'); if ($messageHandler->validateCode($tel, $code)){ $token = $messageHandler->generateToken($tel); return compact('token'); } throw ValidationException::withMessages([ 'code' => 'Code is invalid', ]); } }
您可以使用中间件来验证标记化请求
use Illuminate\Support\Facades\Route; use Papalapa\Laravel\Smsc\Middlewares\TokenizedPhoneNumber; return [ Route::middleware(TokenizedPhoneNumber::class) ->post('proceed', [AccountController::class, 'proceedWithToken']); ];
然后在控制器操作中使用解密后的标记化手机号码
use Illuminate\Http\Request; use Papalapa\Laravel\Smsc\Middlewares\TokenizedPhoneNumber; class AccountController { public function proceedWithTokenUsingMiddleware(Request $request): array { $tel = TokenizedPhoneNumber::getPhoneNumber($request); return ['phone_number' => $tel->numeric()]; } }
或在控制器操作中直接验证标记
use Illuminate\Http\Request; use Illuminate\Validation\ValidationException; use Papalapa\Laravel\Smsc\Exceptions\DecryptTokenException; use Papalapa\Laravel\Smsc\Exceptions\ExpiredTokenException; use Papalapa\Laravel\Smsc\Exceptions\InvalidTokenException; use Papalapa\Laravel\Smsc\Services\TokenGenerator; class AccountController { public function proceedWithTokenAndWithoutMiddleware( Request $request, TokenGenerator $tokenGenerator, ): array { try { $tel = $tokenGenerator->validate($request->input('token')); } catch (InvalidTokenException|ExpiredTokenException|DecryptTokenException $e) { throw ValidationException::withMessages([ 'token' => $e->getMessage() ]); } return ['phone_number' => $tel->numeric()]; } }