В одной из московских компаний решили расширить функции системы на 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 для отправки сообщений — ценный инструмент при разработке приложений. Ключевые преимущества таких сервисов — лёгкая настройка, обширная документация и эффективная техническая поддержка. В случае возникновения трудностей вы можете обратиться в чат и оперативно получить ответы от специалистов, что значительно облегчает решение проблем и ускоряет процесс разработки.
Vedga
А чем удобнее работа с СМС через самопальные интерфейсы по сравнению с подключением по SMPP? Под каждого оператора делать своё сопряжение - ну да, чтобы у разработчиков безработицы не было, согласен.