Отправка СМС через МЕГАФОН по https для корпоративных клиентов





Рассылка SMS через оператора МЕГАФОН.

Предыстория.

Понадобилось как-то сделать рассылку sms. И случилось так, что корпоративной связью оказался Мегафон. Что может быть проще, подумал я. Ведь в БСП есть модуль рассылки sms. Но не все оказалось так радостно. Так как в БСП не оказалось сервиса Мегафона. И конфигурацию изменять не разрешили, чтобы дописать его туда.

Поиск готового решения не принес результатов. Так как готовые решения были реализованы на внешний компонентах или на ActiveX. И вызывали сомнения в своей работоспособности.

Пообщавшись с техподдержкой, выяснил, что Мегафон предоставляет два варианта использования сервиса, через https и SMPP.

Выбор пал на http, так как рассылка предполагалась разовая, иногда персональная. SMPP подразумевает более оперативную рассылку с большим количеством сообщений. И к тому же это легко реализуется через HTTPСоединение.

После заключения доп. соглашения, Мегафон прислал данные для авторизации и инструкцию, описывающую API своего сервиса.

Описание подключения.

Сервис рассылки у Мегафона располагается на сервере https://a2papi.megalabs.ru/ адрес ресурса /sms/v1/sms, запросы посылаются в нотации JSON, кодировка UTF-8.

В заголовке передаются авторизационные данные в формате login:pass закодированные Base64. Например, cG8nbX54dGAyqx==.

Обязательное требование — авторизация проходит только с заявленного IP.

Описание запросов.

Запрос отправляется методом POST.

{
"from": "Johnny_Viper",
"to": 79001234212,
"message": "Это тест",
"callback_url": "http://www.sombodyserver.ru/sms_callback"
}

Параметры:

from — имя отправителя. Тип строка. Обязательный параметр. Имя отправителя может содержать латинские буквы в разных регистрах, цифры, пробелы, а так же спецсимволы: ‘!"#$%()*+,-./:;<=>?@[]#k8SjZc9Dxk_`{|}~. Длина имени отправителя не должна превышать 11 символов, с учетом пробелов. Имя отправителя не может начинаться с одного или нескольких пробелов и/или заканчиваться одним или несколькими пробелами.

to — номер телефона. Тип число. Обязательный параметр. Из-за этого не получится отправить одно сообщение на несколько номеров. Т.е. один запрос — один номер.

message — собственно текст сообщения. Тип строка от 1 до 1000 символов.

callback_url — URL адрес вашей службы, для отправки уведомлений о статусе сообщения. Не обязательный параметр.

msg_id — УИД сообщения. Тип строка от 1 до 16 символов. Не обязательный параметр. По этому идентификатору можно получить состояние сообщения. Получил его абонент или нет. А так же сервис по этому номер понимает что сообщение с таким УИД уже отправлялось и не допускает дублей.

Реализация.

Для запроса нам понадобятся заголовки и тело запроса в нотации JSON.

Заголовки выглядят так:

Заголовоки = Новый Соответствие;
Заголовоки.Вставить("Authorization", "Basic " + ЛогинИПарольЗашифрованныйBase64);
Заголовоки.Вставить("Content-Type", "application/json; charset=utf-8");

Далее формируем запрос:

НТТРЗапрос = Новый HTTPЗапрос("/sms/v1/sms", Заголовоки);
НТТРЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса);

Тело запроса формируем примерно так:

ЗаписьJSON = Новый ЗаписьJSON;

ЗаписьJSON.ПроверятьСтруктуру = Ложь;

ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON;

ИмяФайлаОтвета = ПутьКФайлуОтвета;

ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);

ЗаписьJSON.ЗаписатьНачалоОбъекта();

ЗаписьJSON.ЗаписатьИмяСвойства("from");
ЗаписьJSON.ЗаписатьЗначение(Отправитель);

ЗаписьJSON.ЗаписатьИмяСвойства("to");
ЗаписьJSON.ЗаписатьЗначение(Номер);

ЗаписьJSON.ЗаписатьИмяСвойства("message");
ЗаписьJSON.ЗаписатьЗначение(Сообщение);

ЗаписьJSON.ЗаписатьИмяСвойства("callback_url");
ЗаписьJSON.ЗаписатьЗначение("http://www.sombodyserver.ru/sms_callback");

УИДСообщения = СтрЗаменить(Прав(Строка(Новый УникальныйИдентификатор), 17), "-", "");

ЗаписьJSON.ЗаписатьИмяСвойства("msg_id");
ЗаписьJSON.ЗаписатьЗначение(УИДСообщения);

ЗаписьJSON.ЗаписатьКонецОбъекта();
ТелоЗапроса = ЗаписьJSON.Закрыть();

Устанавливаем соединение и отправляем запрос.

Попытка
Соединение = Новый HTTPСоединение("a2p-api.megalabs.ru", , , , ПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси("http"), 60, Новый ЗащищенноеСоединениеOpenSSL);
Соединение.ОтправитьДляОбработки(НТТРЗапрос, ИмяФайлаОтвета);
Исключение
//ОписаниеОшибки();
КонецПопытки;

Для отправки сообщений этого хватит.

В обработке-примере реализован механизм рассылки по сотрудникам организации. Обработка должна работать в конфигурациях ERP 2, ЗУП 3, КА 2.

Тестировалась на ЕРП — 2.2.4.67.

P.S.: Если статья окажется полезной, у меня не единичный случай применения данной рассылки. Я сделаю описание службы, которая принимает состояние сообщения. И описание встраивания данного функционала в БСП.

В обработке настройки включаются сочетанием клавиш Ctrl+Shift+P.

16 Comments

  1. ltfriend

    1. Имя пользователя и пароль можно передать в параметрах конструктора HTTPСоединение в место заголовков. Ну тут на любителя.

    2. Для такой простой структуры JSON я бы сразу формировал строку без всяких ЗаписьJSON. Кода меньше и проще. Ну опять же на любителя.

    3. Зачем нужны все эти «ИмяФайлаОтвета» когда есть объект HTTPОтвет?

    Reply
  2. Захаров_Николай

    Согласен, можно все задать строкой.

    Это писалось на скорую руку, вслепую, так как авторизованного IP у меня не было.

    Файл ответа нужен для отладки.

    Reply
  3. user669425_potolitsyn

    Сделал отправку SMS по вашей статье, взлетало только так:

    НТТРЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса,,ИспользованиеByteOrderMark.НеИспользовать);
    Reply
  4. Захаров_Николай

    (4) А запрос как формировали? Не в блокноте?

    Reply
  5. user669425_potolitsyn

    Нет, точно как у Вас ЗаписьJSON, также строкой пробовал, результат одинаков. С дополнением работает в обоих вариантах.

    Reply
  6. Захаров_Николай

    (6) По умолчанию этот параметр стоит в состоянии Авто. Следовательно можно предположить, что используются системные настройки.

    В документации нет четкого указания используется BOM (Маркер последовательности байтов) или нет.

    Все взаимодействие происходит в кодировке UTF-8.

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

    То что вы обнаружили этот момент это очень хорошо. Возможно будет кому-то полезно.

    Reply
  7. j_alenka

    Добрый день! Чтобы использовать сервис рассылки от Мегафона нужно заключать доп соглашение с Мегафоном? Как получить логин и пароль на рассылку?

    Reply
  8. Захаров_Николай

    (8) Да. Нужно доп. соглашение. Напишите своему менеджеру.

    Надо будет предоставить свой внешний, белый IP.

    Придумать имя отправителя — 11 символов латиницей. (слово вместо номера, от которого будет приходить смс).

    Скорость отправки предложат в соответствии с выбранным пакетом.

    В ответе пришлют логин и пароль.

    Reply
  9. j_alenka

    Спасибо. В Мегафоне категорически отрицают, что у них есть данный сервис( Предлагают только подключить услугу Таргер.

    Reply
  10. j_alenka

    Услуга Мегафона:

    МОБИЛЬНОЕ ИНФОРМИРОВАНИЕ

    Размещение Рекламно-информационных материалов (РИМ) посредством канала SMS

    (подключение через WEB–интерфейс или по SMPP-протоколу)

    Тариф «Мобильное информирование. ФИКС»

    Reply
  11. Захаров_Николай

    (11) А вы являетесь корпоративным клиентом Мегафона?

    Reply
  12. dvissarov5

    Здравствуйте!

    При отправке смс возвращает:

    1281 Pdu запрещена по правилам роутинга (номера нет в списке ращрешённых или смс не разрешены для system_id, нет сессии для ussd).

    С такой ошибкой не сталкивались. С чем связано?

    Reply
  13. Захаров_Николай

    (13) Судя по ошибке ваш номер не прошел проверку на сервере. Возможные причины: отправляете с другого IP (не с того который в договоре); вам еще не включили услугу sms.

    Reply
  14. dvissarov5

    (14) Спасибо. Будем выяснять

    Reply
  15. pvb2004

    Добрый день, Николай! Скажите, а ЛогинИПарольЗашифрованныйBase64 это как? Просто строка логин+пароль и кодированная Base64, или как?

    Reply
  16. Захаров_Николай

    Да верно. Строка логин + пароль.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *