В одной из московских компаний решили расширить функции системы на Golang, и заказчик попросил внедрить в неё SMS и прочие каналы для уведомлений клиентов. В этой статье пошагово разберём, как отправлять SMS с использованием сервиса МТС Exolve и популярного языка программирования Golang.

SMS — полезный инструмент в сценариях взаимодействия с клиентами, если вы получаете их согласие на уведомления. В основном про доставку товара или о состоянии онлайн-заказа; сообщения о бонусах и акциях; автоматические ответы на запросы клиентов; оповещения о нештатных ситуациях в системах умного дома при интеграции с устройствами интернета вещей (IoT).

Соединим SMS-уведомления с сервером на Go и протестируем работу.

Покупаем номер для сообщений

Для начала регистрируемся на exolve.ru. Платформа начислит 300 приветственных рублей новому пользователю — их достаточно, чтобы арендовать номер.

При создании приложения необходимо придумать для него название: это поможет находить приложение в списке быстрее.

Что такое Приложения

Приложения — ваш проект для работы с IT- и телеком-функциями. Он позволяет проводить интеграции, купить и настроить номера и так далее. У каждого приложения есть свои ресурсы и настройки. В приложении вы можете настроить переадресацию входящих звонков, запись разговоров, создать callback, посмотреть детализацию по звонкам и сообщениям.

Затем сервис перенаправит нас в панель управления приложением. Просматриваем небольшое обучение и подтверждаем номер телефона. После этого переходим к разделу приложений.

Выбираем вкладку в меню приложения.

В левом сайдбаре находим раздел API-ключей.

Этот ключ (токен) нужен для отправки SMS. Важно запомнить, где он хранится, чтобы воспользоваться им позже.

Для отправки сообщений нужен номер телефона, поэтому переходим в левом боковом меню к вкладке «Номера» и нажимаем на кнопку «Купить номер».

Выбираем нужный регион, категорию, тип и кликаем на «Найти номер». Отмечаем понравившийся номер и нажимаем «Купить».

В итоге мы будем использовать личный токен для авторизации и два телефонных номера: номер-отправитель (купленный на МТС Exolve) и номер-получатель.

Создаём сервер на Golang

Язык программирования Go позволяет быстро и эффективно развернуть сервер, который можно использовать для различных задач, включая отправку SMS. Скачать Go можно с официального сайта.

Для начала создаём новую папку для нашего проекта, в ней — файл send.go и открываем его в предпочитаемом текстовом редакторе, например в VSCode.

Необходимо создать сервер, который будет прослушивать определённый порт и обрабатывать входящие запросы. В файл send.go добавляем следующий код с комментариями, которые объясняют назначения каждого его блока:

// package main указывает, что это основной пакет программы.
// В Go «main» — это специальный пакет, откуда начинается выполнение программы.
package main

// Импортируем необходимые библиотеки для работы нашей программы.
import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
)

// SMSContent — структура для хранения информации SMS-сообщения.
type SMSContent struct {
    Number      string `json:"number"`
    Destination string `json:"destination"`
    Text        string `json:"text"`
}

// main — стартовая точка нашей программы.
func main() {
    // Указываем, как обрабатывать HTTP-запросы по определённому адресу.
    http.HandleFunc("/my-post", processIncomingSMS)

    // Сообщаем о запуске сервера и запускаем его на 8080 порту.
    fmt.Println("Server listening on :8080")

    // Создаём пример SMS-сообщения и отправляем его.
    smsDetails := SMSContent{
        Number:      «ВСТАВЬТЕ НОМЕР ОТПРАВИТЕЛЯ»,
        Destination: «ВСТАВЬТЕ НОМЕР ПОЛУЧАТЕЛЯ»,
        Text:        «ВСТАВЬТЕ ТЕКСТ СООБЩЕНИЯ»,
    }
    executeSMSSending(smsDetails)

    // Запускаем веб-сервер, чтобы он прослушивал порт 8080.
    http.ListenAndServe(":8080", nil)
}

// processIncomingSMS обрабатывает входящие SMS-запросы.
func processIncomingSMS(responseWriter http.ResponseWriter, request *http.Request) {
    // Проверка на использование метода POST.
    if request.Method != http.MethodPost {
        http.Error(responseWriter, "Only POST is Supported", http.StatusMethodNotAllowed)
        return
    }

    // Чтение данных из тела запроса.
    requestBody, readError := io.ReadAll(request.Body)
    if readError != nil {
        http.Error(responseWriter, "Failed to Read Body", http.StatusInternalServerError)
        return
    }

    // Конвертируем полученные данные в структуру SMSData.
    var smsDetails SMSContent
    unmarshalError := json.Unmarshal(requestBody, &smsDetails)
    if unmarshalError != nil {
        http.Error(responseWriter, "JSON Conversion Failed", http.StatusBadRequest)
        return
    }

    // Выполнение отправки SMS.
    executeSMSSending(smsDetails)

    // Логирование информации о запросе.
    fmt.Printf("SMS Request Processed: %+v\n", smsDetails)

    // Подтверждение успешного приёма запроса.
    responseWriter.WriteHeader(http.StatusOK)
    responseWriter.Header().Set("Content-Type", "application/json")
    successResponse := map[string]string{"message": "Successfully processed SMS"}
    successJSON, _ := json.Marshal(successResponse)
    responseWriter.Write(successJSON)
}

// executeSMSSending обращается к внешнему API для отправки SMS.
func executeSMSSending(smsData SMSContent) {
    endpointURL := "https://api.exolve.ru/messaging/v1/SendSMS"

    // Преобразуем данные для отправки в формате JSON.
    smsJSON, marshalErr := json.Marshal(smsData)
    if marshalErr != nil {
        fmt.Println("Error converting SMS data to JSON:", marshalErr)
        return
    }

    // Создание запроса к API для отправки SMS.
    apiRequest, requestErr := http.NewRequest("POST", endpointURL, bytes.NewBuffer(smsJSON))
    if requestErr != nil {
        fmt.Println("Error creating API request:", requestErr)
        return
    }

    // Настройка заголовков HTTP-запроса.
    apiRequest.Header.Set("Content-Type", "application/json")
    apiRequest.Header.Set("Authorization", «Bearer ВАШ ТОКЕН АВТОРИЗАЦИИ») // Укажите здесь ваш токен.

    // Инициализация клиента для отправки запроса.
    httpClient := &http.Client{}
    apiResponse, apiErr := httpClient.Do(apiRequest)
    if apiErr != nil {
        fmt.Println("Error sending request to the API:", apiErr)
        return
    }
    defer apiResponse.Body.Close()

    // Обработка и вывод ответа от API.
    responseBody, readErr := io.ReadAll(apiResponse.Body)
    if readErr != nil {
        fmt.Println("Error reading the response body:", readErr)
        return
    }

    fmt.Printf("API Response: %s\n", string(responseBody))
}

Этот код позволяет тестировать API Exolve для отправки SMS. Остаётся только добавить в него свой валидный токен в формате «Bearer ваш токен», указать номера отправителя и получателя и текст SMS.

Последний шаг — тестирование нашего сервера. Открываем терминал (убедитесь, что находитесь в директории, где расположен ваш файл send.go) и вводим команду go run send.go.

Эта команда запустит наш сервер, который сделает запрос к API МТС Exolve со вставленными значениями: номерами отправителя и получателя и текстом SMS. В результате на указанные контакты придёт сообщение от номера, к которому привязана наша учётная запись МТС Exolve.

Итак, мы рассмотрели вариант для SMS-уведомлений через сервис МТС Exolve. Также по ссылке можно ознакомиться с подробной и понятной документацией.

Заключение

Использование сторонних API для отправки сообщений — ценный инструмент при разработке приложений. Ключевые преимущества таких сервисов — лёгкая настройка, обширная документация и эффективная техническая поддержка. В случае возникновения трудностей вы можете обратиться в чат и оперативно получить ответы от специалистов, что значительно облегчает решение проблем и ускоряет процесс разработки.

Комментарии (1)


  1. Vedga
    13.07.2024 11:04

    А чем удобнее работа с СМС через самопальные интерфейсы по сравнению с подключением по SMPP? Под каждого оператора делать своё сопряжение - ну да, чтобы у разработчиков безработицы не было, согласен.