Asterisk AmoCRM integration
На текущий момент работает: - Входящие через Asterisk виден Менеджеру в AmoCRM (всплывает окно, видно в карточке клиента) - Исходящий со страницы AmoCRM выполняется. (см. amocrm.php п.5) - Записанные звонки проигрываются. - CDR-загружаются в AmoCRM. (Загадочное место, не нашел внятных объяснений поставщика)
Настройка
Web сервер на Вашем хосте
К нему обращается AmoCRM, HTTPS на Web-сервере обязателен для AmoCRM!
Asterisk
/etc/asterisk/manager.conf
[general]
enabled = yes
port = 5038
bindaddr = 127.0.0.1 ; Нет смысла писать 0.0.0.0 если подключение локальное
webenabled = yes ; НЕ ЗАБЫТЬ
httptimeout = 60 ;
debug = on; при необходимости
[amocrm]
secret = SECRET
deny = 0.0.0.0/0.0.0.0
permit = 127.0.0.1/255.255.255.0
read = cdr,reporting,originate
write = reporting,originate
Ваш extention для входящих звонков Для работы потребуется USER_HASH из AmoCrm. Берем его в AmoCrm: Settings -> Api (требуется расширенный пакет)
Пример с моей конфигурации, для Вашей потребуется адаптация
# ВХОДЯЩИЕ ЗВОНКИ
[ukrtelecom-income]
exten => _0441234567,1,Noop()
same => n,Set(CALLTYPE=in)
; Ищем имя звонящего по AmoCRM
same => n,Set(CALLERID(name)=${SHELL(wget -O - --quiet "https://domain.amocrm.ru/private/acceptors/asterisk_new/?number=${CALLERID(num)}&[email protected]&USER_HASH=555" | cut -d "|"
; звоним ответственному менеджеру
same => n,Set(TOEXT=${SHELL(wget -O - --quiet "https://domain.amocrm.ru/private/acceptors/asterisk_new/?redirect=Y&number=${CALLERID(num)}&[email protected]&USER_HASH=555")}).
; запись разговора
same => n,Gosub(sub-mixmonitor,${EXTEN},1)
same => n,Dial(SIP/${TOEXT},,tTr)
same => n,HangUp()
Проверка настройки
Проверьте подключение к AMI
asterisk-test-connection-to-ami-by-telnet
Проверьте внешние запросы к Web-сервису на Вашем хосте
# Запрос 1:
https://asterisk.domain.com/amocrm.php?_login=amocrm&_secret=SECRET&_action=test_cdr
# Ответ:
asterisk_cb({"status":"ok","data":"connection ok"});
# Запрос 2:
https://asterisk.domain.com/blabla.php?_login=amocrmuser&_secret=SECRET&_action=status
# Ответ:
asterisk_cb({"status":"ok","action":"status","data":[]});
# Могут быть данные в массиве data
Решение проблем
amocrm.php 1. AmoCRM допускает ввести вот такой телефонный номер: +38050[440А99*30. Исправим.
elseif ($action === 'call') {
//...
$to = strval($_GET['to']);
$to = preg_replace("/[^0-9]/", '', $to);
$params=array(
'action'=>'Originate',
'channel'=>'SIP/'.$from),
'Exten'=> $to,
2. Если у Пользователя не указан Внутренний номер в настройки Интеграции - AmoCRM не гнушается позвонить с него. Мы не будем передавать такие запросы в Asterisk.
elseif ($action === 'call') {
//...
$from=intval($_GET['from']);
// не передали значение from - не будем даже отдавать на Asterisk
if ($from == 0) {
answer(array('status'=>'error','data'=>array('message'=>'No From Number')));
}
$params=array(
'action'=>'Originate',
'channel'=>'SIP/'.$from,
'Exten'=> $to,
3. Нужно указать свой CONTEXT
elseif ($action === 'call') {
//...
$params=array(
'action'=>'Originate',^M
'channel'=>'SIP/'.intval($_GET['from']),^M
'Exten'=>strval($_GET['to']),^M
'Context'=>'from-internal', .// ТУТ НАДО УКАЗАТЬ СВОЕ ЗНАЧЕНИЕ
'priority'=>'2',
'Callerid'=>'"'.strval($_GET['as']).'" <'.intval($_GET['from']).'>',
'Async'=>'Yes',
4.При отдаче CDR - скрипт корректирует время события, на установленную в начале файла ДЕЛЬТУ:
} elseif ($action==='cdr'){ // fetch call history
//...
foreach ($r as $k=>$v) $r[$k]['calldate']=date('Y-m-d H:i:s',strtotime($v['calldate'])-AC_TIME_DELTA*3600);
//...
}
5. Исходящие звонки в CDR Суть проблемы: Amocrm.php выгружает в CDR поля, SRC и DST. В SRC при выполнении звонка по внешнему SIP провайдера подставляется внешний городской номер, то есть запись выглядит вот так:
{"calldate":"2017-05-31 06:54:46","src":"0442901234","dst":"050123456","duration":"16","billsec":"16"
Предполагаю, что такую запись AmoCRM не может подтянуть, ибо номер ей не известен. В нашей конфигурации Asterisk-а мы кладем в CDR реальный номер звонящего внутреннего абонента. Немного подправив amocrm.php получим такой результат: