С помощью сервиса custom callback абонент может заказать callback (обратный вызов).
В сервисе custom callback важно выделить следующие стороны:
Действия производимые описанными выше сторонами:
1) Клиент создает виджет на Платформе используя команды cli или http.
Виджет — карточка, которая содержит следующие данные:
1. вызвать оператора *Клиента*; 2. проиграть информацию о том, что был заказан callback; 3. играть оператору *Клиента* фоновую музыку; 4. сделать вызов на *Абонента*; 5. При ответе *Абонента*: проиграть информацию *Абоненту* о том, что сработал callback; 6. При ответе *Абонента*: проиграть информацию *Абоненту* о том, что он будет соединен с оператором.
При создании виджета генерируется идентификатор виджета(widget_id). Данный widget_id устанавливается Клиентом на свой сайт,
где будет заполняться web-форма на заявку callback-а.
2) Абонент заполняет заявку на callback в web-форме, предоставленной Клиентом, где Абонент должен указать:
3) Обработчик заявки на callback вычисляет разницу в мсек между текущим моментом времени и моментом времени,
когда должен активироваться callback.
Затем обработчик через http-запрос оправляет на Платформу
следующие данные:
1. SUBSCRIBER_NUMBER — номер *Абонента*; 2. TIME — вычисленная разница по времени (мс); 3. ATTEMPTS — количество попыток; 4. TIMEOUT — время между попытками (мс); 5. WIDGET_ID — идентификатор widget-а.
Обработчик должен знать куда отправлять http-запрос:
1. HOST — хост *Платформы*; 2. PORT — порт *Платформы*; 3. DOMAIN — домен на котором сгенерирован widget.
Просмотреть HOST и PORT можно посмотреть командой (rest_host & rest_port):
admin@mycelium1@ecss1:/$ system/tc/properties/info ┌────────────────┬────┬─────┐ │ Property │Node│Value│ ├────────────────┼────┼─────┤ │rest_host │ │ecss1│ │rest_port │ │8086 │ │session_lifetime│ │1800 │ └────────────────┴────┴─────┘ [exec at: 13.10.2019 10:01:29, exec time: 83ms, nodes: core1@ecss1] |
Общая схема http-запроса:
GET http://HOST:PORT/DOMAIN/service/custom_cb/WIDGET_ID?number=SUBSCRIBER_NUMBER&time=TIME&attempts=ATTEMPTS&timeout=TIMEOUT HTTP/1.1 |
Пример http-запроса:
GET http://localhost:8086/test.domain/service/custom_cb/054b4a0a684aa67c?number=102&time=1&attempts=1&timeout=10000 HTTP/1.1 |
Пример http-запроса через curl:
curl -G -d "number=102&time=1&attempts=1&timeout=10000" http://localhost:8086/d.local/service/custom_cb/054b4a0a684aa67c --verbose |
или:
curl -G http://localhost:8086/d.local/service/custom_cb/054b4a0a684aa67c?number=102\&time=1\&attempts=1\&timeout=10000 --verbose |
4) Платформа, получив http-запрос, обрабатывает его:
1. Взводится таймер на callback (через какой промежуток времени сделать callback);
2. По приходу таймера на callback — выполняется callback по ivr-сценарию указанном в виджете;
3. В случае не успешного соединения(со стороны *Оператора* или *Абонента* телефонный номер не отвечает, поступил сигнал занято и т.п.):
3.1 Если не использованы все попытки на повторное выполнение сallback-а, то взводится таймер на повторный callback(используется попытка). Переход к пункту 2; 3.2 Если использованы все попытки, то callback помечается как неудавшийся.
Виджет, сторона клиента:
1. номер абонента Б(кому перезвонить);
2. время во сколько перезвонить;
3. код клиента.
Виджет, сторона сервера:
1. код клиента(виджета):
- номер оператора от имени которого перезваниваем;
- количество повторных попыток дозвониться;
- имя сценария исходящего вызова;
- файл, озвучивающий имя клиента.
2. номер абонента Б(кому перезвонить).
Команды управления сервисом через Cocon(CLI) приведены в разделе Команды управления виджетом сервиса "custom callback"
Команды управления сервисом помощью API Http-terminal приведены в разделе Hc_custom_cb — Управление виджетом сервиса "custom callback"

Для начала нужно определиться с параметрами, например:
Время, через которое будет сделан вызов — 30 сек.;
Количество попыток дозвона при занятости/неответе — 2;
Время между попытками — 60 сек;
Куда отправлять http-запрос:
Порт *Платформы — 8086;
Домен на котором сгенерирован widget — biysk.local.
Далее создать IVR-сценарий обратного вызова:

Теперь имя или id этого скрипта можно будет использовать в команде создания виджета
С помощью команды CLI создаем новый виджет:
admin@mycelium1@ecss1:/$ domain/biysk.local/custom_cb/new 240475 cb_475 custom_cb_out "Виджет дежурного менеджера" Widget was created: <<"0622e4c44281371f">> [exec at: 13.10.2019 10:23:48, exec time: 75ms, nodes: core1@ecss1] |
Проверяем работу:
bsk@bsk:~$ curl -G -d "number=89913699011&time=30000&attempts=2&timeout=60000" http://192.168.1.21:8086/biysk.local/service/custom_cb/0622e4c44281371f --verbose * Trying 192.168.1.21... * Connected to 192.168.1.21 (192.168.1.21) port 8086 (#0) > GET /biysk.local/service/custom_cb/0622e4c44281371f?number=89913699011&time=30&attempts=2&timeout=60000 HTTP/1.1 > Host: 192.168.1.21:8086 > User-Agent: curl/7.47.0 > Accept: */* > < HTTP/1.1 200 OK < connection: keep-alive < server: Cowboy < date: Sun, 13 Oct 2019 03:32:00 GMT < content-length: 0 < * Connection #0 to host 192.168.1.21 left intact |
Убеждаемся, что сценарий отрабатывает корректно.