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

1.0.0 2026-01-05 18:15 UTC

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

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ (запуск тСстов, статичСский Π°Π½Π°Π»ΠΈΠ·) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

  1. Установка зависимостСй:

    composer install
    composer install -d tools/phpstan
    composer install -d tools/php-cs-fixer
  2. Запуск тСстов:

    composer test
  3. БтатичСский Π°Π½Π°Π»ΠΈΠ· (PHPStan):

    composer phpstan
  4. Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ стиля ΠΊΠΎΠ΄Π°:

    composer fix