Hiểu FreePBX và tích hợp nó với Bitrix24 và hơn thế nữa

Bitrix24 là một tổ hợp khổng lồ kết hợp CRM, quy trình làm việc, kế toán và nhiều thứ khác mà các nhà quản lý thực sự thích và nhân viên CNTT không thực sự thích. Cổng thông tin này được sử dụng bởi rất nhiều công ty vừa và nhỏ, bao gồm các phòng khám nhỏ, nhà sản xuất và thậm chí cả thẩm mỹ viện. Chức năng chính mà các nhà quản lý “yêu thích” là tích hợp giữa điện thoại và CRM, khi bất kỳ cuộc gọi nào được ghi lại ngay lập tức trong CRM, thẻ khách hàng được tạo, khi đến, thông tin về khách hàng được hiển thị và bạn có thể biết ngay anh ta là ai, anh ta là gì có thể bán và anh ta nợ bao nhiêu. Nhưng điện thoại từ Bitrix24 và việc tích hợp nó với CRM tốn tiền, đôi khi rất nhiều. Trong bài viết mình sẽ mách các bạn kinh nghiệm tích hợp với các open tools và IP PBX phổ biến tổng đài miễn phí, và cũng xem xét logic công việc của các bộ phận khác nhau

Tôi làm nhân viên gia công trong một công ty bán và cấu hình, tích hợp điện thoại IP. Khi tôi được hỏi liệu chúng tôi có thể cung cấp điều gì đó cho công ty này để tích hợp Bitrix24 với các tổng đài mà khách hàng có, cũng như với các tổng đài ảo trên các công ty VDS khác nhau, tôi đã tìm đến Google. Và tất nhiên anh ấy đã cho tôi một liên kết đến bài viết trong habr, nơi có mô tả và github, và mọi thứ dường như hoạt động. Nhưng khi thử sử dụng giải pháp này, hóa ra Bitrix24 không còn như trước và cần phải làm lại nhiều. Ngoài ra, FreePBX không phải là dấu hoa thị dành cho bạn, ở đây bạn cần suy nghĩ về cách kết hợp tính dễ sử dụng và sơ đồ quay số khó trong các tệp cấu hình.

Chúng tôi nghiên cứu logic của công việc

Vì vậy, đối với những người mới bắt đầu, tất cả sẽ hoạt động như thế nào. Khi nhận được cuộc gọi từ bên ngoài PBX (sự kiện SIP INVITE từ nhà cung cấp), quá trình xử lý kế hoạch quay số (kế hoạch quay số, kế hoạch quay số) bắt đầu - quy tắc về những gì và thứ tự thực hiện với cuộc gọi. Từ gói đầu tiên, bạn có thể nhận được rất nhiều thông tin, sau đó có thể được sử dụng trong các quy tắc. Một công cụ tuyệt vời để nghiên cứu nội bộ của SIP là máy phân tích sngrep (liên kết) được cài đặt đơn giản trong các bản phân phối phổ biến thông qua apt install/yum install và tương tự, nhưng nó cũng có thể được tạo từ nguồn. Hãy xem nhật ký cuộc gọi trong sngrep

Hiểu FreePBX và tích hợp nó với Bitrix24 và hơn thế nữa

Ở dạng đơn giản hóa, kế hoạch quay số chỉ xử lý gói đầu tiên, đôi khi cũng trong khi trò chuyện, chuyển cuộc gọi, nhấn nút (DTMF), nhiều thứ thú vị khác như FollowMe, RingGroup, IVR, v.v.

Có gì bên trong Gói mời

Hiểu FreePBX và tích hợp nó với Bitrix24 và hơn thế nữa

Trên thực tế, hầu hết các kế hoạch quay số đơn giản đều hoạt động với hai trường đầu tiên và toàn bộ logic xoay quanh DID và CallerID. DID - nơi chúng tôi đang gọi, CallerID - người đang gọi.

Nhưng xét cho cùng, chúng tôi có một công ty chứ không phải một điện thoại - có nghĩa là tổng đài rất có thể có các nhóm cuộc gọi (đổ chuông đồng thời / liên tiếp của một số thiết bị) theo số thành phố (Nhóm đổ chuông), IVR (Xin chào, bạn đã gọi ... Nhấn một cho ...), Máy trả lời ( Cụm từ), Điều kiện thời gian, Chuyển tiếp tới các số khác hoặc tới một ô (FollowMe, Forward). Điều này có nghĩa là rất khó xác định rõ ràng ai sẽ thực sự nhận cuộc gọi và ai sẽ trò chuyện với ai khi có cuộc gọi đến. Đây là một ví dụ về sự bắt đầu của một cuộc gọi điển hình trong PBX của khách hàng của chúng tôi

Hiểu FreePBX và tích hợp nó với Bitrix24 và hơn thế nữa

Sau khi cuộc gọi vào PBX thành công, nó sẽ đi qua dialplan trong các "ngữ cảnh" khác nhau. Bối cảnh theo quan điểm của Asterisk là một tập hợp các lệnh được đánh số, mỗi lệnh chứa một bộ lọc theo số đã gọi (nó được gọi là exten, dành cho lệnh gọi bên ngoài ở giai đoạn ban đầu exten=DID). Các lệnh trong dòng dialplan có thể là bất kỳ thứ gì - các chức năng nội bộ (ví dụ: gọi một thuê bao nội bộ - Dial(), đặt điện thoại xuống - Hangup()), toán tử điều kiện (IF, ELSE, ExecIF và tương tự), chuyển sang các quy tắc khác của bối cảnh này (Goto, GotoIF), chuyển đổi sang các ngữ cảnh khác dưới dạng gọi hàm (Gosub, Macro). Chỉ thị riêng include имя_контекста, trong đó thêm các lệnh từ ngữ cảnh khác vào cuối ngữ cảnh hiện tại. Các lệnh được bao gồm thông qua bao gồm luôn được thực thi sau khi các lệnh của bối cảnh hiện tại.

Toàn bộ logic của FreePBX được xây dựng dựa trên việc đưa các ngữ cảnh khác nhau vào với nhau thông qua các trình xử lý bao gồm và gọi thông qua Gosub, Macro và Handler. Xem xét bối cảnh của các cuộc gọi FreePBX đến

Hiểu FreePBX và tích hợp nó với Bitrix24 và hơn thế nữa

Lời gọi lần lượt đi qua tất cả các context từ trên xuống dưới, trong mỗi context có thể gọi đến các context khác như macro (Macro), hàm (Gosub) hay chỉ chuyển cảnh (Goto) nên cây thực sự của cái được gọi chỉ có thể là được theo dõi trong nhật ký.

Một sơ đồ thiết lập điển hình cho một PBX điển hình được hiển thị bên dưới. Khi gọi, DID được tìm kiếm trong các tuyến đường đến, các điều kiện tạm thời được kiểm tra cho nó, nếu mọi thứ theo thứ tự, menu thoại sẽ được khởi chạy. Từ đó, bằng cách nhấn nút 1 hoặc hết thời gian chờ, thoát vào nhóm các nhà khai thác quay số. Sau khi cuộc gọi kết thúc, macro hangupcall được gọi, sau đó không thể thực hiện gì trong dialplan, ngoại trừ các trình xử lý đặc biệt (trình xử lý gác máy).

Hiểu FreePBX và tích hợp nó với Bitrix24 và hơn thế nữa

Chúng ta nên cung cấp thông tin về thời điểm bắt đầu cuộc gọi tới CRM ở đâu trong thuật toán cuộc gọi này, nơi bắt đầu ghi âm, kết thúc ghi âm ở đâu và gửi cùng với thông tin về cuộc gọi tới CRM?

Tích hợp với các hệ thống bên ngoài

Tích hợp PBX và CRM là gì? Đây là các cài đặt và chương trình chuyển đổi dữ liệu và sự kiện giữa hai nền tảng này và gửi chúng cho nhau. Cách phổ biến nhất để các hệ thống độc lập giao tiếp là thông qua API và cách phổ biến nhất để truy cập API là HTTP REST. Nhưng không phải cho dấu hoa thị.

Bên trong Asterisk là:

  • AGI - cuộc gọi đồng bộ của các chương trình/thành phần bên ngoài, được sử dụng chủ yếu trong dialplan, có các thư viện như phpagi, PAGI

  • AMI - ổ cắm TCP văn bản hoạt động theo nguyên tắc đăng ký sự kiện và nhập lệnh văn bản, giống SMTP từ bên trong, có thể theo dõi sự kiện và quản lý cuộc gọi, có thư viện PAMI - phổ biến nhất để tạo kết nối với Asterisk

Ví dụ đầu ra AMI

Sự kiện: Kênh mới
Đặc quyền: gọi, tất cả
Kênh: PJSIP/VMS_pjsip-0000078b
Trạng thái kênh: 4
ChannelStateDesc: Đổ chuông
ID người gọi: 111222
ID người gọi: 111222
ConnectedLineNum:
tên tuyến được kết nối:
Ngôn ngữ: Việt Nam
mã tài khoản:
Bối cảnh: from-pstn
mở rộng: s
Ưu tiên: 1
Số duy nhất: 1599589046.5244
ID liên kết: 1599589046.5244

  • ARI là sự kết hợp của cả hai, tất cả thông qua REST, WebSocket, ở định dạng JSON - nhưng với các thư viện và trình bao bọc mới, không tốt lắm, được tìm thấy bằng tay (pharia, phari) đã trở thành trong quá trình phát triển của họ khoảng 3 năm trước.

Ví dụ về đầu ra ARI khi bắt đầu cuộc gọi

{ "biến":"CallMeCallerIDName", "value":"111222", "type":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "channel":{ "id »:»1599644315.5334″, «tên»:»PJSIP/VMSpjsip-000007b6″, "state":"Ring", "caller":{ "name":"111222″, "number":"111222″ }, "connected":{ "name":"", "number" :"" }, "accountcode":"", "dialplan":{ "context":"from-pstn", "exten":"s", "priority":2, "appname":"ứ", "ứng dụngdata":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "language":"vi" }, "dấu hoa thịid":"48:5b:aa:aa:aa:aa", "application":"hello-world" }

Sự thuận tiện hay bất tiện, khả năng hoặc không thể làm việc với một API cụ thể được xác định bởi các nhiệm vụ cần giải quyết. Các nhiệm vụ để tích hợp với CRM như sau:

  • Theo dõi điểm bắt đầu cuộc gọi, nơi cuộc gọi được chuyển, lấy CallerID, DID, thời gian bắt đầu và kết thúc, có thể là dữ liệu từ danh bạ (để tìm kiếm kết nối giữa điện thoại và người dùng CRM)

  • Bắt đầu và kết thúc ghi âm cuộc gọi, lưu nó ở định dạng mong muốn, thông báo vị trí của tệp ở cuối bản ghi

  • Bắt đầu cuộc gọi trên một sự kiện bên ngoài (từ chương trình), gọi một số nội bộ, một số bên ngoài và kết nối chúng

  • Không bắt buộc: tích hợp với CRM, dialer groups và FollowME để tự động chuyển cuộc gọi khi không có địa điểm (theo CRM)

Tất cả các tác vụ này có thể được giải quyết thông qua AMI hoặc ARI, nhưng ARI cung cấp ít thông tin hơn nhiều, không có nhiều sự kiện, nhiều biến mà AMI vẫn có (ví dụ: cuộc gọi macro, biến cài đặt bên trong macro, bao gồm ghi âm cuộc gọi) không được theo dõi. Vì vậy, để theo dõi đúng và chính xác, chúng ta hãy chọn AMI ngay bây giờ (chứ không phải hoàn toàn). Ngoài ra (tốt, nó sẽ ở đâu nếu không có điều này, chúng tôi là những người lười biếng) - trong tác phẩm gốc (bài viết trong habr) sử dụng PAMI. *Sau đó, bạn cần cố gắng viết lại thành ARI, nhưng thực tế không phải là nó sẽ hoạt động.

Đổi mới tích hợp

Để FreePBX của chúng tôi có thể báo cáo cho AMI theo những cách đơn giản về thời điểm bắt đầu cuộc gọi, thời gian kết thúc, số, tên của các tệp được ghi, cách dễ nhất là tính thời lượng của cuộc gọi bằng thủ thuật tương tự như các tác giả ban đầu - nhập các biến của bạn và phân tích cú pháp đầu ra cho sự hiện diện của chúng. PAMI đề xuất thực hiện việc này đơn giản thông qua chức năng lọc.

Dưới đây là một ví dụ về cách đặt biến của riêng bạn cho thời gian bắt đầu cuộc gọi (s là một số đặc biệt trong sơ đồ quay số được thực hiện TRƯỚC KHI bắt đầu tìm kiếm DID)

[ext-did-custom]

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

Một sự kiện AMI ví dụ cho dòng này

Sự kiện: Kênh mới

Đặc quyền: gọi, tất cả

Kênh: PJSIP/VMS_pjsip-0000078b

Trạng thái kênh: 4

ChannelStateDesc: Đổ chuông

ID người gọi: 111222

ID người gọi: 111222

ConnectedLineNum:

tên tuyến được kết nối:

Ngôn ngữ: Việt Nam

mã tài khoản:

Bối cảnh: from-pstn

mở rộng: s

Ưu tiên: 1

Số duy nhất: 1599589046.5244

ID liên kết: 1599589046.5244

Ứng dụng: Đặt AppData:

Cuộc gọiBắt đầu=1599571046

Bởi vì FreePBX ghi đè lên các tập tin extension.conf và extention_bổ sung.conf, chúng tôi sẽ sử dụng tệp gia hạn_khách hàng.conf

Mã đầy đủ của extension_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

Tính năng và sự khác biệt so với sơ đồ quay số ban đầu của các tác giả của bài viết gốc -

  • Dialplan ở định dạng .conf, như FreePBX muốn (vâng, nó có thể là .ael, nhưng không phải tất cả các phiên bản và không phải lúc nào cũng thuận tiện)

  • Thay vì xử lý kết thúc thông qua exten=>h, quá trình xử lý được giới thiệu thông qua hangup_handler, vì dialplan FreePBX chỉ hoạt động với nó

  • Đã sửa chuỗi cuộc gọi tập lệnh, thêm dấu ngoặc kép và số cuộc gọi bên ngoài ExtNum

  • Quá trình xử lý được chuyển sang ngữ cảnh _custom và cho phép bạn không chạm hoặc chỉnh sửa cấu hình FreePBX - đến qua [máy lẻ đã làm tùy chỉnh], đi qua [outbound-allroutes-tùy chỉnh]

  • Không ràng buộc với số - tệp phổ biến và chỉ cần được định cấu hình cho đường dẫn và liên kết đến máy chủ

Để bắt đầu, bạn cũng cần chạy tập lệnh trong AMI bằng thông tin đăng nhập và mật khẩu - đối với điều này, FreePBX cũng có tệp _custom

tập tin manager_custom.conf

;;  это логин
[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

Cả hai tệp này phải được đặt trong/etc/dấu hoa thị, sau đó đọc lại cấu hình (hoặc khởi động lại dấu hoa thị)

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

Bây giờ hãy chuyển sang PHP

Khởi tạo tập lệnh và tạo dịch vụ

Vì kế hoạch làm việc với Bitrix 24, một dịch vụ dành cho AMI, không hoàn toàn đơn giản và minh bạch, nên nó phải được thảo luận riêng. Asterisk thì AMI kích hoạt xong chỉ cần mở port là xong. Khi một client tham gia, nó yêu cầu cấp quyền, sau đó client đăng ký các sự kiện cần thiết. Các sự kiện ở dạng văn bản thuần túy mà PAMI chuyển đổi thành các đối tượng có cấu trúc và cung cấp khả năng chỉ đặt chức năng lọc cho các sự kiện quan tâm, trường, số, v.v.

Ngay khi có lệnh gọi, sự kiện NewExten sẽ được kích hoạt bắt đầu từ ngữ cảnh gốc [from-pstn], sau đó tất cả các sự kiện sẽ diễn ra theo thứ tự của các dòng trong ngữ cảnh. Khi nhận được thông tin từ các biến CallMeCallerIDName và CallStart được chỉ định trong _custom dialplan,

  1. Chức năng yêu cầu UserID tương ứng với số máy nhánh nơi cuộc gọi đến. Nếu đó là một nhóm quay số thì sao? Câu hỏi mang tính chính trị, bạn có cần tạo cuộc gọi cho mọi người cùng một lúc (khi mọi người gọi cùng lúc) hay tạo khi họ gọi khi gọi lần lượt? Hầu hết các khách hàng đều có chiến lược Có sẵn đầu tiên, vì vậy không có vấn đề gì với điều này, chỉ một cuộc gọi. Nhưng vấn đề cần phải được giải quyết.

  2. Chức năng đăng ký cuộc gọi trong Bitrix24, trả về CallID, sau đó được yêu cầu để báo cáo các tham số cuộc gọi và liên kết đến bản ghi. Yêu cầu số máy nhánh hoặc UserID

Hiểu FreePBX và tích hợp nó với Bitrix24 và hơn thế nữa

Sau khi kết thúc cuộc gọi, chức năng tải xuống bản ghi được gọi, đồng thời báo trạng thái hoàn thành cuộc gọi (Bận, Không trả lời, Thành công), đồng thời tải xuống liên kết đến tệp mp3 có bản ghi (nếu có).

Vì mô-đun CallMeIn.php cần chạy liên tục nên một tệp khởi động SystemD đã được tạo cho nó callme.service, phải được đặt trong /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

khởi tạo và khởi chạy tập lệnh xảy ra thông qua systemctl hoặc dịch vụ

# systemctl enable callme
# systemctl start callme

Dịch vụ sẽ tự khởi động lại khi cần (trong trường hợp gặp sự cố). Dịch vụ theo dõi hộp thư đến không yêu cầu cài đặt máy chủ web, chỉ cần php (chắc chắn là có trên máy chủ FeePBX). Nhưng trong trường hợp không có quyền truy cập vào bản ghi cuộc gọi thông qua máy chủ Web (cũng với https), sẽ không thể nghe bản ghi cuộc gọi.

Bây giờ hãy nói về các cuộc gọi đi. Tập lệnh CallMeOut.php có hai chức năng:

  • Bắt đầu cuộc gọi khi nhận được yêu cầu đối với tập lệnh php (bao gồm cả việc sử dụng nút "Gọi" trong chính Bitrix). Nó không hoạt động nếu không có máy chủ web, yêu cầu được nhận qua HTTP POST, yêu cầu chứa mã thông báo

  • Thông báo về cuộc gọi, các tham số và bản ghi của nó trong Bitrix. Được kích hoạt bởi Asterisk trong sơ đồ quay số [cuộc gọi phụ bên trong kết thúc] khi cuộc gọi kết thúc

Hiểu FreePBX và tích hợp nó với Bitrix24 và hơn thế nữa

Máy chủ web chỉ cần thiết cho hai việc - tải xuống các tệp bản ghi Bitrix (thông qua HTTPS) và gọi tập lệnh CallMeOut.php. Bạn có thể sử dụng máy chủ FreePBX tích hợp, các tệp là /var/www/html, bạn có thể cài đặt một máy chủ khác hoặc chỉ định một đường dẫn khác.

máy chủ web

Hãy rời khỏi thiết lập máy chủ web để nghiên cứu độc lập (tyts, tyts, tyts). Nếu bạn không có miền, bạn có thể dùng thử FreeDomain( https://www.freenom.com/ru/index.html), tên này sẽ cung cấp cho bạn một tên miễn phí cho IP trắng của bạn (đừng quên chuyển tiếp các cổng 80, 443 qua bộ định tuyến nếu chỉ có địa chỉ bên ngoài trên đó). Nếu bạn vừa tạo một miền DNS thì bạn phải đợi (từ 15 phút đến 48 giờ) cho đến khi tất cả các máy chủ được tải. Theo kinh nghiệm làm việc với các nhà cung cấp trong nước - từ 1 giờ đến một ngày.

tự động hóa cài đặt

Trình cài đặt đã được phát triển trên github để giúp cài đặt dễ dàng hơn. Nhưng nó rất suôn sẻ trên giấy tờ - trong khi chúng tôi đang cài đặt tất cả theo cách thủ công, vì sau khi mày mò tất cả những điều này, mọi thứ trở nên rõ ràng như bạn bè với ai, ai đi đâu và cách gỡ lỗi. Chưa có bộ cài đặt

phu bến tàu

Nếu bạn muốn nhanh chóng thử giải pháp - có một tùy chọn với Docker - nhanh chóng tạo một bộ chứa, đưa các cổng ra bên ngoài, trượt các tệp cài đặt và thử (đây là tùy chọn với bộ chứa LetsEncrypt, nếu bạn đã có chứng chỉ , bạn chỉ cần chuyển hướng proxy ngược đến máy chủ web FreePBX (chúng tôi đã cung cấp cho nó một cổng khác là 88), LetsEncrypt trong docker dựa trên của bài viết này

Bạn cần chạy tệp trong thư mục dự án đã tải xuống (sau git clone), nhưng trước tiên hãy vào cấu hình dấu hoa thị (thư mục dấu hoa thị) và viết đường dẫn đến bản ghi và URL của trang web của bạn ở đó

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:

Tệp docker-compose.yaml này được chạy qua

docker-compose up -d

Nếu nginx không khởi động, thì có gì đó không đúng với cấu hình trong thư mục nginx/ssl_docker.conf

Tích hợp khác

Và tại sao không đưa một số CRM vào các tập lệnh cùng một lúc, chúng tôi nghĩ. Chúng tôi đã nghiên cứu một số API CRM khác, đặc biệt là PBX tích hợp miễn phí - ShugarCRM và Vtiger, và vâng! vâng, nguyên tắc là như nhau. Nhưng đây là một câu chuyện khác, sau này chúng tôi sẽ tải riêng lên github.

tài liệu tham khảo

Tuyên bố miễn trừ trách nhiệm: Bất kỳ sự tương đồng nào với thực tế đều là hư cấu và đó không phải là tôi.

Nguồn: www.habr.com

Thêm một lời nhận xét