Интеграция PHP-приложений с телеком-сервисами МТС
Основные подходы к интеграции МТС 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":"Безлимит"}