Bitrix24: поиск номера телефона по ID, php скрипт для Asterisk

Потребовалось получить номер телефона клиента из Bitrix24 по ID записи. Нужно это для соединения сотрудников с клиентами без предоставления им реального номера телефона (номер телефона скрыт для группы пользователей). То есть, сотрудник зная id клиента сможет дозвониться до него не имея прямого доступа к номеру телефона. В целом необходимость данного решения - вопрос спорный. Мы же рассмотрим лишь техническую реализацию. Возможно механизм решения кому-то пригодится для быстрой интеграции, хотя возможно удобнее будет использование AGI и, например, PAMI.
Данный 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)


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

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