Перейти к содержимому

СМС-шлюз

Коды подтверждения уходят через шлюз заказчика по его собственному договору с оператором связи: продукт СМС не перепродаёт, и отдельная подписка на доставку не нужна.

Писать интеграцию не придётся. Для популярных провайдеров достаточно указать учётные данные, для любого другого шлюза или собственной службы отправки — описать HTTP-запрос.

Настройки лежат в конфигурации арендатора: tenants[].factors.sms.

Шесть провайдеров подключаются одной строкой preset: адрес, формат запроса и разбор ответа встроены в продукт.

tenants:
- id: corp
factors:
sms:
enabled: true
template: "Код подтверждения: %s. Никому его не сообщайте."
gateway:
preset: "smsc"
login: "логин аккаунта"
secret: "пароль или ключ API"
sender: "" # имя отправителя, согласованное с оператором; пусто — по умолчанию
presetПровайдерloginsecret
smscsmsc.ruлогин аккаунтапароль
smsrusms.ruне нуженapi_id
smsaerosmsaero.rue-mail аккаунтаключ API
sms4bsms4b.ruлогин аккаунтапароль
redsmsredsms.ruлогин аккаунтаключ API
zagruzkarapporto.ruлогин аккаунтапароль; url обязателен: https://bulk9.rapporto.ru/<аккаунт>_rest

url у любого пресета заменяет адрес провайдера, например на резервный узел.

Пресеты разбирают ответ провайдера по его формату, а не только по коду HTTP. Поэтому отказ шлюза — неверный ключ, пустой баланс, запрещённый номер — не выглядит для сотрудника как «код отправлен»: портал сообщает об ошибке, а причина пишется в журнал.

Если провайдера нет в списке или у вас уже есть собственная служба отправки уведомлений, портал вызывает её HTTP-запросом. На вашей стороне нужен один адрес, который принимает номер и текст и отвечает, удалась ли отправка.

sms:
enabled: true
template: "Код подтверждения: %s"
gateway:
method: "POST"
url: "https://notify.corp.example.ru/api/sms"
body: '{"phone":"{phone}","text":"{text}"}'
headers:
Content-Type: "application/json"
Authorization: "Bearer ЗАМЕНИТЬ"
ok_substring: '"status":"ok"' # подстрока успешного ответа
error_substring: '"status":"error"' # подстрока отказа; необязательно
  • {phone} и {text} подставляются с экранированием под формат тела: в JSON — как строковый литерал, в форме — как значение параметра.
  • Отправка считается успешной, только если ответ пришёл с кодом 2xx и содержит ok_substring. Так ответ 200 с ошибкой внутри не будет принят за доставку.
  • Номер берётся из атрибута каталога tenants[].directory.ad.phone_attribute (по умолчанию mobile).