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()];
    }
}