phenogram / gateway-bindings
Strictly typed PHP bindings for the Telegram Gateway API
Installs: 1
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/phenogram/gateway-bindings
Requires
- php: ^8.4
Requires (Dev)
- fakerphp/faker: ^1.24
- phpunit/phpunit: ^11
- symfony/var-dumper: ^7
- vlucas/phpdotenv: ^5.5
This package is auto-updated.
Last update: 2026-01-05 18:21:00 UTC
README
π¬π§ ENGLISH | π·πΊ Π Π£Π‘Π‘ΠΠΠ
PHP SDK Π΄Π»Ρ Telegram Gateway API
Π‘ΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ PHP ΠΊΠ»Π°ΡΡΡ Π΄Π»Ρ Telegram Gateway API.
ΠΡΠΎΡ ΠΏΠ°ΠΊΠ΅Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ΄ΠΎΠ±Π½ΡΡ ΠΎΠ±ΡΡΡΠΊΡ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΈΡ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ ΡΠ΅ΡΠ΅Π· ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠ»ΡΠ· Telegram.
Π Π°Π±ΠΎΡΠ° Π²ΡΡ Π΅ΡΡ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅. ΠΡΠ»ΠΈ Π²Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΠ΅ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π½Π΅ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΡ Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅ΠΉ, Π½Π΅ ΡΡΠ΅ΡΠ½ΡΠΉΡΠ΅ΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΡΡΡ.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
composer require phenogram/gateway-bindings
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
ΠΡΠΎΡ ΠΏΠ°ΠΊΠ΅Ρ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½ΡΡ
ΡΠ°ΡΡΠ΅ΠΉ: Api, Serializer ΠΈ Factory.
ΠΠ»ΠΈΠ΅Π½Ρ (ClientInterface)
Π§ΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ API, Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ClientInterface. ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π½Π΅ ΠΏΡΠΈΠ²ΡΠ·Π°Π½Π° ΠΊ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌΡ HTTP-ΠΊΠ»ΠΈΠ΅Π½ΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠ±ΠΎΠΉ ΡΠ΄ΠΎΠ±Π½ΡΠΉ Π²Π°ΠΌ ΡΠΏΠΎΡΠΎΠ±.
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ curl Π±Π΅Π· Π²Π½Π΅ΡΠ½ΠΈΡ
Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ.
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΡΠΎΡ ΠΊΠΎΠ΄ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠΈ Π² ΡΠ΅ΡΡΠ°Ρ .
<?php declare(strict_types=1); namespace Phenogram\GatewayBindings\Tests\Readme; use Phenogram\GatewayBindings\ClientInterface; use Phenogram\GatewayBindings\Types; final readonly class ReadmeClient implements ClientInterface { public function __construct( private string $token, private string $apiUrl = 'https://gatewayapi.telegram.org', ) { } public function sendRequest(string $method, array $data): Types\Interfaces\ResponseInterface { $ch = curl_init("{$this->apiUrl}/{$method}"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); $jsonData = json_encode($data, JSON_THROW_ON_ERROR); curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Authorization: Bearer ' . $this->token, 'Content-Type: application/json', 'Content-Length: ' . strlen($jsonData) ]); $response = curl_exec($ch); if (curl_errno($ch)) { throw new \RuntimeException('Request Error: ' . curl_error($ch)); } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); $responseData = json_decode((string)$response, true); if ($httpCode !== 200) { return new Types\Response( ok: false, errorCode: $httpCode, description: $responseData['error'] ?? 'HTTP Error ' . $httpCode ); } if (!isset($responseData['ok']) || !is_bool($responseData['ok'])) { return new Types\Response(ok: false, errorCode: 500, description: 'Invalid response from API'); } $description = $responseData['description'] ?? $responseData['error'] ?? null; return new Types\Response( ok: $responseData['ok'], result: $responseData['result'] ?? null, errorCode: $responseData['error_code'] ?? $httpCode, description: $description, parameters: null ); } }
API
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ API:
use Phenogram\GatewayBindings\Api; use Phenogram\GatewayBindings\Serializer; $api = new Api( client: new ReadmeClient('YOUR_GATEWAY_TOKEN'), serializer: new Serializer() ); // 1. ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ (Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΠΎ) try { $status = $api->checkSendAbility(phoneNumber: '+1234567890'); echo "Request ID: " . $status->requestId . "\n"; echo "Π‘ΡΠΎΠΈΠΌΠΎΡΡΡ: " . $status->requestCost . "\n"; // 2. ΠΡΠΏΡΠ°Π²ΠΊΠ° ΠΊΠΎΠ΄Π° (Π΅ΡΠ»ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΡΠΎΡΠ»Π° ΡΡΠΏΠ΅ΡΠ½ΠΎ) $result = $api->sendVerificationMessage( phoneNumber: '+1234567890', requestId: $status->requestId, codeLength: 6, ttl: 60 ); echo "Π‘ΡΠ°ΡΡΡ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ: " . $result->deliveryStatus?->status; } catch (\Phenogram\GatewayBindings\ResponseException $e) { echo "ΠΡΠΈΠ±ΠΊΠ° API: " . $e->getMessage(); }
Π‘Π΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡ
Π‘Π΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡΠ²Π΅ΡΠΎΠ² API Π² ΡΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ. ΠΠ±ΡΡΠ½ΠΎ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π²Π½ΡΡΡΠΈ ΠΊΠ»Π°ΡΡΠ° Api, Π½ΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ.
use Phenogram\GatewayBindings\Serializer; use Phenogram\GatewayBindings\Types\Interfaces\RequestStatusInterface; $jsonResponse = '{ "request_id": "req_123", "phone_number": "+1234567890", "request_cost": 0.05 }'; $data = json_decode($jsonResponse, true); $serializer = new Serializer(); $status = $serializer->deserialize( data: $data, type: RequestStatusInterface::class ); assert($status instanceof RequestStatusInterface); echo $status->phoneNumber; // +1234567890
Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ°
ΠΠ»Ρ ΡΠ°Π±ΠΎΡΡ Π½Π°Π΄ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠΌ (Π·Π°ΠΏΡΡΠΊ ΡΠ΅ΡΡΠΎΠ², ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·) ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
-
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ:
composer install composer install -d tools/phpstan composer install -d tools/php-cs-fixer
-
ΠΠ°ΠΏΡΡΠΊ ΡΠ΅ΡΡΠΎΠ²:
composer test -
Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· (PHPStan):
composer phpstan
-
ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΠΈΠ»Ρ ΠΊΠΎΠ΄Π°:
composer fix