sqdev / sms-gateway
Provider-agnostic SMS gateway abstractions with a unified API for multiple SMS providers.
Requires
- php: ^8.1
- php-http/discovery: ^1.19
- psr/http-client: ^1.0
- psr/http-factory: ^1.0
- psr/http-message: ^1.0 || ^2.0
Requires (Dev)
- nyholm/psr7: ^1.8
- orchestra/testbench: ^8.0 || ^9.0 || ^10.0
- phpunit/phpunit: ^10.5
- symfony/http-client: ^6.4 || ^7.0
Suggests
- guzzlehttp/guzzle: Popular PSR-18 HTTP client; installed once, auto-detected by discovery
- illuminate/support: Required for the optional Laravel integration (service provider, facade, manager). Laravel 10, 11, and 12 are supported.
- php-http/curl-client: Minimal PSR-18 client based on cURL when you don't want a full-featured client
- symfony/http-client: Lightweight PSR-18 HTTP client with auto-detection support
README
Китобхонаи sqdev/sms-gateway барои PHP интерфейси ягонаи фиристодани SMS медиҳад. Шумо метавонед як API-и устуворро барои чанд провайдер истифода баред, натиҷаҳои фиристоданро дар шакли ягона гиред ва дар Laravel ҳамон шартномаҳоро тавассути facade ва manager истифода баред.
Чӣ медиҳад
Senderбарои фиристодани SMS бо API-и содда.SendResultваStatusResultбарои натиҷаҳои ягона байни провайдерҳо.MessageStatusбарои ҳолатҳои умумӣ, мислиQueued,Sent,Delivered.- интегратсияи тайёри Laravel бо
SmsGatewayfacade, config ва connection manager. - имкони илова кардани провайдери худатон бе тағйир додани коди истеъмолкунанда.
Насб
composer require sqdev/sms-gateway
Китобхона ба PSR-18 HTTP client такя мекунад. Агар дар лоиҳа аллакай Guzzle, Symfony HTTP Client ё ягон PSR-18 client мавҷуд бошад, php-http/discovery онро худкор пайдо мекунад. Агар надошта бошед, якеашро насб кунед:
composer require guzzlehttp/guzzle
# ё
composer require symfony/http-client
Талабот
- PHP
^8.1 - Composer
- як PSR-18 HTTP client
Оғози зуд
Мисоли оддӣ бо яке аз провайдерҳои дарунсохт:
use SmsGateway\Sender; use SmsGateway\Providers\Payom\PayomSmsProvider; $sender = new Sender(new PayomSmsProvider( token: $_ENV['PAYOM_JWT_TOKEN'], defaultSenderName: 'payom.tj', )); $result = $sender->send('+992937123456', 'Рамзи тасдиқи шумо: 1234');
Натиҷа ҳамеша SendResult аст:
$result->messageId; // ID аз тарафи провайдер $result->status; // MessageStatus $result->providerName; // масалан "payom" $result->raw; // ҷавоби аслии провайдер барои debug/log
API-и асосӣ
Sender қабати тунук болои SendsSmsInterface аст. Барои аксари ҳолатҳо ҳамин се метод кофӣ мебошад:
$sender->send( to: '+992937123456', text: 'Салом', from: 'ACME', metadata: ['client_ref' => 'r-1'], ); $sender->sendMessage($smsMessage); $provider = $sender->provider();
Агар провайдер status tracking-ро дастгирӣ кунад, метавонед онро бо TracksSmsStatusInterface санҷед:
use SmsGateway\Contracts\TracksSmsStatusInterface; $provider = $sender->provider(); if ($provider instanceof TracksSmsStatusInterface) { $status = $provider->getStatus($result->messageId); if ($status->status->isFinal()) { // polling-ро қатъ кунед } }
Модели ягонаи натиҷа ва хатогиҳо
Ҳамаи провайдерҳо ба ҳамон DTO ва enum табдил дода мешаванд:
SendResultбарои натиҷаи фиристоданStatusResultбарои санҷиши ҳолатMessageStatusбарои ҳолатҳои умумӣSmsGatewayExceptionбарои base contract-и ҳамаи exception-ҳо
Муҳимтарин exception-ҳо:
InvalidMessageExceptionбарои input ё metadata-и нодурустProviderExceptionбарои хатои remote API, auth, transport ва монанди инMessageNotFoundExceptionбарои status lookup боmessageIdнодуруст
Laravel
Китобхона барои Laravel 10, 11 ва 12 интегратсияи тайёр дорад. Service provider ва facade худкор аз composer.json сабт мешаванд.
Publish кардани config
php artisan vendor:publish --tag=sms-gateway-config
Баъд config/sms-gateway.php пайдо мешавад. Шакли умумии config чунин аст:
return [ 'default' => env('SMS_GATEWAY_CONNECTION', 'aliftech'), 'connections' => [ 'payom' => [ 'driver' => 'payom', 'token' => env('PAYOM_JWT_TOKEN'), 'default_sender_name' => env('PAYOM_DEFAULT_SENDER'), ], ], ];
Дар ин ҷо:
defaultconnection-и асосӣ мебошадconnectionsрӯйхати ҳамаи connection-ҳои номдор астdriverадаптери истифодашавандаро интихоб мекунад
Барои ҳамаи калидҳои дастгиришаванда ва мисолҳои пурра ба config/sms-gateway.php нигаред.
Истифодаи facade
use SmsGateway\Laravel\Facades\SmsGateway; SmsGateway::send('+992937123456', 'Рамзи шумо: 1234'); SmsGateway::provider('payom')->send('+992937123456', 'Салом'); SmsGateway::send( to: '+992937123456', text: 'Салом', from: 'ACME', metadata: ['client_ref' => 'r-1'], );
Constructor injection
Sender ба container низ bind мешавад, бинобар ин метавонед онро мустақим inject кунед:
use SmsGateway\Sender; final class SendOtpCommand { public function __construct( private readonly Sender $sms, ) {} public function handle(string $phone, string $code): void { $this->sms->send($phone, "Рамзи шумо: {$code}"); } }
Custom driver
Агар провайдери худ дошта бошед, онро бо extend() сабт карда метавонед:
use SmsGateway\Contracts\SendsSmsInterface; use SmsGateway\Laravel\Facades\SmsGateway; SmsGateway::extend('custom', function ($app, array $config, string $name): SendsSmsInterface { return new CustomSmsProvider(...); });
Провайдерҳои дарунсохт
| Driver | Қобилият | Хулоса | Ҳуҷҷат |
|---|---|---|---|
payom |
send | status lookup надорад | docs/tj/providers/payom.md |
osonsms |
send + status | messageId шакли composite дорад ва бояд opaque ҳисобида шавад |
docs/tj/providers/osonsms.md |
aliftech |
send + status | metadata барои sms_type, priority, scheduled_at ва ғайра дорад |
docs/tj/providers/aliftech.md |
Навиштани провайдери худ
Китобхона contract-first сохта шудааст. Агар провайдери нав илова кардан хоҳед:
SendsSmsInterface-ро амалӣ кунед, агар танҳо фиристодан дошта бошадTracksSmsStatusInterface-ро амалӣ кунед, агар танҳо tracking дошта бошадSmsProviderInterface-ро амалӣ кунед, агар ҳарду қобилиятро диҳад
Қоидаи асосӣ ин аст, ки exception-и провайдерро берун набароред; онро ба ProviderException ё MessageNotFoundException табдил диҳед ва ҳама status-ҳоро ба MessageStatus map намоед.
Рушд
composer install
composer test
Иҷозатнома
MIT