
Gen diferan opsyon pou entegre IP-PBX Asterisk ak CRM Bitrix24 sou rezo a, men nou toujou deside ekri pwòp pa nou.
An tèm de fonksyonalite, tout bagay se estanda:
- Lè w klike sou yon lyen ak nimewo telefòn yon kliyan nan Bitrix24, Asterisk konekte nimewo entèn itilizatè a sou non li te fè klik la ak nimewo telefòn kliyan an. Nan Bitrix24, yo anrejistre yon dosye sou apèl la epi nan fen apèl la, yo rale yon anrejistreman konvèsasyon an.
- Asterisk resevwa yon apèl soti deyò - nan koòdone Bitrix24 nou montre kat kliyan an bay anplwaye a ki gen nimewo apèl sa a te rive.
Si pa gen okenn kliyan sa yo, nou pral louvri kat la pou kreye yon nouvo plon.
Le pli vit ke apèl la fini, nou reflete sa a sou kat la epi rale moute yon anrejistreman nan konvèsasyon an.
Anba koupe a, mwen pral di ou ki jan yo mete tout bagay kanpe pou tèt ou epi ba ou yon lyen nan github - wi, wi, pran li epi sèvi ak li!
Jeneral deskripsyon
Nou rele entegrasyon nou an CallMe. CallMe se yon ti aplikasyon entènèt ki ekri an PHP.
Teknoloji ak sèvis yo itilize
- PHP 5.6
- konpozitè
- Nginx + php-fpm
- sipèvizè
- AMI (Entèfas Manadjè Asterisk)
- Bitrix webhooks (enplemantasyon API REST senplifye)
Pre-anviwònman
Sou yon sèvè ak Asterisk, ou bezwen enstale yon sèvè entènèt (pou nou se nginx+php-fpm), sipèvizè ak git.
Kòmand pou enstalasyon (CentOS):
yum install nginx php-fpm supervisor gitNou ale nan anyè a aksesib a sèvè entènèt la, rale aplikasyon an soti nan Git epi mete dwa ki nesesè yo nan katab la:
cd /var/www
git clone https://github.com/ViStepRU/callme.git
chown nginx. -R callme/
Apre sa, ann konfigirasyon nginx, konfigirasyon nou an sitiye nan
/etc/nginx/conf.d/pbx.vistep.ru.confserver {
server_name www.pbx.vistep.ru pbx.vistep.ru;
listen *:80;
rewrite ^ https://pbx.vistep.ru$request_uri? permanent;
}
server {
# listen *:80;
# server_name pbx.vistep.ru;
access_log /var/log/nginx/pbx.vistep.ru.access.log main;
error_log /var/log/nginx/pbx.vistep.ru.error.log;
listen 443 ssl http2;
server_name pbx.vistep.ru;
resolver 8.8.8.8;
ssl_stapling on;
ssl on;
ssl_certificate /etc/letsencrypt/live/pbx.vistep.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pbx.vistep.ru/privkey.pem;
ssl_dhparam /etc/nginx/certs/dhparam.pem;
ssl_session_timeout 24h;
ssl_session_cache shared:SSL:2m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers kEECDH+AES128:kEECDH:kEDH:-3DES:kRSA+AES128:kEDH+3DES:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=31536000;";
add_header Content-Security-Policy-Report-Only "default-src https:; script-src https: 'unsafe-eval' 'unsafe-inline'; style-src https: 'unsafe-inline'; img-src https: data:; font-src https: data:; report-uri /csp-report";
root /var/www/callme;
index index.php;
location ~ /. {
deny all; # запрет для скрытых файлов
}
location ~* /(?:uploads|files)/.*.php$ {
deny all; # запрет для загруженных скриптов
}
location ~* ^.+.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
access_log off;
log_not_found off;
expires max; # кеширование статики
}
location ~ .php {
root /var/www/callme;
index index.php;
fastcgi_pass unix:/run/php/php5.6-fpm.sock;
# fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
Mwen pral kite analiz konfigirasyon an, pwoblèm sekirite, jwenn yon sètifika e menm chwazi yon sèvè entènèt andeyò sijè ki abòde lan atik la - anpil te ekri sou sa. Aplikasyon an pa gen okenn restriksyon, li travay sou tou de http ak https.
Nou itilize https, ann ankripte sètifika.
Si ou te fè tout bagay kòrèkteman, Lè sa a, klike sou lyen an ou ta dwe wè yon bagay tankou sa a

Mete kanpe Bitrix24
Ann kreye de webhooks.
Webhook kap vini.
Anba kont administratè a (avèk id 1), swiv chemen an: Aplikasyon -> Webhooks -> Ajoute webhook -> Webhook entrant.

Ranpli paramèt webhook k ap vini an tankou nan Ekran yo:


Epi klike sou sove.
Apre ekonomize, Bitrix24 pral bay URL la nan webhook la fèk ap rantre, pou egzanp:

Sove vèsyon URL ou a san yo pa /profile/ final la - li pral itilize nan aplikasyon an pou travay ak apèl fèk ap rantre.
Mwen genyen sa https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/
Webhook sortan.
Aplikasyon -> Webhooks -> Ajoute webhook -> Webhook sòtan
Detay yo ankò sou Ekran yo:


Sove epi resevwa kòd otorizasyon an

Mwen genyen sa xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Ou bezwen tou kopye li pou tèt ou ou bezwen li pou fè apèl sòtan.
Enpòtan!
Yon sètifika SSL dwe configuré sou sèvè Bitrix24 la (ou ka itilize letsencrypt), otreman Bitrix api a pa pral travay. Si ou gen yon vèsyon nwaj, pa enkyete - li deja gen ssl.
Enpòtan!
Chan "Adrès Pwosesè" la dwe genyen yon adrès aksesib sou Entènèt!
Epi kòm yon manyen final, se pou nou enstale CallMeOut nou an kòm yon aplikasyon pou fè apèl (pou lè ou klike sou nimewo a sou PBX a, lòd pou orijin apèl la pral vole ale).
Nan meni an, chwazi: Plis -> Telefoni -> Plis -> Anviwònman, mete nan "Default nimewo apèl sortan" Aplikasyon: CallMeOut epi klike sou "Save"

Mete kanpe asterisk
Pou siksè entèraksyon ant Asterisk ak Bitrix24, nou bezwen ajoute callme itilizatè AMI a nan manager.conf:
[callme]
secret = JD3clEB8_f23r-3ry84gJ
deny = 0.0.0.0/0.0.0.0
permit = 127.0.0.1/255.255.255.0
permit= 10.100.111.249/255.255.255.255
permit = 192.168.254.0/255.255.255.0
read = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan
write = system,call,agent,log,verbose,user,config,command,reporting,originate
Apre sa, gen plizyè ke trik nouvèl ki pral bezwen aplike atravè dialplan (pou nou sa a se extensions.ael).
Mwen pral bay tout dosye a, epi answit mwen pral bay yon eksplikasyon:
globals {
WAV=/var/www/pbx.vistep.ru/callme/records/wav; //Временный каталог с WAV
MP3=/var/www/pbx.vistep.ru/callme/records/mp3; //Куда выгружать mp3 файлы
URLRECORDS=https://pbx.vistep.ru/callme/records/mp3;
RECORDING=1; // Запись, 1 - включена.
};
macro recording(calling,called) {
if ("${RECORDING}" = "1"){
Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called});
Set(datedir=${STRFTIME(${EPOCH},,%Y/%m/%d)});
System(mkdir -p ${MP3}/${datedir});
System(mkdir -p ${WAV}/${datedir});
Set(monopt=nice -n 19 /usr/bin/lame -b 32 --silent "${WAV}/${datedir}/${fname}.wav" "${MP3}/${datedir}/${fname}.mp3" && rm -f "${WAV}/${fname}.wav" && chmod o+r "${MP3}/${datedir}/${fname}.mp3");
Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3);
Set(CDR(filename)=${fname}.mp3);
Set(CDR(recordingfile)=${fname}.wav);
Set(CDR(realdst)=${called});
MixMonitor(${WAV}/${datedir}/${fname}.wav,b,${monopt});
};
};
context incoming {
888999 => {
&recording(${CALLERID(number)},${EXTEN});
Answer();
ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp()); // выставляем CallerID если узнали его у Битрикс24
Set(CallStart=${STRFTIME(epoch,,%s)});
Queue(Q1,tT);
Set(CallMeDISPOSITION=${CDR(disposition)});
Hangup();
}
h => {
Set(CDR_PROP(disable)=true);
Set(CallStop=${STRFTIME(epoch,,%s)});
Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)});
ExecIF(${ISNULL(${CallMeDISPOSITION})}?Set(CallMeDISPOSITION=${CDR(disposition)}):NoOP(=== CallMeDISPOSITION already was set ===));
}
}
context default {
_X. => {
Hangup();
}
};
context dial_out {
_[1237]XX => {
&recording(${CALLERID(number)},${EXTEN});
Set(__CallIntNum=${CALLERID(num)})
Set(CallStart=${STRFTIME(epoch,,%s)});
Dial(SIP/${EXTEN},,tTr);
Hangup();
}
_11XXX => {
&recording(${CALLERID(number)},${EXTEN});
Set(CallStart=${STRFTIME(epoch,,%s)});
Set(__CallIntNum=${CALLERID(num)});
Dial(SIP/${EXTEN:2}@toOurAster,,t);
Hangup();
}
_. => {
&recording(${CALLERID(number)},${EXTEN});
Set(__CallIntNum=${CALLERID(num)})
Set(CallStart=${STRFTIME(epoch,,%s)});
Dial(SIP/${EXTEN}@toOurAster,,t);
Hangup();
}
h => {
Set(CDR_PROP(disable)=true);
Set(CallStop=${STRFTIME(epoch,,%s)});
Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)});
if(${ISNULL(${CallMeDISPOSITION})}) {
Set(CallMeDISPOSITION=${CDR(disposition)});
}
System(curl -s http://pbx.vistep.ru/CallMeOut.php --data action=sendcall2b24 --data call_id=${CallMeCALL_ID} --data-urlencode FullFname=${FullFname} --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition=${CallMeDISPOSITION});
}
};
Ann kòmanse depi nan konmansman an: direktiv la Global.
Varyab URLRECORDS magazen URL la nan dosye yo anrejistreman konvèsasyon, dapre ki Bitrix24 pral rale yo nan kat la kontak.
Apre sa, nou enterese nan macro macro anrejistreman.
Isit la, anplis anrejistreman konvèsasyon, nou pral mete varyab la FullFname.
Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3);Li estoke URL konplè a nan yon dosye espesifik (yo rele makro a toupatou).
Ann analize apèl sòtan an:
_. => {
&recording(${CALLERID(number)},${EXTEN});
Set(__CallIntNum=${CALLERID(num)})
Set(CallStart=${STRFTIME(epoch,,%s)});
Dial(SIP/${EXTEN}@toOurAster,,t);
Hangup();
}
h => {
Set(CDR_PROP(disable)=true);
Set(CallStop=${STRFTIME(epoch,,%s)});
Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)});
if(${ISNULL(${CallMeDISPOSITION})}) {
Set(CallMeDISPOSITION=${CDR(disposition)});
}
System(curl -s http://pbx.vistep.ru/CallMeOut.php --data action=sendcall2b24 --data call_id=${CallMeCALL_ID} --data-urlencode FullFname=${FullFname} --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition=${CallMeDISPOSITION});
}
Ann di nou rele 89991234567, anvan tout bagay nou rive isit la:
&recording(${CALLERID(number)},${EXTEN});sa yo. Yo rele makro anrejistreman konvèsasyon an epi yo mete varyab ki nesesè yo.
Pli lwen
Set(__CallIntNum=${CALLERID(num)})
Set(CallStart=${STRFTIME(epoch,,%s)});
Nou anrejistre ki moun ki inisye apèl la epi anrejistre lè a kòmanse nan apèl la.
E apre li fini, nan yon kontèks espesyal h
h => {
Set(CDR_PROP(disable)=true);
Set(CallStop=${STRFTIME(epoch,,%s)});
Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)});
if(${ISNULL(${CallMeDISPOSITION})}) {
Set(CallMeDISPOSITION=${CDR(disposition)});
}
System(curl -s http://pbx.vistep.ru/CallMeOut.php --data action=sendcall2b24 --data call_id=${CallMeCALL_ID} --data-urlencode FullFname=${FullFname} --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition=${CallMeDISPOSITION});
}
enfim antre nan tab la CDR pou ekstansyon sa a (li pa nesesè la), mete lè nan fen apèl la, kalkile dire a, si rezilta a nan apèl la pa konnen - mete (varyab CallMeDISPOSITION) epi, dènye etap la, voye tout bagay nan Bitrix atravè sistèm curl la.
Ak yon ti kras plis majik - yon apèl fèk ap rantre:
888999 => {
&recording(${CALLERID(number)},${EXTEN});
Answer();
ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp()); // выставляем CallerID если узнали его у Битрикс24
Set(CallStart=${STRFTIME(epoch,,%s)}); // начинаем отсчет времени звонка
Queue(Q1,tT);
Set(CallMeDISPOSITION=${CDR(disposition)});
Hangup();
}
Isit la nou se sèlman enterese nan yon sèl liy.
ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp());Li di PBX a enstale CallerID(non) egal a varyab CallMeCallerIDName.
Varyab CallMeCallerIDName a li menm, nan vire, se aplikasyon CallMe ki tabli (si Bitrix24 gen yon non konplè pou nimewo moun kap rele a, mete l kòm CallerID(non), non - nou pa pral fè anyen).
Mete kanpe aplikasyon an
Fichye paramèt aplikasyon an - /var/www/pbx.vistep.ru/config.php
Deskripsyon paramèt aplikasyon:
- ReleMeDEBUG — si 1, Lè sa a, tout evènman yo trete pa aplikasyon an pral ekri nan dosye log la, 0 — nou pa ekri anyen
- teknoloji - SIP/PJSIP/IAX/etc
- authToken — Bitrix24 otorizasyon siy, kòd otorizasyon webhook sortan
- bitrixApiUrl - URL nan webhook kap vini an, san pwofil/
- ekstansyon - lis nimewo ekstèn
- kontèks — kontèks pou orijin yon apèl
- listener_timeout — vitès nan pwosesis evènman soti nan asterisk
- asterisk - yon etalaj ki gen paramèt pou konekte ak asterisk la:
- lame - ip oswa non host sèvè asterisk la
- konplo - Dyagram koneksyon (tcp://, tls://)
- pò - pò
- non itilizatè - Non itilizatè
- sekrè - modpas
- konekte_timeout - tan koneksyon
- read_timeout - li timeout
egzanp dosye paramèt:
<?php
return array(
'CallMeDEBUG' => 1, // дебаг сообщения в логе: 1 - пишем, 0 - не пишем
'tech' => 'SIP',
'authToken' => 'xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6', //токен авторизации битрикса
'bitrixApiUrl' => 'https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/', //url к api битрикса (входящий вебхук)
'extentions' => array('888999'), // список внешних номеров, через запятую
'context' => 'dial_out', //исходящий контекст для оригинации звонка
'asterisk' => array( // настройки для подключения к астериску
'host' => '10.100.111.249',
'scheme' => 'tcp://',
'port' => 5038,
'username' => 'callme',
'secret' => 'JD3clEB8_f23r-3ry84gJ',
'connect_timeout' => 10000,
'read_timeout' => 10000
),
'listener_timeout' => 300, //скорость обработки событий от asterisk
);Konfigirasyon sipèvizè
Sipèvizè yo itilize pou lanse pwosesis pou okipe evènman an soti nan Asterisk CallMeIn.php, ki kontwole apèl k ap fèk ap rantre yo epi reyaji avèk Bitrix24 (montre kat, kache kat, elatriye).
Fichye paramèt yo dwe kreye:
/etc/supervisord.d/callme.conf
[program:callme]
command=/usr/bin/php CallMeIn.php
directory=/var/www/pbx.vistep.ru
autostart=true
autorestart=true
startretries=5
stderr_logfile=/var/www/pbx.vistep.ru/logs/daemon.log
stdout_logfile=/var/www/pbx.vistep.ru/logs/daemon.logLanse ak rekòmanse aplikasyon an:
supervisorctl start callme
supervisorctl restart callmeGade estati fonksyònman aplikasyon an:
supervisorctl status callme
callme RUNNING pid 11729, uptime 17 days, 16:58:07Konklizyon
Li te tounen byen konplike, men mwen sèten ke yon administratè ki gen eksperyans yo pral kapab aplike li epi tanpri itilizatè li yo.
Jan te pwomèt la, .
Kesyon, sijesyon - tanpri kite yo nan kòmantè yo. Epitou, si w enterese nan ki jan devlopman nan entegrasyon sa a te ale, ekri, epi nan pwochen atik la mwen pral eseye revele tout bagay an plis detay.
Sous: www.habr.com
