Перейти к содержанию

Исходящий звонок

Исходящий звонок на динамический номер

Работает это так - берем из большого пула (например, 499-678-XXXX) номер и просим пользователя совершить на него бесплатный звонок в течение ограниченного времени (например, в течении 2 минут). И если мы получили от пользователя звонок в ожидаемый отрезок времени на указанный номер, то вуаля 🤩 - мы подтвердили владение сотовым номером.

Есть два сценария:

  • Изначально мы не знаем, какой сотовый номер у пользователя.

    И это замечательный способ "привязки" сотового номера к публичной услуге. Например, он активно используется большим количеством операторов "сервиса идентификации" публичного WiFi.

  • Мы знаем, какой сотовый номер у пользователя.

    А это вариант для дополнительной двухфакторной авторизации.

Для пользователя это бесплатно

Когда пользователь совершает исходящий звонок на предложенный номер, CALL-ID "не поднимает трубку", а сразу сбрасывает звонок. Поэтому для пользователя он всегда бесплатный.

API

Swagger: https://out.call-id.ru/docs

Redoc: https://out.call-id.ru/redoc

Примеры использования

Идентификация пользователя в публичной гостевой сети WiFi

Рассмотрим пример - мы хотим идентифицировать пользователя в публичной (открытой) гостевой сети WiFi.

По закону РФ мы должны зафиксировать связку: MAC-адрес устройства клиента - его сотовый номер, и только потом открыть доступ к интернету.

Алгоритм следующий:

Получим городской номер и "попросим" пользователя сделать на него звонок.

Для этого передадим сервису "Исходящий звонок на динамический номер":

  • ключ авторизации api_key (можно воспользоваться публичным ключом для тестирования)

  • callback_url - куда сообщить с какого номера пользователь совершит звонок

  • lease_number_ttl_sec - сколько секунд ожидать звонка от пользователя (по умолчанию 2 минуты, но не более 3 минут)

  • custom_filed_1 - custom_filed_4 - необязательные текстовые поля
    (в данном примере мы фиксируем MAC-адрес пользователя, ID партнера нашего сервиса, ID заведения в котором развернута гостевая сеть и ID запроса)

запрос к сервису
curl -X 'POST' \
  'https://out.call-id.ru/interface/number-b-request' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "api_key": "038cfcaf-a75c-4dbc-9bf1-838a0d9b5839",
  "callback_url": "https://test.call-id.ru/callback/out-call-id/save",
  "lease_number_ttl_sec": 120,
  "custom_filed_1": "af:2f:f4:10:d0:e0",
  "custom_filed_2": "partner=3445",
  "custom_filed_3": "place=5528",
  "custom_filed_4": "reuqest_id=1122"
}'

В ответ получим городской номер, на который попросим пользователя сделать исходящий звонок:

ответ от сервиса - номер, на который должен позвонить пользователь
{
    "success": true
    "number_b": "74996783127",
}

Итак, если пользователь совершит звонок на number_b в течение lease_number_ttl_sec секунд, то сервис отправит на callback_url номер, с которого звонил пользователь (number_a), и исходные данные запроса:

callback - сообщает с какого номера был звонок от пользователя + исходные данные запроса
{
    "number_a": "79104901234", 
    "number_b": "74996783142", 
    "lease_number_ttl_sec": 120, 
    "expected_number_a": null, 
    "custom_filed_1": "af:2f:f4:10:d0:e0", 
    "custom_filed_2": "partner=3445", 
    "custom_filed_3": "place=5528", 
    "custom_filed_4": "reuqest_id=1122"
}

Вуаля! 😜 Можно привязать MAC-адрес пользователя к его сотовому номеру и выпустить его в интернет.

Примеры живые!

Кстати, приведенные CURL-примеры - "живые" 🤩 ! В них используется публичный ключ для тестирования. Дергайте "ручку", получайте номер, звоните не него и ловите callback ... Он тоже "живой" - в примерах он отсылается на тествый сервис test.call-id.ru/docs. И то, что "прилетит" на него после набора number_b, можно посмотреть здесь: test.call-id.ru/callback/read (колбэки хранятся 10 минут).

Дополнительная двухфакторная авторизация

Ввводные примера следующие:

  • мы знаем сотовый номер клиента.

  • помимо ввода логина и пароля, мы ходим подтвердить личность пользователя звонком с его телефона.

Отправляем те же параметры, что и в предыдущем примере, но добавляем параметр expected_number_a, то есть ожидаем звонка с конкретного номера

ожидаем звонка с конкретного номера
curl -X 'POST' \
  'https://out.call-id.ru/interface/number-b-request' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "api_key": "038cfcaf-a75c-4dbc-9bf1-838a0d9b5839",
  "callback_url": "https://test.call-id.ru/callback/out-call-id/save",
  "lease_number_ttl_sec": 120,
  "expected_number_a": "79104900123"
}'

В ответ, как и в предыдущем примере, получим городской номер, на который попросим пользователя сделать исходящий звонок:

ответ от сервиса - номер на который должен позвонить пользователь
{
    "success": true
    "number_b": "74996783127",
}

При звонке пользователя на number_b ответ на callback_url придет только в случае совпадения expected_number_a с number_a, и если пользователь уложится в отведенные lease_number_ttl_sec секунд:

callback - подтверждение личности пользователя звонком с его телефона
{
    "number_a": "79104900123", 
    "number_b": "74996783142", 
    "lease_number_ttl_sec": 120, 
    "expected_number_a": 79104900123, 
    "custom_filed_1": "", 
    "custom_filed_2": "", 
    "custom_filed_3": "", 
    "custom_filed_4": ""
}
Важно, понимать, что callback не придет (совсем), если:
  • пользователь не уложился в отведенное ему время (lease_number_ttl_sec)

  • ожидаемый номер expected_number_a не соответствует номеру-А c которого пользователем был произведен звонок

Исходящий звонок на номер 8800

Есть категория "мнительных" пользователей, которые сомневаются в бесплатности исходящего звонка. Таким пользователям можно предложить звонок на заведомо бесплатный номер TOLL FREE 8800. Но в этом случае пользователю придется заранее сообщить свой номер.

API

Swagger: https://8800-out.call-id.ru/docs

Redoc: https://8800-out.call-id.ru/redoc

Пример использования

Возьмем пример, аналогичный рассмотренному ранее: идентификация пользователя в публичной гостевой сети WiFi. Все то же, что и ранее, только теперь мы просим "мнительного" пользователя 🙀 заранее ввести свой номер expected_number_a. Потом запрашиваем у сервиса номер 8800, на который просим пользователя совершить звонок:

запрос к сервису
curl -X 'POST' \
  'https://8800-out.call-id.ru/interface/number-8800-request' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "api_key": "038cfcaf-a75c-4dbc-9bf1-838a0d9b5839",
  "callback_url": "https://test.call-id.ru/callback/8800-out-call-id/save",
  "expected_number_a": "79104900123",
  "lease_number_ttl_sec": 180,
  "custom_filed_1": "af:2f:f4:10:d0:e0",
  "custom_filed_2": "partner=3445",
  "custom_filed_3": "place=5528",
  "custom_filed_4": "reuqest_id=1122"
}'

📞

ответ от сервиса - номер 8800, на который должен позвонить пользователь
{
  "success": true
  "number_b": "78005113123",
}

🔄

callback - сообщает о факте звонка от пользователя и возвращает исходные данные
{
    "number_a": "79104900123",
    "number_b": "78005113123",
    "lease_number_ttl_sec": 180,
    "expected_number_a": "79104901019",
    "custom_filed_1": "af:2f:f4:10:d0:e0",
    "custom_filed_2": "partner=3445",
    "custom_filed_3": "place=5528",
    "custom_filed_4": "reuqest_id=1122"
}