Потребовалось получить номер телефона клиента из Bitrix24 по ID записи. Нужно это для соединения сотрудников с клиентами без предоставления им реального номера телефона (номер телефона скрыт для группы пользователей). То есть, сотрудник зная id клиента сможет дозвониться до него не имея прямого доступа к номеру телефона. В целом необходимость данного решения - вопрос спорный. Мы же рассмотрим лишь техническую реализацию. Возможно механизм решения кому-то пригодится для быстрой интеграции, хотя возможно удобнее будет использование AGI и, например, PAMI.
Данный php-скрипт вызывается из диалплана Asterisk. Прежде чем писать скрипт, нужно создать входящий вебхук в битрикс24 с доступом к CRM. Скрипт принимает ID ключом через пробел (выполняется в консоли) и в ответ выдает номер телефона контакта, если в контактах запрошенного ID нет (или номер телефона не указан) - ищет в компаниях и далее в лидах. В случае если ID или номер телефона не обнаружен - происходит выход из скрипта.
Данный php-скрипт вызывается из диалплана Asterisk. Прежде чем писать скрипт, нужно создать входящий вебхук в битрикс24 с доступом к CRM. Скрипт принимает ID ключом через пробел (выполняется в консоли) и в ответ выдает номер телефона контакта, если в контактах запрошенного ID нет (или номер телефона не указан) - ищет в компаниях и далее в лидах. В случае если ID или номер телефона не обнаружен - происходит выход из скрипта.
nano /var/lib/asterisk/agi-bin/find-user.php
<?php
if ($argc == 1) { exit; }
$id = $argv[1];
$crm_id = "my-company-name"; /* имя вашего битрикса24*/
$webhook = "1wlh4sgxt2wqnse2"; /* код авторизации вебхука */
/* проверьте получившийся URL для вызова REST, мой идентификатор пользователя 8 */
/* Ищем номер в контактах */
$urlcrm = "https://$crm_id.bitrix24.ru/rest/8/$webhook/crm.contact.get?ID=$id";
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, $urlcrm);
$response = curl_exec($curl);
curl_close($curl);
//print_r($content); //проверка полного массива
$content = json_decode($response,true);
/* Если запись есть - выводит первый доступный номер телефона */
if (isset($content['result'])) {
if ($content['result']['PHONE'] >= 0) {
$contact_phone = $content ['result']['PHONE'][0]['VALUE'];
print $contact_phone;
exit;
}
}
/* Ищем номер в компаниях */
$urlcrm = "https://$crm_id.bitrix24.ru/rest/8/$webhook/crm.company.get?ID=$id";
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, $urlcrm);
$response = curl_exec($curl);
curl_close($curl);
$content = json_decode($response,true);
if (isset($content['result'])) {
if ($content['result']['PHONE'] >= 0) {
$company_phone = $content ['result']['PHONE'][0]['VALUE'];
print $company_phone;
exit;
}
}
/* Ищем номер в лидах */
$urlcrm = "https://$crm_id.bitrix24.ru/rest/8/$webhook/crm.lead.get?ID=$id";
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, $urlcrm);
$response = curl_exec($curl);
curl_close($curl);
$content = json_decode($response,true);
if (isset($content['result'])) {
if ($content['result']['PHONE'] >= 0) {
$contact_phone = $content ['result']['PHONE'][0]['VALUE'];
print $contact_phone;
exit;
}
}
/* Если ничего не нашли */
exit;
?>
Далее в Asterisk создаем отдельный контекст для вызова, можно по моему примеру ниже:;пытаемся вытянуть номер из битрикса и перевести звонок на него
[get-name-and-call]
exten => s,1,NoOp(Сотрудник выбрал набор клиента по id)
same => n,Background(conf-getchannel);Любое голосовое сообщение
;читаем введенные цифры, пока не получим сигнал завершения ввода - решетку '#', до 7 символов
same => n,Read(NUMBER,,7)
same => n,NoOp(Звонящий ввел ${NUMBER});для проверки
same => n,ExecIf($["${NUMBER}"!=""]?Goto(getphone));если переменная не пустая переходим к звонку
same => n,Playback(privacy-incorrect);Если ничего не ввели
same => n,Playback(vm-goodbye)
same => n,Hangup
same => n(getphone),NoOp(Номер получили)
;same => n,Playback(vm-num-i-have);Записан следующий номер
;same => n,SayDigits(${NUMBER});можем проговорить цифры для проверки верности ввода
same => n,Set(CLIENT_PHONE=${SHELL(php /var/lib/asterisk/agi-bin/find-user.php ${NUMBER})});получаем номер телефона по id
same => n,ExecIf($["${CLIENT_PHONE}"!=""]?Goto(nabor));если номер телефона получен идем на метку nabor
same => n,NoOp(Клиент или номер не найден);иначе hangup
same => n,Hangup
same => n(nabor),NoOp(Соединяем с ${CLIENT_PHONE});в случае нахождения номера набираем номер
same => n,Playback(followme/pls-hold-while-try);Пожалуйста, оставайтесь на линии. Происходит соединение.
same => n,Dial(SIP/beeline/${CLIENT_PHONE},60);в данном случае звоним через транк билайна
same => n,Hangup
;по неправильному набору, таймауту
exten => t,1,Hangup
exten => e,1,Hangup
exten => i,1,Hangup
В нужное место добавляем условие для перехода в наш контекст:;при нажатии 9 идем в контекст перевода звонка на номер из битрикса24
exten => 9,1,NoOp(Звонящий выбрал перевод на клиента)
same => n,Goto(get-name-and-call,s,1)
Комментариев нет:
Отправить комментарий