Интеграция PHP-приложений с телеком-сервисами МТС

Раздел: Интеграция API -> Интеграция телеком-сервисов

Основные подходы к интеграции МТС API на PHP

Как организовать взаимодействие с МТС API из PHP-приложения?

Базовое решение: прямой вызов REST API через cURL

Большинство сервисов МТС предоставляют REST-интерфейсы, доступные по протоколу HTTPS. Наиболее универсальный способ отправки запросов в PHP - использование библиотеки cURL. Ниже приведен пример отправки SMS-сообщения.

// Пример отправки SMS через МТС API
$apiKey = 'ваш_ключ';
$phone = '79123456789';
$message = 'Тестовое сообщение';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.mts.ru/sms/send');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'phone' => $phone,
    'text' => $message,
    'apiKey' => $apiKey
]));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
$response = curl_exec($ch);
if(curl_errno($ch)) {
    echo 'cURL ошибка: ' . curl_error($ch);
} else {
    $decoded = json_decode($response, true);
    print_r($decoded);
}
curl_close($ch);

Mts php api (мтс api на php)

Этот код отправляет POST-запрос с данными в формате JSON. В ответе ожидается JSON с результатом.

Типичные проблемы:

  • Ошибка авторизации: неверный apiKey или истекший токен. Решение - проверить ключ в личном кабинете МТС.
  • SSL-сертификат: если на локальном сервере нет корневых сертификатов, cURL может вернуть ошибку SSL. Решение - отключить проверку (CURLOPT_SSL_VERIFYPEER = false) только для тестирования, в продакшене использовать корректные сертификаты.
  • Кодировка: сообщение может отображаться кракозябрами, если не указана UTF-8. Решение - убедиться, что PHP-скрипт сохранен в UTF-8 и заголовок Content-Type включает charset=utf-8.

Как использовать HTTP-клиент Guzzle для работы с МТС API?

Альтернатива cURL: библиотека GuzzleHttp

Guzzle предоставляет более удобный объектно-ориентированный интерфейс для HTTP-запросов. Пример получения баланса:

use GuzzleHttp\Client;

$client = new Client([
    'base_uri' => 'https://api.mts.ru/',
    'timeout'  => 10.0,
]);

try {
    $response = $client->post('/account/balance', [
        'headers' => ['X-API-Key' => 'ваш_ключ'],
        'json'    => ['account' => 'номер_лицевого_счета']
    ]);
    $body = $response->getBody()->getContents();
    $data = json_decode($body, true);
    echo "Баланс: " . $data['balance'];
} catch (\Exception $e) {
    echo 'Ошибка: ' . $e->getMessage();
}

Guzzle автоматически обрабатывает кодировку и парсинг ответа. Для установки потребуется Composer: composer require guzzlehttp/guzzle.

Каким способом отправить SMS через API МТС с использованием SOAP?

Использование SOAP-клиента (устаревший протокол)

Некоторые старые сервисы МТС могут предоставлять WSDL-интерфейс. В PHP есть встроенный класс SoapClient. Пример:

$wsdl = 'https://api.mts.ru/soap?wsdl';
$client = new SoapClient($wsdl, [
    'trace' => true,
    'exceptions' => true,
]);
try {
    $result = $client->SendSMS([
        'login' => 'ваш_логин',
        'password' => 'ваш_пароль',
        'phone' => '79123456789',
        'message' => 'Тест SOAP'
    ]);
    print_r($result);
} catch (SoapFault $e) {
    echo 'SOAP ошибка: ' . $e->getMessage();
}

Этот метод реже используется в современных проектах из-за громоздкости SOAP, но может быть полезен для интеграции с legacy-системами.

Как обрабатывать ошибки и повторять запросы при работе с МТС API?

Механизмы повторных попыток и обработки ошибок

API может возвращать ошибки из-за временных сбоев. Рекомендуется реализовать логику повторных запросов с экспоненциальной задержкой. Пример на основе cURL:

function apiRequestWithRetry($url, $data, $maxRetries = 3) {
    $retryDelay = 1;
    for ($attempt = 1; $attempt <= $maxRetries; $attempt++) {
        $ch = curl_init();
        // настройки как в базовом примере
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        if ($httpCode >= 200 && $httpCode < 300) {
            return json_decode($response, true);
        }
        if ($attempt < $maxRetries) {
            sleep($retryDelay);
            $retryDelay *= 2; // удвоение задержки
        }
    }
    throw new Exception('API не отвечает после ' . $maxRetries . ' попыток');
}

Такой подход повышает стабильность интеграции.

Типичные ошибки и способы их решения:

  • HTTP 401 Unauthorized: Неверный API-ключ или истек срок действия токена. Проверьте настройки в личном кабинете МТС.
  • HTTP 429 Too Many Requests: Превышено ограничение на количество запросов в единицу времени. Внедрите ограничение скорости (rate limiting) на стороне клиента.
  • Пустой ответ: Возможно, сервер не принимает формат данных. Проверьте заголовки Content-Type и Accept.

Расширенные примеры интеграции МТС API на PHP

Пример 1: Класс-обертка для работы с МТС API

Создадим класс MtsApi, который инкапсулирует методы отправки SMS, проверки баланса и статуса доставки.

Пример
class MtsApi {
    private $client;
    private $apiKey;

    public function __construct($apiKey, $baseUri = 'https://api.mts.ru/') {
        $this->apiKey = $apiKey;
        $this->client = new \GuzzleHttp\Client([
            'base_uri' => $baseUri,
            'headers' => [
                'X-API-Key' => $apiKey,
                'Content-Type' => 'application/json',
                'Accept' => 'application/json'
            ]
        ]);
    }

    public function sendSms($phone, $message) {
        $response = $this->client->post('/sms/send', [
            'json' => ['phone' => $phone, 'text' => $message]
        ]);
        return json_decode($response->getBody(), true);
    }

    public function getBalance($account) {
        $response = $this->client->post('/account/balance', [
            'json' => ['account' => $account]
        ]);
        return json_decode($response->getBody(), true);
    }

    public function getDeliveryStatus($messageId) {
        $response = $this->client->get('/sms/status', [
            'query' => ['messageId' => $messageId]
        ]);
        return json_decode($response->getBody(), true);
    }
}

// Использование
$api = new MtsApi('ваш_ключ');
$result = $api->sendSms('79123456789', 'Привет!');
print_r($result);
Array ( [success] => 1 [messageId] => abc123 )

Пример 2: Асинхронная отправка нескольких SMS с помощью Guzzle

Guzzle поддерживает асинхронные запросы, что ускоряет массовую отправку.

Пример
use GuzzleHttp\Client;
use GuzzleHttp\Promise;

$client = new Client(['base_uri' => 'https://api.mts.ru/']);
$apiKey = 'ваш_ключ';
$phones = ['79111111111', '79222222222', '79333333333'];
$promises = [];

foreach ($phones as $phone) {
    $promises[$phone] = $client->postAsync('/sms/send', [
        'headers' => ['X-API-Key' => $apiKey],
        'json' => ['phone' => $phone, 'text' => 'Массовая рассылка']
    ]);
}

$results = Promise\settle($promises)->wait();
foreach ($results as $phone => $result) {
    if ($result['state'] === Promise\Fulfilled) {
        $body = $result['value']->getBody()->getContents();
        echo "{$phone}: успешно, ответ: {$body}\n";
    } else {
        echo "{$phone}: ошибка - {$result['reason']}\n";
    }
}
79111111111: успешно, ответ: {"success":true,"messageId":"id1"}
79222222222: успешно, ответ: {"success":true,"messageId":"id2"}
79333333333: ошибка - cURL error 28: Connection timed out

Пример 3: Получение детализации звонков (CSV) и парсинг

API может возвращать файлы. Пример загрузки детализации и сохранения на диск.

Пример
$client = new GuzzleHttp\Client();
$response = $client->post('https://api.mts.ru/cdr/download', [
    'headers' => ['X-API-Key' => 'ключ'],
    'json' => ['dateFrom' => '2023-01-01', 'dateTo' => '2023-01-31']
]);
$csv = $response->getBody()->getContents();
file_put_contents('cdr_2023_01.csv', $csv);
// Парсинг CSV
$rows = array_map('str_getcsv', explode("\n", $csv));
array_shift($rows); // удаляем заголовок
foreach ($rows as $row) {
    if (count($row) >= 3) {
        echo "Звонок: {$row[0]}, длительность: {$row[1]} сек, стоимость: {$row[2]} руб.\n";
    }
}
Звонок: 79123456789, длительность: 120 сек, стоимость: 1.50 руб.
Звонок: 79234567890, длительность: 45 сек, стоимость: 0.75 руб.

Пример 4: Использование OAuth 2.0 для доступа к API МТС

Если API требует авторизации через токен, получаем его по логину/паролю.

Пример
$client = new GuzzleHttp\Client();
$response = $client->post('https://api.mts.ru/oauth/token', [
    'form_params' => [
        'grant_type' => 'password',
        'client_id' => 'ваш_client_id',
        'client_secret' => 'секрет',
        'username' => 'логин',
        'password' => 'пароль'
    ]
]);
$tokenData = json_decode($response->getBody(), true);
$accessToken = $tokenData['access_token'];

// Далее используем токен в заголовках
$response = $client->get('https://api.mts.ru/account/info', [
    'headers' => ['Authorization' => 'Bearer ' . $accessToken]
]);
echo $response->getBody();
{"account":"12345","balance":150.00,"tariff":"Безлимит"}

МТС API на PHP - comments

En
Mts php api (php)