
Vebijarkên cihêreng ji bo yekkirina IP-PBX Asterisk û CRM Bitrix24 li ser torê hene, lê me dîsa jî biryar da ku em ya xwe binivîsin.
Di warê fonksiyonê de, her tişt standard e:
- Bi tikandina girêdanek bi jimareya têlefonê ya xerîdar li Bitrix24, Asterisk jimareya navxweyî ya bikarhênerê ku li ser navê wî klîk hatî çêkirin bi jimara têlefona xerîdar ve girêdide. Di Bitrix24 de, tomarek bangê tê tomar kirin û di dawiya bangê de, tomarek axaftinê tê kişandin.
- Asterisk bangek ji derve distîne - di navbeynkariya Bitrix24 de em qerta xerîdar nîşanî karmendê ku ev bang gihîştiye hejmara wî.
Ger xerîdarek wusa tune be, em ê ji bo afirandina pêşengek nû qertê vekin.
Gava ku bang qediya, em vê yekê li ser qertê nîşan didin û tomarek axaftinê derdixin.
Li binê qulikê ez ê ji we re vebêjim ka meriv çawa her tiştî ji bo xwe saz bike û lînka github-ê bide we - erê, erê, wê bigire û bikar bîne!
Şiroveya giştî
Me gazî entegrasyona xwe kir CallMe. CallMe serîlêdanek piçûk a malperê ye ku bi PHP-ê hatî nivîsandin.
Teknolojî û karûbarên ku têne bikar anîn
- PHP 5.6
- bestekarê
- Nginx + php-fpm
- gûhliser
- AMI (Navenda Gerînendeyê Stêrk)
- Bitrix webhooks (pêkanîna REST API-ya hêsankirî)
pêşdibistanê
Li ser serverek bi Asterisk, hûn hewce ne ku serverek malperê saz bikin (ji bo me ew nginx + php-fpm e), çavdêr û git.
Fermana ji bo sazkirinê (CentOS):
yum install nginx php-fpm supervisor gitEm diçin pelrêça ku gihîştina servera malperê, serîlêdanê ji Git derdixin û mafên pêwîst ên peldankê destnîşan dikin:
cd /var/www
git clone https://github.com/ViStepRU/callme.git
chown nginx. -R callme/
Dûv re, em nginx mîheng bikin, konfigurasyona me tê de ye
/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;
}
}
Ez ê parskirina mîhengê, pirsgirêkên ewlehiyê, bidestxistina sertîfîkayê û tewra hilbijartina serverek webê li derveyî çarçoweya gotarê bihêlim - li ser vê yekê gelek tişt hatine nivîsandin. Serlêdan ti sînordar nîne, ew hem li ser http û hem jî https dixebite.
Em https bikar tînin, werin em sertîfîkayê şîfre bikin.
Ger we her tişt rast kir, wê hingê bi tikandina zencîreyê divê hûn tiştek wusa bibînin

Sazkirina Bitrix24
Werin em du webhook ava bikin.
Webhookê hatî.
Di binê hesabê rêveberê de (bi id 1), rêyê bişopînin: Serlêdan -> Webhook -> Webhook zêde bikin -> Malpera ketinê

Parametreyên webhook-a hatî wekî di dîmenan de dagirin:


Û tomar bike.
Piştî hilanînê, Bitrix24 dê URL-ya webhook-a hatî peyda bike, mînakî:

Guhertoya URL-ya xwe bêyî /profila/ ya dawîn hilînin - ew ê di serîlêdanê de were bikar anîn da ku bi bangên hatinî re bixebite.
Min ev heye https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/
Webhook derçû.
Serlêdan -> Webhook -> Webhook lê zêde bike -> Webhook Derketî
Agahdarî dîsa li ser dîmenan hene:


Koda destûrnameyê hilînin û bistînin

Min ev heye xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Her weha hûn hewce ne ku wê ji bo xwe kopî bikin;
Girîng!
Pêdivî ye ku sertîfîkayek SSL li ser servera Bitrix24 were mîheng kirin (hûn dikarin letsencrypt bikar bînin), wekî din api Bitrix nexebite. Ger we guhertoyek cloudê heye, xem neke - ew jixwe ssl heye.
Girîng!
Di qada "Navnîşana Pêvajoyê" de divê navnîşek ku ji Înternetê tê gihîştin hebe!
Û wekî pêwendiya paşîn, bila em CallMeOut-a xwe wekî serîlêdanek ji bo çêkirina bangan saz bikin (da ku gava hûn li ser hejmarê li ser PBX-ê bikirtînin, emrê ji bo destpêkirina bangê dê bifire).
Di menuyê de, hilbijêrin: Zêdetir -> Têlefonî -> Zêdetir -> Mîhengan, di "Hejmara banga xwerû ya derketinê" de bicîh bikin: CallMeOut û bikirtînin "Save"

Sazkirina stêrkê
Ji bo danûstendina serketî ya di navbera Asterisk û Bitrix24 de, pêdivî ye ku em bangewaziya bikarhênerê AMI li manager.conf zêde bikin:
[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
Dûv re, gelek hîle hene ku dê hewce bike ku bi dialplanê ve werin bicîh kirin (ji bo me ev extensions.ael e).
Ez ê tevahiya pelê pêşkêşî bikim, û paşê ez ê şirove bikim:
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});
}
};
Ka em ji serî de dest pê bikin: dîrektîfa gloverî.
Têgûherr URLRECORDS URL-ya pelên tomarkirina danûstendinê hilîne, li gorî ku Bitrix24 dê wan bikişîne nav qerta têkiliyê.
Piştre em bi makro makro re eleqedar in girtinî.
Li vir, ji bilî tomarkirina danûstandinan, em ê guhêrbar saz bikin FullFname.
Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3);Ew URL-ya tevahî li pelek taybetî hilîne (makro li her derê tê gotin).
Ka em banga derketinê analîz bikin:
_. => {
&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});
}
Ka em bêjin em gazî 89991234567 dikin, berî her tiştî em li vir digihîjin:
&recording(${CALLERID(number)},${EXTEN});ewan. Makroya tomarkirina axaftinê tê gazî kirin û guhêrbarên pêwîst têne danîn.
berdewam
Set(__CallIntNum=${CALLERID(num)})
Set(CallStart=${STRFTIME(epoch,,%s)});
Em kê banga destpêkirinê tomar dikin û dema destpêkirina bangê tomar dikin.
Û piştî qedandina wê, di çarçoveyek taybetî de 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});
}
ketina tabloya CDR-ê ji bo vê dirêjkirinê neçalak bike (ew li wir ne hewce ye), dema dawiya bangê bicîh bikin, demjimêr hesab bikin, heke encama bangê neyê zanîn - danîn (guhêrbar CallMeDISPOSITION) û, gava paşîn, her tiştî ji Bitrix-ê re bi navgîniya pergalê bişînin.
Û hinekî din sêrbaz - bangek gihîştî:
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();
}
Li vir em tenê bi yek rêzê re eleqedar dibin.
ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp());Ew ji PBX re dibêje ku saz bike Nasnameya Bangdêr (nav) wekhev bi guherbar CallMeCallerIDName.
Guherbara CallMeCallerIDName bixwe, ji hêla serîlêdana CallMe ve tê saz kirin (heke Bitrix24 navek tevahî ji bo jimareya telefonker hebe, wê wekî Nasnameya Bangdêr (nav), na - em ê tiştek nekin).
Sazkirina sepanê
Pelê mîhengên serîlêdanê - /var/www/pbx.vistep.ru/config.php
Danasîna parametreyên serîlêdanê:
- CallMeDEBUG - heke 1, wê hingê hemî bûyerên ku ji hêla serîlêdanê ve hatî hilberandin dê li pelê têketinê bêne nivîsandin, 0 - em tiştek nanivîsin
- tech - SIP / PJSIP / IAX / hwd
- authToken - Nîşana destûrnameya Bitrix24, koda destûrnameya webhookê ya derketinê
- bitrixApiUrl - URL-ya webhook-a hatî, bêyî profîlek/
- berfirehkirin - navnîşa hejmarên derveyî
- hevgirêk - çarçoveya ji bo destpêkirina bangekê
- listener_timeout - leza hilanîna bûyerê ji stêrkê
- stêrkok - arrayek bi mîhengên ji bo girêdana stêrkê:
- mazûban - ip an navê mêvandarê servera stêrk
- plana - diyagrama girêdanê (tcp: //, tls: //)
- bender - port
- navê bikarhêner - Navê bikarhêner
- dizî - şîfre
- connect_timeout - dema girêdanê
- read_timeout - wextê xwendinê
Mînak pelê mîhengan:
<?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
);Sazkirina Serpereştyarê
Serpereştyar ji bo destpêkirina pêvajoya birêvebirê bûyerê ji Asterisk CallMeIn.php tê bikar anîn, ku bangên hatinê dişopîne û bi Bitrix24 re têkildar dibe (qertê nîşan bide, qerta veşêre, hwd.).
Pelê mîhengan ku were çêkirin:
/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.logSerîlêdanê dest pê bikin û ji nû ve bidin destpêkirin:
supervisorctl start callme
supervisorctl restart callmeDîtina rewşa xebatê ya serîlêdanê:
supervisorctl status callme
callme RUNNING pid 11729, uptime 17 days, 16:58:07encamê
Derket holê ku ew pir tevlihev e, lê ez pê bawer im ku rêveberek pispor dê bikaribe wê bicîh bîne û bikarhênerên xwe xweş bike.
Wek ku soz dabû, .
Pirs, pêşniyar - ji kerema xwe wan di şîroveyan de bihêlin. Di heman demê de, heke hûn bala we dikişînin ka pêşkeftina vê entegrasyonê çawa çû, binivîsin, û di gotara pêş de ez ê hewl bidim ku her tiştî bi hûrgulî eşkere bikim.
Source: www.habr.com
