Pag-unawa sa FreePBX at pagsasama nito sa Bitrix24 at higit pa

Bitrix24 ay isang malaking combine na pinagsasama ang CRM, workflow, accounting at marami pang ibang bagay na talagang gusto ng mga manager at hindi talaga gusto ng mga IT staff. Ang portal ay ginagamit ng maraming maliliit at katamtamang laki ng mga kumpanya, kabilang ang mga maliliit na klinika, mga tagagawa at kahit na mga beauty salon. Ang pangunahing function na "mahal" ng mga manager ay ang pagsasama ng telephony at CRM, kapag ang anumang tawag ay agad na naitala sa CRM, ang mga client card ay nilikha, kapag papasok, ang impormasyon tungkol sa kliyente ay ipinapakita at makikita mo kaagad kung sino siya, kung ano siya. kayang ibenta at magkano ang utang niya. Ngunit ang telephony mula sa Bitrix24 at ang pagsasama nito sa CRM ay nagkakahalaga ng pera, kung minsan ay malaki. Sa artikulong sasabihin ko sa iyo ang karanasan ng pagsasama sa mga bukas na tool at ang sikat na IP PBX LibrengPBX, at isaalang-alang din ang lohika ng gawain ng iba't ibang bahagi

Nagtatrabaho ako bilang isang outsourcer sa isang kumpanyang nagbebenta at nagko-configure, nagsasama ng IP telephony. Nang tanungin ako kung maaari kaming mag-alok ng isang bagay dito at sa kumpanyang ito upang isama ang Bitrix24 sa mga PBX na mayroon ang mga customer, pati na rin sa mga virtual na PBX sa iba't ibang kumpanya ng VDS, pumunta ako sa Google. At syempre binigyan niya ako ng link artikulo sa habr, kung saan mayroong isang paglalarawan, at github, at tila gumagana ang lahat. Ngunit nang subukang gamitin ang solusyon na ito, lumabas na ang Bitrix24 ay hindi na katulad ng dati, at marami ang kailangang gawing muli. Bilang karagdagan, ang FreePBX ay hindi isang hubad na asterisk para sa iyo, dito kailangan mong isipin kung paano pagsamahin ang kadalian ng paggamit at isang hardcore dialplan sa mga config file.

Pinag-aaralan namin ang lohika ng trabaho

Kaya para sa mga nagsisimula, kung paano dapat gumana ang lahat. Kapag may natanggap na tawag mula sa labas sa PBX (SIP INVITE event mula sa provider), magsisimula ang pagpoproseso ng dialplan (dial plan, dialplan) - ang mga alituntunin kung ano at sa anong pagkakasunud-sunod ang gagawin sa tawag. Mula sa unang packet, maaari kang makakuha ng maraming impormasyon, na maaaring magamit sa mga patakaran. Ang isang mahusay na tool para sa pag-aaral ng internals ng SIP ay ang analyzer sngrep (link) na naka-install lamang sa mga sikat na distribusyon sa pamamagitan ng apt install/yum install at iba pa, ngunit maaari rin itong itayo mula sa pinagmulan. Tingnan natin ang call log in sngrep

Pag-unawa sa FreePBX at pagsasama nito sa Bitrix24 at higit pa

Sa isang pinasimpleng anyo, ang dialplan ay tumatalakay lamang sa unang packet, minsan din sa panahon ng pag-uusap, ang mga tawag ay inililipat, mga pagpindot sa pindutan (DTMF), iba't ibang mga kagiliw-giliw na bagay tulad ng FollowMe, RingGroup, IVR at iba pa.

Ano ang nasa loob ng Invite Pack

Pag-unawa sa FreePBX at pagsasama nito sa Bitrix24 at higit pa

Sa totoo lang, gumagana ang karamihan sa mga simpleng dialplan sa unang dalawang field, at ang buong logic ay umiikot sa DID at CallerID. DID - kung saan kami tumatawag, CallerID - na tumatawag.

Ngunit pagkatapos ng lahat, mayroon kaming isang kumpanya at hindi isang telepono - na nangangahulugan na ang PBX ay malamang na may mga grupo ng tawag (sabay-sabay / magkakasunod na pag-ring ng ilang mga aparato) sa mga numero ng lungsod (Ring Group), IVR (Kumusta, tumawag ka ... Pindutin ang isa para sa ...), Mga answering machine ( Mga Parirala), Kondisyon ng Oras, Pagpasa sa ibang mga numero o sa isang cell (FollowMe, Forward). Nangangahulugan ito na napakahirap na malinaw na matukoy kung sino ang aktwal na tatanggap ng isang tawag at kung sino ang makikipag-usap kapag dumating ang isang tawag. Narito ang isang halimbawa ng simula ng isang karaniwang tawag sa PBX ng aming mga kliyente

Pag-unawa sa FreePBX at pagsasama nito sa Bitrix24 at higit pa

Matapos matagumpay na makapasok ang tawag sa PBX, naglalakbay ito sa dialplan sa iba't ibang "konteksto". Ang konteksto mula sa punto ng view ng Asterisk ay isang may bilang na hanay ng mga utos, na ang bawat isa ay naglalaman ng isang filter ayon sa na-dial na numero (ito ay tinatawag na exten, para sa isang panlabas na tawag sa unang yugto exten=DID). Ang mga utos sa linya ng dialplan ay maaaring anuman - mga panloob na function (halimbawa, tumawag sa isang panloob na subscriber - Dial(), ibaba ang telepono - Hangup()), conditional operator (IF, ELSE, ExecIF at mga katulad nito), mga paglipat sa iba pang mga panuntunan ng kontekstong ito (Goto, GotoIF), paglipat sa iba pang mga konteksto sa anyo ng isang function na tawag (Gosub, Macro). Isang hiwalay na direktiba include имя_контекста, na nagdaragdag ng mga utos mula sa isa pang konteksto hanggang sa dulo ng kasalukuyang konteksto. Ang mga utos na kasama sa pamamagitan ng pagsasama ay palaging isinasagawa pagkatapos mga utos ng kasalukuyang konteksto.

Ang buong lohika ng FreePBX ay binuo sa pagsasama ng iba't ibang konteksto sa isa't isa sa pamamagitan ng pagsasama at pagtawag sa pamamagitan ng mga humahawak ng Gosub, Macro at Handler. Isaalang-alang ang konteksto ng mga papasok na tawag sa FreePBX

Pag-unawa sa FreePBX at pagsasama nito sa Bitrix24 at higit pa

Ang tawag ay dumadaan sa lahat ng mga konteksto mula sa itaas hanggang sa ibaba, sa bawat konteksto ay maaaring mayroong mga tawag sa iba pang mga konteksto tulad ng mga macro (Macro), mga function (Gosub) o mga transition lamang (Goto), kaya ang tunay na puno ng tinatawag ay maaari lamang masubaybayan sa mga tala.

Ang isang tipikal na setup diagram para sa isang tipikal na PBX ay ipinapakita sa ibaba. Kapag tumatawag, hinanap ang DID sa mga papasok na ruta, sinusuri ito ng mga pansamantalang kundisyon, kung maayos ang lahat, inilunsad ang menu ng boses. Mula dito, sa pamamagitan ng pagpindot sa button 1 o timeout, lumabas sa grupo ng mga operator ng pagdayal. Pagkatapos ng tawag, tatawagin ang hangupcall macro, pagkatapos nito ay wala nang magagawa sa dialplan, maliban sa mga espesyal na handler (hangup handler).

Pag-unawa sa FreePBX at pagsasama nito sa Bitrix24 at higit pa

Saan sa algorithm ng tawag na ito kami dapat magbigay ng impormasyon tungkol sa simula ng tawag sa CRM, kung saan magsisimulang mag-record, kung saan tatapusin ang pag-record at ipadala ito kasama ng impormasyon tungkol sa tawag sa CRM?

Pagsasama sa mga panlabas na sistema

Ano ang PBX at CRM integration? Ito ang mga setting at program na nagko-convert ng data at mga kaganapan sa pagitan ng dalawang platform na ito at ipinapadala ang mga ito sa isa't isa. Ang pinakakaraniwang paraan para makipag-usap ang mga independiyenteng system ay sa pamamagitan ng mga API, at ang pinakasikat na paraan para ma-access ang mga API ay HTTP REST. Ngunit hindi para sa asterisk.

Sa loob ng Asterisk ay:

  • AGI - sabay-sabay na tawag sa mga panlabas na programa / bahagi, pangunahing ginagamit sa dialplan, mayroong mga aklatan tulad ng phpagi, PAGI

  • AMI - isang text TCP socket na gumagana sa prinsipyo ng pag-subscribe sa mga kaganapan at pagpasok ng mga text command, kahawig ng SMTP mula sa loob, maaaring subaybayan ang mga kaganapan at pamahalaan ang mga tawag, mayroong isang library PAMI - ang pinakasikat para sa paglikha ng isang koneksyon sa Asterisk

Halimbawa ng output ng AMI

Kaganapan: Bagong channel
Pribilehiyo: tawag, lahat
Channel: PJSIP/VMS_pjsip-0000078b
Estado ng Channel: 4
ChannelStateDesc: Ring
CallerIDNum: 111222
CallerIDName: 111222
ConnectedLineNum:
nakakonektang linename:
Wika: en
Code ng account:
Konteksto: mula sa-pstn
Exten: s
Priyoridad: 1
Natatanging: 1599589046.5244
Linkedid: 1599589046.5244

  • Ang ARI ay pinaghalong pareho, lahat sa pamamagitan ng REST, WebSocket, sa JSON na format - ngunit may mga sariwang library at wrapper, hindi masyadong maganda, nahanap kaagad (phparia, phpari) na naging sa kanilang pag-unlad mga 3 taon na ang nakakaraan.

Halimbawa ng ARI output kapag ang isang tawag ay sinimulan

{ "variable":"CallMeCallerIDName", "value":"111222", "type":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "channel":{ "id »:»1599644315.5334″, «pangalan»:»PJSIP/VMSpjsip-000007b6″, "state":"Ring", "caller":{ "name":"111222″, "number":"111222″ }, "connected":{ "name":"", "number" :"" }, "accountcode":"", "dialplan":{ "context":"from-pstn", "exten":"s", "priority":2, "appname":"Stasis", "appdata":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "wika":"en" }, "asteriskid":"48:5b:aa:aa:aa:aa", "application":"hello-world" }

Ang kaginhawahan o abala, ang posibilidad o imposibilidad ng pagtatrabaho sa isang partikular na API ay tinutukoy ng mga gawaing kailangang lutasin. Ang mga gawain para sa pagsasama sa CRM ay ang mga sumusunod:

  • Subaybayan ang simula ng tawag, kung saan ito inilipat, bunutin ang CallerID, DID, oras ng pagsisimula at pagtatapos, maaaring data mula sa direktoryo (upang maghanap ng koneksyon sa pagitan ng telepono at ng gumagamit ng CRM)

  • Simulan at tapusin ang pag-record ng tawag, i-save ito sa nais na format, ipaalam sa dulo ng pag-record kung saan matatagpuan ang file

  • Magsimula ng isang tawag sa isang panlabas na kaganapan (mula sa programa), tumawag sa isang panloob na numero, isang panlabas na numero at ikonekta ang mga ito

  • Opsyonal: isama sa CRM, dialer group at FollowME para sa awtomatikong paglilipat ng mga tawag sa kawalan ng isang lugar (ayon sa CRM)

Ang lahat ng mga gawaing ito ay maaaring malutas sa pamamagitan ng AMI o ARI, ngunit ang ARI ay nagbibigay ng mas kaunting impormasyon, walang maraming mga kaganapan, maraming mga variable na mayroon pa rin ang AMI (halimbawa, mga macro na tawag, pagtatakda ng mga variable sa loob ng mga macro, kabilang ang pag-record ng tawag) ay hindi sinusubaybayan. Samakatuwid, para sa tama at tumpak na pagsubaybay, piliin natin ang AMI sa ngayon (ngunit hindi ganap). Bilang karagdagan (well, saan ito kung wala ito, kami ay mga tamad na tao) - sa orihinal na gawain (artikulo sa habr) gumamit ng PAMI. *Pagkatapos ay kailangan mong subukang muling isulat sa ARI, ngunit hindi ang katotohanang gagana ito.

Reinventing integration

Upang makapag-ulat ang aming FreePBX sa AMI sa mga simpleng paraan tungkol sa simula ng tawag, oras ng pagtatapos, mga numero, pangalan ng mga naitala na file, pinakamadaling kalkulahin ang tagal ng tawag gamit ang parehong trick gaya ng mga orihinal na may-akda. - ipasok ang iyong mga variable at i-parse ang output para sa kanilang presensya. Iminumungkahi ng PAMI na gawin ito sa pamamagitan lamang ng isang function ng filter.

Narito ang isang halimbawa ng pagtatakda ng sarili mong variable para sa oras ng pagsisimula ng tawag (s ay isang espesyal na numero sa dialplan na ginagawa BAGO simulan ang DID search)

[ext-did-custom]

exten => s,1,Set(CallStart=${STRFTIME(epoch,,%s)})

Isang halimbawang kaganapan ng AMI para sa linyang ito

Kaganapan: Bagong channel

Pribilehiyo: tawag, lahat

Channel: PJSIP/VMS_pjsip-0000078b

Estado ng Channel: 4

ChannelStateDesc: Ring

CallerIDNum: 111222

CallerIDName: 111222

ConnectedLineNum:

nakakonektang linename:

Wika: en

Code ng account:

Konteksto: mula sa-pstn

Exten: s

Priyoridad: 1

Natatanging: 1599589046.5244

Linkedid: 1599589046.5244

Application: Itakda ang AppData:

CallStart=1599571046

Dahil pinapatungan ng FreePBX ang extention.conf at extention_ fileadditional.conf, gagamitin namin ang file extension_pasadya.conf

Buong code ng extention_custom.conf

[globals]	
;; Проверьте пути и права на папки - юзер asterisk должен иметь права на запись
;; Сюда будет писаться разговоры
WAV=/var/www/html/callme/records/wav 
MP3=/var/www/html/callme/records/mp3

;; По этим путям будет воспроизводится и скачиваться запись
URLRECORDS=https://www.host.ru/callmeplus/records/mp3

;; Адрес для калбека при исходящем вызове
URLPHP=https://www.host.ru/callmeplus

;; Да пишем разговоры
RECORDING=1

;; Это макрос для записи разговоров в нашу папку. 
;; Можно использовать и системную запись, но пока пусть будет эта - 
;; она работает
[recording]
exten => ~~s~~,1,Set(LOCAL(calling)=${ARG1})
exten => ~~s~~,2,Set(LOCAL(called)=${ARG2})
exten => ~~s~~,3,GotoIf($["${RECORDING}" = "1"]?4:14)
exten => ~~s~~,4,Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called})
exten => ~~s~~,5,Set(datedir=${STRFTIME(${EPOCH},,%Y/%m/%d)})
exten => ~~s~~,6,System(mkdir -p ${MP3}/${datedir})
exten => ~~s~~,7,System(mkdir -p ${WAV}/${datedir})
exten => ~~s~~,8,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")
exten => ~~s~~,9,Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3)
exten => ~~s~~,10,Set(CDR(filename)=${fname}.mp3)
exten => ~~s~~,11,Set(CDR(recordingfile)=${fname}.wav)
exten => ~~s~~,12,Set(CDR(realdst)=${called})
exten => ~~s~~,13,MixMonitor(${WAV}/${datedir}/${fname}.wav,b,${monopt})
exten => ~~s~~,14,NoOp(Finish if_recording_1)
exten => ~~s~~,15,Return()


;; Это основной контекст для начала разговора
[ext-did-custom]

;; Это хулиганство, делать это так и здесь, но работает - добавляем к номеру '8'
exten =>  s,1,Set(CALLERID(num)=8${CALLERID(num)})

;; Тут всякие переменные для скрипта
exten =>  s,n,Gosub(recording,~~s~~,1(${CALLERID(number)},${EXTEN}))
exten =>  s,n,ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp())
exten =>  s,n,Set(CallStart=${STRFTIME(epoch,,%s)})
exten =>  s,n,Set(CallMeDISPOSITION=${CDR(disposition)})

;; Самое главное! Обработчик окончания разговора. 
;; Обычные пути обработки конца через (exten=>h,1,чтототут) в FreePBX не работают - Macro(hangupcall,) все портит. 
;; Поэтому вешаем Hangup_Handler на окончание звонка
exten => s,n,Set(CHANNEL(hangup_handler_push)=sub-call-from-cid-ended,s,1(${CALLERID(num)},${EXTEN}))

;; Обработчик окончания входящего вызова
[sub-call-from-cid-ended]

;; Сообщаем о значениях при конце звонка
exten => s,1,Set(CDR_PROP(disable)=true)
exten => s,n,Set(CallStop=${STRFTIME(epoch,,%s)})
exten => s,n,Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)})

;; Статус вызова - Ответ, не ответ...
exten => s,n,Set(CallMeDISPOSITION=${CDR(disposition)})
exten => s,n,Return


;; Обработчик исходящих вызовов - все аналогичено
[outbound-allroutes-custom]

;; Запись
exten => _.,1,Gosub(recording,~~s~~,1(${CALLERID(number)},${EXTEN}))
;; Переменные
exten => _.,n,Set(__CallIntNum=${CALLERID(num)})
exten => _.,n,Set(CallExtNum=${EXTEN})
exten => _.,n,Set(CallStart=${STRFTIME(epoch,,%s)})
exten => _.,n,Set(CallmeCALLID=${SIPCALLID})

;; Вешаем Hangup_Handler на окончание звонка
exten => _.,n,Set(CHANNEL(hangup_handler_push)=sub-call-internal-ended,s,1(${CALLERID(num)},${EXTEN}))

;; Обработчик окончания исходящего вызова
[sub-call-internal-ended]

;; переменные
exten => s,1,Set(CDR_PROP(disable)=true)
exten => s,n,Set(CallStop=${STRFTIME(epoch,,%s)})
exten => s,n,Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)})
exten => s,n,Set(CallMeDISPOSITION=${CDR(disposition)})

;; Вызов скрипта, который сообщит о звонке в CRM - это исходящий, 
;; так что по факту окончания
exten => s,n,System(curl -s ${URLPHP}/CallMeOut.php --data action=sendcall2b24 --data ExtNum=${CallExtNum} --data call_id=${SIPCALLID} --data-urlencode FullFname='${FullFname}' --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition='${CallMeDISPOSITION}')
exten => s,n,Return

Tampok at pagkakaiba mula sa orihinal na dialplan ng mga may-akda ng orihinal na artikulo -

  • Dialplan sa .conf na format, gaya ng gusto ng FreePBX (oo, maaari itong .ael, ngunit hindi lahat ng bersyon at hindi ito palaging maginhawa)

  • Sa halip na iproseso ang dulo sa pamamagitan ng exten=>h, ang pagproseso ay ipinakilala sa pamamagitan ng hangup_handler, dahil ang FreePBX dialplan ay gumagana lamang dito

  • Inayos ang string ng tawag sa script, idinagdag ang mga quote at external na numero ng tawag na ExtNum

  • Ang pagproseso ay inilipat sa _custom na konteksto at nagbibigay-daan sa iyong huwag hawakan o i-edit ang mga FreePBX config - papasok sa pamamagitan ng [ext-did-custom], papalabas sa pamamagitan ng [outbound-lahat ng mga ruta-pasadya]

  • Walang pagbubuklod sa mga numero - ang file ay pangkalahatan at kailangan lang i-configure para sa landas at link sa server

Upang makapagsimula, kailangan mo ring magpatakbo ng mga script sa AMI sa pamamagitan ng pag-login at password - para dito, mayroon ding _custom file ang FreePBX

manager_custom.conf file

;;  это логин
[callmeplus]
;; это пароль
secret = trampampamturlala
deny = 0.0.0.0/0.0.0.0

;; я работаю с локальной машиной - но если надо, можно и другие прописать
permit = 127.0.0.1/255.255.255.255
read = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan
write = system,call,agent,log,verbose,user,config,command,reporting,originate

Ang parehong mga file na ito ay dapat ilagay sa /etc/asterisk, pagkatapos ay muling basahin ang mga config (o i-restart ang asterisk)

# astrisk -rv
  Connected to Asterisk 16.6.2 currently running on freepbx (pid = 31629)
#freepbx*CLI> dialplan reload
     Dialplan reloaded.
#freepbx*CLI> exit

Ngayon ay lumipat tayo sa PHP

Pagsisimula ng mga script at paggawa ng serbisyo

Dahil ang pamamaraan para sa pagtatrabaho sa Bitrix 24, isang serbisyo para sa AMI, ay hindi ganap na simple at transparent, dapat itong talakayin nang hiwalay. Asterisk, kapag na-activate ang AMI, bubuksan lang ang port at iyon na. Kapag sumali ang isang kliyente, humihiling ito ng pahintulot, pagkatapos ay mag-subscribe ang kliyente sa mga kinakailangang kaganapan. Ang mga kaganapan ay nasa plain text, na kung saan ang PAMI ay nagko-convert sa mga structured na bagay at nagbibigay ng kakayahang itakda ang pag-filter ng function para lamang sa mga kaganapan ng interes, mga field, numero, atbp.

Sa sandaling pumasok ang tawag, papaganahin ang kaganapang NewExten simula sa konteksto ng magulang [from-pstn], pagkatapos ay mapupunta ang lahat ng kaganapan sa pagkakasunud-sunod ng mga linya sa mga konteksto. Kapag natanggap ang impormasyon mula sa mga variable ng CallMeCallerIDName at CallStart na tinukoy sa _custom dialplan, ang

  1. Ang function ng paghiling ng UserID na naaayon sa extension number kung saan dumating ang tawag. Paano kung ito ay isang dial-up na grupo? Ang tanong ay pampulitika, kailangan mo bang gumawa ng isang tawag sa lahat nang sabay-sabay (kapag ang lahat ay tumatawag nang sabay-sabay) o lumikha habang sila ay tumatawag kapag tumatawag sa turn? Karamihan sa mga kliyente ay may Fisrt Available na diskarte, kaya walang problema dito, isang tawag lang. Ngunit ang isyu ay kailangang malutas.

  2. Ang function ng pagpaparehistro ng tawag sa Bitrix24, na nagbabalik ng CallID, na pagkatapos ay kinakailangan upang iulat ang mga parameter ng tawag at isang link sa pag-record. Nangangailangan ng alinman sa numero ng extension o UserID

Pag-unawa sa FreePBX at pagsasama nito sa Bitrix24 at higit pa

Pagkatapos ng tawag, tatawagin ang function ng pag-download ng record, na sabay-sabay na nag-uulat ng katayuan ng pagkumpleto ng tawag (Abala, Walang sagot, Tagumpay), at nagda-download din ng link sa mp3 file na may record (kung mayroon man).

Dahil kailangang patuloy na tumakbo ang module ng CallMeIn.php, isang SystemD startup file ang ginawa para dito callme.service, na dapat ilagay sa /etc/systemd/system/callme.service

[Unit]
Description=CallMe

[Service]
WorkingDirectory=/var/www/html/callmeplus
ExecStart=/usr/bin/php /var/www/html/callmeplus/CallMeIn.php 2>&1 >>/var/log/callmeplus.log
ExecStop=/bin/kill -WINCH ${MAINPID}
KillSignal=SIGKILL

Restart=on-failure
RestartSec=10s

#тут надо смотреть,какие права на папки
#User=www-data  #Ubuntu - debian
#User=nginx #Centos

[Install]
WantedBy=multi-user.target

Ang pagsisimula at paglulunsad ng script ay nangyayari sa pamamagitan ng systemctl o serbisyo

# systemctl enable callme
# systemctl start callme

Ang serbisyo ay magsisimulang muli kung kinakailangan (sa kaso ng mga pag-crash). Ang serbisyo sa pagsubaybay sa inbox ay hindi nangangailangan ng isang web server upang mai-install, php lamang ang kailangan (na tiyak na nasa FeePBX server). Ngunit sa kawalan ng pag-access sa mga talaan ng tawag sa pamamagitan ng Web server (kasama rin ang https), hindi posible na makinig sa mga talaan ng tawag.

Ngayon ay pag-usapan natin ang tungkol sa mga papalabas na tawag. Ang CallMeOut.php script ay may dalawang function:

  • Pagsisimula ng isang tawag kapag ang isang kahilingan ay natanggap para sa isang php script (kabilang ang paggamit ng "Tawag" na buton sa mismong Bitrix). Hindi ito gumagana nang walang web server, ang kahilingan ay natanggap sa pamamagitan ng HTTP POST, ang kahilingan ay naglalaman ng isang token

  • Mensahe tungkol sa tawag, mga parameter at tala nito sa Bitrix. Pinagana ng Asterisk sa dialplan na [sub-call-internal-ended] kapag natapos ang isang tawag

Pag-unawa sa FreePBX at pagsasama nito sa Bitrix24 at higit pa

Ang web server ay kailangan lamang para sa dalawang bagay - pag-download ng mga file ng tala ng Bitrix (sa pamamagitan ng HTTPS) at pagtawag sa CallMeOut.php script. Maaari mong gamitin ang built-in na FreePBX server, ang mga file kung saan ay /var/www/html, maaari kang mag-install ng isa pang server o tumukoy ng ibang landas.

Web server

Iwanan natin ang setup ng web server para sa malayang pag-aaral (tyts, tyts, tyts). Kung wala kang domain, maaari mong subukan ang FreeDomain( https://www.freenom.com/ru/index.html), na magbibigay sa iyo ng isang libreng pangalan para sa iyong puting IP (huwag kalimutang ipasa ang mga port 80, 443 sa pamamagitan ng router kung ang panlabas na address ay nasa lamang nito). Kung kakagawa mo lang ng DNS domain, kailangan mong maghintay (mula 15 minuto hanggang 48 oras) hanggang sa ma-load ang lahat ng server. Ayon sa karanasan ng pakikipagtulungan sa mga domestic provider - mula 1 oras hanggang isang araw.

Automation ng pag-install

Ang isang installer ay binuo sa github upang gawing mas madali ang pag-install. Ngunit ito ay makinis sa papel - habang ini-install namin ang lahat ng ito nang manu-mano, dahil pagkatapos ng pag-usisa sa lahat ng ito ay naging malinaw kung ano ang mga kaibigan kung kanino, kung saan pupunta at kung paano i-debug ito. Wala pang installer

Manggagawa sa pantalan

Kung nais mong mabilis na subukan ang solusyon - mayroong isang pagpipilian sa Docker - mabilis na lumikha ng isang lalagyan, bigyan ito ng mga port sa labas, i-slip ang mga file ng mga setting at subukan (ito ang pagpipilian sa lalagyan ng LetsEncrypt, kung mayroon ka nang sertipiko , kailangan mo lang i-redirect ang reverse proxy sa FreePBX web server (binigyan namin ito ng isa pang port ay 88), LetsEncrypt sa docker batay sa ng artikulong ito

Kailangan mong patakbuhin ang file sa na-download na folder ng proyekto (pagkatapos ng git clone), ngunit pumunta muna sa mga config ng asterisk (folder ng asterisk) at isulat ang mga landas sa mga talaan at ang URL ng iyong site doon

version: '3.3'
services:
  nginx:
    image: nginx:1.15-alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/ssl_docker.conf:/etc/nginx/conf.d/ssl_docker.conf
  certbot:
    image: certbot/certbot
  freepbx:
    image: flaviostutz/freepbx
    ports:
      - 88:80 # для настройки
      - 5060:5060/udp
      - 5160:5160/udp
      - 127.0.0.1:5038:5038 # для CallMeOut.php
#      - 3306:3306
      - 18000-18100:18000-18100/udp
    restart: always
    environment:
      - ADMIN_PASSWORD=admin123
    volumes:
      - backup:/backup
      - recordings:/var/spool/asterisk/monitor
      - ./callme:/var/www/html/callme
      - ./systemd/callme.service:/etc/systemd/system/callme.conf
      - ./asterisk/manager_custom.conf:/etc/asterisk/manager_custom.conf
      - ./asterisk/extensions_custom.conf:/etc/asterisk/extensions_custom.conf
#      - ./conf/startup.sh:/startup.sh

volumes:
  backup:
  recordings:

Ang docker-compose.yaml file na ito ay pinapatakbo sa pamamagitan ng

docker-compose up -d

Kung hindi magsisimula ang nginx, may mali sa pagsasaayos sa folder ng nginx/ssl_docker.conf

Iba pang mga pagsasama

At bakit hindi maglagay ng ilang CRM sa mga script nang sabay, naisip namin. Nag-aral kami ng ilang iba pang CRM API, lalo na ang libreng built-in na PBX - ShugarCRM at Vtiger, at oo! oo, pareho ang prinsipyo. Ngunit ito ay isa pang kuwento, na kung saan ay i-upload namin sa github nang hiwalay.

sanggunian

Disclaimer: Anumang pagkakahawig sa realidad ay kathang-isip lamang at hindi ako iyon.

Pinagmulan: www.habr.com

Magdagdag ng komento