ћы в Telegram - чате. “ы с нами? :)

ћерион Ќетворкс

7 минут чтени€

»щешь бесплатное решение по реализации исход€щих звонков из CRM Ѕитрикс24 в св€зке с Asterisk? ѕоздравл€ем, нашел. ћожешь закрыть все остальные вкладки и оставить только эту Ц пошаговое руководство по интеграции Ѕ24 и јстериска в статье :)


 ак это работает?

Ћегко (на этом можно было бы закончить). ћы создаем исход€щий вебхук в Ѕитрикс, он дергает php - скрипт на Asterisk каждый раз, когда мы будем нажимать на номер телефона в лиде, сделке, контакте Ц где угодно. ѕоехали.


ѕодготовка

—оздадим AMI (Asterisk Manager Interface)Ц юзера, через которого будем инициировать вызовы. ќткроем файл настройки:

vim /etc/asterisk/manager.conf

ќбращаем внимание на секцию [general] - параметр enabled должен быть в значении yes:

[general]
enabled = yes // вот этот параметр :)
port = 5038
bindaddr = 0.0.0.0

ѕроверьте, чтобы в самом конце файла manager.conf были следующие строки (если их нет, добавьте):

#include manager_custom.conf

ѕроверили. ј теперь открываем файл /etc/asterisk/manager_custom.conf (если его нет Ц создайте и дайте права) и добавл€ем туда:

[им€]
secret = пароль
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.0
permit=ip_адрес_Asterisk/маска
read = all,system,call,log,verbose,command,agent,user,config,originate
write = all,system,call,log,verbose,command,agent,user,config,originate
  • им€ - придумайте им€ дл€ юзера;
  • пароль - создайте устойчивый к взломам пароль, с помощью сервисов онлайн генерации, например;
  • ip_адрес_Asterisk/маска - укажите вашу подсеть. ¬ указанной подсети должен находитс€ IP Ц адрес, с которого скрипт будет обращатьс€ к AMI. ѕример записи - 192.168.1.0/255.255.255.0;

ѕереходим в Ѕитрикс24 и создаем вебхуки.


¬ебхуки

ѕервый вебхук мы сделаем вход€щим Ц по нему наш скрипт будет получать внутренний номер сотрудника по его идентификатору. ѕереходим в раздел ѕриложен般ебхуки. Ќажимаем кнопку ƒобавить вебхук и выбираем ¬ход€щий вебхук. ƒелаем вот что:

  • Ќазвание - любое название, как вам удобно;
  • ќписание - нужный момент, чтобы не запутатьс€ в вебхуках;
  • ѕрава доступа - отметьте галочкой ѕользователи (user);

Ќажимаем сохранить. ƒолжно получитьс€ примерно вот так:

¬ход€щий вебхук Asterisk Ѕитрикс24

ќбратите внимание: на скриншоте, красной линией подчеркнут URL параметра ѕример URL дл€ вызова REST. —копируйте его ровно до последней части /profile/. Ќапример, у нас получилось:

https://merionet.bitrix24.ru/rest/2/1a2b3c4d5e6f7g8h

—охраните этот URL Ц он нам еще пригодитс€ :) ѕеред тем, как мы сделаем исход€щий вебхук, давайте обсудим будущий URL нашего скрипта. “ак как он будет располагатьс€ в веб директории, мы предлагаем вам сгенерировать последовательно 3 директории, в которых будет лежать скрипт. » вот о чем мы: представим, что ваш домен выгл€дит вот так:

http://ilovemerionet.ru/

√уд. ƒавайте последовательно сгенерируем 3 уникальных названи€ директорий, например:

  1. IpVy7ul85sz1Doi
  2. C49BNGJW3Yf30eo
  3. qBN0NBC56lj07yh

ѕосле чего, в директории /var/www/html/ создадим три вложенных папки, чтобы наш файл в конечно итоге размещалс€ в директории:

/var/www/html/IpVy7ul85sz1Doi/C49BNGJW3Yf30eo/qBN0NBC56lj07yh/

—ам файл скрипта, который мы сгенерируем, будет называтьс€ index.php, тем самым, вебхук со стороны Ѕитрикс24 будет обращатьс€ по следующему URL:

http://ilovemerionet.ru/IpVy7ul85sz1Doi/C49BNGJW3Yf30eo/qBN0NBC56lj07yh/

 ажетс€, разобрались :) “еперь создаем исход€щий вебхук Ц прыгаем в раздел ѕриложен般ебхуки. Ќажимаем кнопку ƒобавить вебхук и выбираем »сход€щий вебхук. ƒелаем вот что:

  •  од авторизации - это наш проверочный код, который мы используем в скрипте;
  • јдрес обработчика - как мы привели пример выше, тут будет http://ilovemerionet.ru/IpVy7ul85sz1Doi/C49BNGJW3Yf30eo/qBN0NBC56lj07yh/ - у вас, само собой, свой URL :);
  • Ќазвание - €вное название, чтобы не запутатьс€. —делайте Asterisk Calls, например?;
  •  омментарий - можете оставить комментарий дл€ себ€, чтобы было проще разобратьс€;
  • “ип событи€ - выбираем »нициаци€ звонка через приложение (ONEXTERNALCALLSTART);
»сход€щий вебхук Asterisk Ѕитрикс24

¬еликолепно. ћы выходим на финишную пр€мую.


—крипт дл€ Asterisk

Ћовите скрипт, который будет принимать вебхуки от Ѕитрикс24.  омментарии к самым важным строкам, как всегда, присутствуют:

<?php
$check_token = " од_авторизации"; // это значение будет прилетать нам в вебхуке. ј мы будем его сравнивать, чтобы быть уверенными, что это Ѕитрикс;
$user_hook_url = "„асть_вход€щего_вебхука"; // нужно, дл€ получени€  внутреннего номера пользовател€, которые инициирует звонок;
$ami_login = "ami_логин"; // логин к AMI, который мы создавали ранее;
$ami_password = "пароль"; // пароль к AMI, который мы создавали ранее;
$strhost = "IP_адрес"; // IP - адрес вашего Asterisk;
if (strcmp($_POST['auth']['application_token'], $check_token) === 0) {
function writeToLog($data, $title = '') { 
$log = "\n------------------------\n"; 
$log .= date("Y.m.d G:i:s") . "\n"; 
$log .= (strlen($title) > 0 ? 
$title : 'DEBUG') . "\n"; 
$log .= print_r($data, 1); 
$log .= "\n------------------------\n"; 
file_put_contents(getcwd() . '/hook.log', $log, FILE_APPEND); 
return true; }
writeToLog($_REQUEST, 'incoming');
$UID = $_POST['data']['USER_ID'];
$bitrix_contact_url = "$user_hook_url/user.get.json?ID=$UID";
$btc = curl_init();
curl_setopt ($btc, CURLOPT_URL,$bitrix_contact_url);
curl_setopt ($btc, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($btc, CURLOPT_TIMEOUT, 60);
curl_setopt ($btc, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($btc, CURLOPT_RETURNTRANSFER, 1);
$bitrix_contact = curl_exec ($btc);
curl_close($btc);
$bitrix_contact_o = json_decode($bitrix_contact, true);
$cid = $bitrix_contact_o['result'][0]['UF_PHONE_INNER'];
$strport = "5038";
$timeout = "5";
$num = str_replace("+","",$_POST['data']['PHONE_NUMBER_INTERNATIONAL']);
$callid = $_POST['data']['CALL_ID'];
$c="from-internal";
$p="1";
$errno=0 ;
$errstr=0 ;
$sconn = fsockopen($strhost, $strport, &$errno, &$errstr, $timeout) or die("Connection to $strhost:$strport failed");
if (!$sconn) { echo "$errstr ($errno)
\n"; } else { $sconn1 = fsockopen($strhost, $strport, &$errno, &$errstr, $timeout) or die("Connection to $strhost:$strport failed"); if (!$sconn1) { echo "$errstr ($errno)
\n"; } else { fputs($sconn1, "Action: login\r\n"); fputs($sconn1, "Username: $ami_login\r\n"); fputs($sconn1, "Secret: $ami_password\r\n"); fputs($sconn1, "Events: off\r\n\r\n"); usleep(500); fputs($sconn1, "Action: Setvar\r\n"); fputs($sconn1, "Variable: B24ID\r\n"); fputs($sconn1, "Value: $callid/$cid\r\n"); fputs($sconn1, "Action: Logoff\r\n\r\n"); usleep(500); $wrets1=fgets($sconn1,128); fclose($sconn1);} fputs($sconn, "Action: login\r\n"); fputs($sconn, "Username: $ami_login\r\n"); fputs($sconn, "Secret: $ami_password\r\n"); fputs($sconn, "Events: off\r\n\r\n"); usleep(500); fputs($sconn, "Action: Originate\r\n"); fputs($sconn, "Channel: SIP/$cid\r\n"); fputs($sconn, "Callerid: $cid\r\n"); fputs($sconn, "Timeout: 20000\r\n"); fputs($sconn, "Context: $c\r\n"); fputs($sconn, "Exten: $num\r\n"); fputs($sconn, "Priority: $p\r\n"); fputs($sconn, "Async: yes\r\n\r\n" ); usleep(500); $wrets=fgets($sconn,128); fclose($sconn); exit; }} else { exit; }; ?>
—качать скрипт интеграции
ѕосле загрузки файла, сохраните его с расширением .php

¬ нем вам нужно помен€ть 5 переменных:

  • $check_token - код авторизации, который вы получили на этапе создани€ исход€щего вебхука;
  • $user_hook_url - та часть вход€щего вебхука, котора€ подчеркнута на скриншоте до слов /profile/;
  • $ami_login - логин в AMI, создавали ранее;
  • $ami_password - пароль в AMI;
  • $strhost - IP - адрес вашего Asterisk;

„тобы скрипт заработал, нужно, как мы говорили ранее, загрузить его в директорию /var/www/html/IpVy7ul85sz1Doi/C49BNGJW3Yf30eo/qBN0NBC56lj07yh/ (после генерации директорий у вас будет свой путь!) и дать следующие команды:

dos2unix /var/www/html/IpVy7ul85sz1Doi/C49BNGJW3Yf30eo/qBN0NBC56lj07yh/index.php
chown asterisk:asterisk /var/www/html/IpVy7ul85sz1Doi/C49BNGJW3Yf30eo/qBN0NBC56lj07yh/index.php
chmod 775 /var/www/html/IpVy7ul85sz1Doi/C49BNGJW3Yf30eo/qBN0NBC56lj07yh/index.php

 стати, профит этого скрипта в том, что он ведет логирование в файле hook.log, который будет располагатьс€ в той же директории. ≈сли кто Ц то из ваших менеджеров скажет, что не смог позвонить клиенту Ц это будет легко проверить :)

ѕочти готово. ќсталс€ только один штрих. —нова открываем CRM Ѕитрикс24, переходим в сегмент “елефони€Ќастройки и в параметре Ќастройка номеров по-умолчанию выбираем созданный нами вебхук (у нас он называетс€ ѕриложени€: Asterisk Calls:

Ќастройка телефонии јстериск в Ѕитрикс24

ј вот теперь готово. «воним

ћассив звонка в Ѕитрикс24

«вонит :) Ќо! Ќе закрывает карточку и не добавл€ет отметку об исход€щем звонке в сущность CRM (запись разговора). ¬нимательные пользователи обрат€т внимание Ц в AMI сегменте скрипта, который обсуждали ранее, мы кинули команду Setvar (присвоение переменной) к B24ID = $callid. “ем самым, на всем прот€жении звонка у нас будет идентификатор этой телефонной транзакции.

‘актически, чтобы получить отметку о звонке, запись разговора и прочее, по факту окончани€ разговора нужно методом telephony.externalcall.finish кинуть массив данных, где будет отметка об идентификаторе вызова (которую передаем через диалплан), телефон инициатора вызова, длительность и ссылка на запись разговора.

≈сли данна€ стать€ вызовет интерес, мы покажем, как это сделать. ”дачи с настройкой :)


ѕолезна ли ¬ам эта стать€?


Ёти статьи могут быть вам интересны: