Проверяем существование заказа в интернет магазине при входящем звонке

В очередной раз, руководство получив большой счет за входящие звонки на номер 8800 заставило задуматься. Зачем растрачивать лишние средства на тех, кто еще ничего не купил.
Было принято решение разделить звонящих на реальных покупателей, предоставив им бесплатную линию, и интересующихся, направив их на обычную городскую линию.

Имеем: freepbx, сайт на битриксе на соседней виртуалке. Поехали!

Подготовка:

Для начала создадим пользователя mysql способного подключаться с другого хоста

CREATE USER 'bitrixviewer'@'%' IDENTIFIED BY 'strongpassword';
GRANT ALL PRIVILEGES ON * . * TO 'bitrixviewer'@'%';
FLUSH PRIVILEGES;

Во freepbx создадим две записи (system -> records)
1- Приглашение ввести номер заказа назовем ее orderenter
2- Сообщение о найденном заказе, назовем orderfound
Очень удобно для тестового запуска сделать это вызовом на свой внутренний номер.

Затем, подключившись по ssh отредактируем файл /etc/asterisk/extensions_custom.conf
Добавим следующие строки

Пояснения:

[test_context] 
# название контекста, которое мы будем использовать в Custom Destination
exten => s,1,Answer()
#  поднимаем трубку
exten => s,n,Playback(ru/custom/orderenter)
#  Воспроизводим приветствие и приглашение ввести номер заказа после сигнала
exten => s,n,Read(mnum,beep,5,,1,5)
# «бипаем»  и считываем 5значный номер  с 1 секундой простоя и 5 попытками
exten => s,n,WaitExten(3) 
# ждем 3 секунды
exten => s,n,SayNumber(${mnum})
# Проговариваем введенный номер
exten => s,n,MYSQL(Connect connidbill 10.1.2.50 bitrixviewer  strongpassword  bitrix_database utf8)
#Соединяемся с базой битрикса
exten => s,n,MYSQL(Query resultidbill ${connidbill} select count(*)  as CNT   from b_sale_order where ID=${mnum})
#проверяем в базе встречается ли набранный номер среди номеров заказа 
exten => s,n,MYSQL(Fetch fetchid ${resultidbill} CNT)
# вытягиваем результат запроса в переменную
exten => s,n,GotoIf($["${CNT}" = "1"]?allow_call,s,1)
#Если заказ существует(подсчет вернул 1)   переходим к  нужному контексту
exten => s,n,Goto(test_context,s,1)
# заказ не найден начинаем все по второму кругу

[allow_call]
exten => s,1,Set(CHANNEL(language)=ru)
#Включаем русскую локализацию для сообщений
exten => s,n,Playback(ru/custom/orderfound)
# сообщаем пользователю что заказ найден
exten => s,n,Goto(ext-group,250,1)
#переводим звонок в нужную нам группу
# можно воспользоваться очередью exten => s,n,Queue(300)

Перезагружаем диалплан

 asterisk –rx ‘dialplan reload’

Во Freepbx идем в Admin -> Custom destination, добавляем:
Target: test_context,s,1
Это показывает что нужно выполнить кастомный диалплан с именем test_context с первого пункта.

Затем используем во входящей маршрутизации для нужного DID созданный Custom Destination как назначение звонка.

На данный момент, выявилось, но не является проблемой:

— Если звонящий набирает более 5 символов, звонок сбрасывается.
Метки:
Asterisk, freepbx, bitrix