papalapa / laravel-smsc
Send SMS codes through SMSC.ru gateway
dev-main
2021-04-30 05:04 UTC
This package is auto-updated.
Last update: 2025-04-29 01:11:47 UTC
README
This package can be used for sending SMS-messages and SMS-codes through SMSC.ru
Installation
composer require papalapa/laravel-smsc
php artisan vendor:publish --provider="Papalapa\Laravel\Smsc\SmscServiceProvider"
php artisan migrate
Next settings are available for change in ./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), ];
How to use for SMS-code checking:
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', ]); } }
You can use middleware to validate tokenized requests:
use Illuminate\Support\Facades\Route; use Papalapa\Laravel\Smsc\Middlewares\TokenizedPhoneNumber; return [ Route::middleware(TokenizedPhoneNumber::class) ->post('proceed', [AccountController::class, 'proceedWithToken']); ];
Then use decrypted-token-phone-number in controller action:
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()]; } }
or validate the token directly in controller action:
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()]; } }