четверг, 22 марта 2018 г.

Настройка сервиса CallBack на LiveZilla 7.

Идея в том, чтобы заставить LiveZilla осуществлять исходящий вызов через Asterisk, при выборе клиентом функции "Обратный звонок".
Схема следующая: клиент на сайте заполняет форму "Обратный звонок", указывая свой телефон. LiveZilla создает запись в базе с признаком callback. В процедуру записи в базу вставляется строка, вызывающая PHP-скрипт на сервере Астериска с передачей параметров. PHP-скрипт создает call-файл, соединяющий оператора с клиентом.



Функция записи в базу находится в файле ./lib/objects.global.inc.php.
Нам нужна запись DATABASE_TICKET_MESSAGES, а не создание тикета, т.к. это позволяет отловить изменения клиентом телефона в полях формы. Искомая функция Save находится на строке 3501. Свой код добавляем в тело оператора if на строке 3522.
// Advanced CallBack
if( DBManager::RealEscape($this->Phone) && (($this->CallMeBack) == true) ) {AdvancedCallback(DBManager::RealEscape($this->Id),DBManager::RealEscape($this->Phone),base64_decode($_GET["rf"]),DBManager::RealEscape($this->IP));
}
Если задан телефон и признак CallMeBack, то вызываем функцию AdvancedCallback, передавая ей id тикета, номер телефона, декодированный URL сайта с кнопкой LiveZilla и IP-адрес клиента.
Функция AdvancedCallback вынесена в файл functions.my.php, поэтому добавляем в начало файла objects.global.inc.php:
include("_lib/functions.my.php");

Содержимое functions.my.pcc:
<?php
function AdvancedCallback($MySickID,$MySickPhone,$MySickSite,$MySickIP)
{
$MySickFile = "/var/log/callback.log";http://asterisk/lz/callback.php?ph=".$MySickPhone."&id=".$MySickID."&site=".parse_url($MySickSite,PHP_URL_HOST)."\" >> /var/log/callback.log";
$MySickDate = date("d.m.y H:i:s");
file_put_contents($MySickFile,"\nCallBack $MySickDate: Site=".parse_url($MySickSite,PHP_URL_HOST)." IP=$MySickIP Phone=$MySickPhone ID=$MySickID URL=$MySickURL\n", FILE_APPEND);
$MySickResult = shell_exec($MySickURL);
return;
}
?>

Содержимое http://asterisk/lz/callback.php:
<?php
$Phone = $_GET["ph"];
$ID = $_GET["id"];
$Site = $_GET["site"];
$file = "/var/www/clients/livezilla/call.txt";
$callfile = fopen("/var/spool/asterisk/outgoing/call_".$ID."_".$Phone,"w");
$current = file_get_contents($file);
$current .= "\nChannel: Local/$Phone@callback\nSet: CallBackID=$ID\nSet: CallBackSite=$Site\n";
echo "$current";
fwrite($callfile,$current);
?>
Задаем переменные CallBackID и CallBackSite для добавления в CDR.

Содержимое файла call.txt:
MaxRetries: 1
RetryTime: 60
WaitTime: 30
Context: callback
Extension: 888
Priority: 1

где 888 - номер оператора.

Тестовый контекст callback, вместо оператора на номере 888 музыка.
[callback]
exten => 888,1,Answer()
exten => 888,n,Verbose(0,CallBack test, exten = ${EXTEN})
exten => 888,n,Verbose(0,CallBack ID = ${CallBackID})
exten => 888,n,Set(CDR(userfield)=callback_${CallBackSite}_${CallBackID})
exten => 888,n,MusicOnHold(callmeback,120)
exten => 888,n,HangUp
exten => _[47].,1,Verbose(0,CallBack test, exten = ${EXTEN})
exten => _[47].,n,Verbose(0,CallBack ID = ${CallBackID})
exten => _[47].,n,Verbose(0,CallBack Site = ${CallBackSite})
exten => _[47].,n,Set(CDR(userfield)=callback_${CallBackSite}_${CallBackID})
exten => _[47].,n,Set(CHANNEL(language)=ru)
exten => _[47].,n,Set(CALLERID(name)=${CallBackSite})
exten => _[47].,n,Set(CALLERID(num)=888)
exten => _[47].,n,Dial(PJSIP/${EXTEN}@mysip,120)
exten => _[47].,n,HangUp
include => BLOCK

Комментариев нет:

Отправить комментарий