Отправка SMS на C# (.NET): Интеграция с API SMS-сервисов через HttpClient

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Отправка SMS на C# (.NET): Интеграция с API SMS-сервисов

В современном мире отправка SMS-сообщений остаётся востребованной задачей для уведомлений, двухфакторной аутентификации и оповещений клиентов. В экосистеме .NET нет встроенной библиотеки для отправки SMS — все операции выполняются через HTTP-запросы к API сторонних SMS-провайдеров. В этой статье мы разберём, как организовать отправку SMS на C# с использованием HttpClient, и рассмотрим примеры интеграции с популярными сервисами.

Выбор SMS-провайдера и ключевые параметры

Перед началом работы необходимо зарегистрироваться в одном из SMS-сервисов. Наиболее популярные: Twilio, Vonage (Nexmo), SMS Aero, СМСЦентр. Все они предоставляют REST API. Для отправки потребуются:

  • API ключ / токен — уникальный идентификатор вашего аккаунта.
  • Secret / пароль — секретный ключ для аутентификации.
  • Номер отправителя (Sender ID) — строка, которая будет отображаться у получателя (например, ваш бренд).
  • Номер получателя — в международном формате (например, +71234567890).

Базовая реализация на C# с HttpClient

Для работы с HTTP-запросами в .NET используется класс System.Net.Http.HttpClient. Ниже приведён пример отправки SMS через API Twilio (один из самых популярных сервисов).

using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

public class SmsSender
{
    private readonly HttpClient _httpClient;
    private readonly string _accountSid;
    private readonly string _authToken;

    public SmsSender(string accountSid, string authToken)
    {
        _accountSid = accountSid;
        _authToken = authToken;
        _httpClient = new HttpClient();
    }

    public async Task SendSmsAsync(string to, string from, string message)
    {
        // URL для Twilio API
        string url = $"https://api.twilio.com/2010-04-01/Accounts/{_accountSid}/Messages.json";

        // Формируем данные формы
        var content = new FormUrlEncodedContent(new[]
        {
            new KeyValuePair<string, string>("To", to),
            new KeyValuePair<string, string>("From", from),
            new KeyValuePair<string, string>("Body", message)
        });

        // Добавляем Basic-аутентификацию
        string auth = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{_accountSid}:{_authToken}"));
        _httpClient.DefaultRequestHeaders.Authorization = 
            new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", auth);

        // Отправляем POST-запрос
        HttpResponseMessage response = await _httpClient.PostAsync(url, content);

        if (response.IsSuccessStatusCode)
        {
            string responseBody = await response.Content.ReadAsStringAsync();
            Console.WriteLine($"SMS отправлено успешно: {responseBody}");
        }
        else
        {
            string error = await response.Content.ReadAsStringAsync();
            Console.WriteLine($"Ошибка: {response.StatusCode} - {error}");
        }
    }
}

Использование класса

class Program
{
    static async Task Main(string[] args)
    {
        // Замените на свои данные из личного кабинета Twilio
        string accountSid = "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
        string authToken = "your_auth_token_here";

        var sender = new SmsSender(accountSid, authToken);
        await sender.SendSmsAsync(
            to: "+71234567890",
            from: "+15017122661", // номер, выделенный Twilio
            message: "Привет! Это тестовое SMS из C#."
        );
    }
}

Альтернативные провайдеры: пример с Vonage (Nexmo)

Для Vonage API используется другой формат запроса — JSON. Пример:

public async Task SendSmsVonageAsync(string to, string from, string message)
{
    string apiKey = "your_api_key";
    string apiSecret = "your_api_secret";
    string url = "https://rest.nexmo.com/sms/json";

    var payload = new
    {
        api_key = apiKey,
        api_secret = apiSecret,
        to = to,
        @from = from,
        text = message
    };

    string json = System.Text.Json.JsonSerializer.Serialize(payload);
    var content = new StringContent(json, Encoding.UTF8, "application/json");

    HttpResponseMessage response = await _httpClient.PostAsync(url, content);
    // Обработка ответа аналогична примеру выше
}

Обработка ошибок и повторные попытки

При работе с внешними API важно предусмотреть:

  • Проверку кода ответа — не только 200 OK, но и 201, 202 (асинхронная отправка).
  • Retry-логику — при временных ошиб

Рекомендаций