Задача

Создать кнопку «Перезвоните мне» на сайте, с максимальной интеграцией во FreePBX.

Решение

Для примера возьмем статью https://asterisk-pbx.ru/wiki/artikle/asterisk_web_callback. Принцип работы этой реализации заключается в том, что php скрипт генерирует (Originate) вызов. Первым делом отправляет вызов по каналу Channel. После того, как соединение установлено (вызов принят оператором), осуществляется внешний вызов на номер Exten. На практике это происходит так: Пользователь нажимает на кнопку «Перезвоните мне», осуществляется звонок Оператору. Оператор поднял трубку — осуществляется звонок Пользователю. Такая реализация отлично работает за исключением того, что нет возможности при помощи FreePBX управлять вызовами.

Мой вариант — осуществлять вызов по принципу модуля «Обратный звонок». Таким образом мы сделаем «точку» входа во FreePBX в виде Приветствия, после чего, будем полностью управлять вызовом средствами web-интерфейса.

Первым делом нужно настроить пользователя AMI (Asterisk Manager Interface). Можно настроить по этой ссылке: https://wiki.merionet.ru/ip-telephoniya/13/nastrojka-ami-v-freepbx-13/.

Задаем пользователю права:

read = system,call,log,verbose,command,agent,user,config,originate
write = system,call,log,verbose,command,agent,user,config,originate

Приступаем к созданию php скрипта на Web-сервере для совершения вызова:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?php
$strNumber = $_POST['txtphonenumber'];
 
$strName = $_POST['txtname'];
 
$strHost = "127.0.0.1";
 
$strUser = "callback";
 
$strSecret = "qwerty";
 
$strChannel = "Local/$strNumber@from-internal";
 
$strContext = "app-announcement-47";
 
$strExten = "s";
 
$strPriority = "1";
 
$strWaitTime = "60";
 
$strMaxRetry = "1";
 
$strCallerId = "$strName <$strNumber>";
 
$length = strlen($strNumber);
 
if ($length == 10 && is_numeric($strNumber))
{
$oSocket = fsockopen($strHost, 5038, $errnum, $errdesc) or die("Connection to host failed");
fputs($oSocket, "Action: login\r\n");
fputs($oSocket, "Events: off\r\n");
fputs($oSocket, "Username: $strUser\r\n");
fputs($oSocket, "Secret: $strSecret\r\n\r\n");
fputs($oSocket, "Action: originate\r\n");
fputs($oSocket, "Channel: $strChannel\r\n");
fputs($oSocket, "WaitTime: $strWaitTime\r\n");
fputs($oSocket, "CallerId: $strCallerId\r\n");
fputs($oSocket, "Exten: $strExten\r\n");
fputs($oSocket, "Context: $strContext\r\n");
fputs($oSocket, "Priority: $strPriority\r\n\r\n");
fputs($oSocket, "Action: Logoff\r\n\r\n");
sleep (1);
fclose($oSocket);
 
?>
<p>
<table width="300" border="1" bordercolor="#630000" cellpadding="3" cellspacing="0">
    <tr><td>
    <font size="2" face="verdana,georgia" color="#630000">Производится вызов. Подождите пока Ваш телефон зазвонит!<br>Если телефон не позвонил в течении минуты, попробуйте ещё раз.<br><a href="<? echo $_SERVER['PHP_SELF'] ?>">Ещё раз</a></font>
    </td></tr>
</table>
</p>
<?
}
else
{
?>
<p>
<table width="300" border="1" bordercolor="#630000" cellpadding="3" cellspacing="0">
    <tr><td>
    <form action="<? echo $_SERVER['PHP_SELF'] ?>" method="post">
                <font size="2" face="verdana,arial,georgia" color="#630000">Введите имя.</font>
        <input type="text" size="20" maxlength="10" name="txtname">
        </br>
                <font size="2" face="verdana,arial,georgia" color="#630000">Введите Ваш номер ( 0XXXXXXXXX ).</font>
                <input type="text" size="20" maxlength="10" name="txtphonenumber">
                </br>
                <input type="submit" value="Позвонить!">
    </form>
    </td></tr>
</table>
</p>
<?
}
?>

где
$strHost = "127.0.0.1"; — адрес Asterisk. Если Asterisk находится за NAT, нужно делать проброс 5038 порта
$strUser = "callback"; — имя пользователя AMI
$strSecret = "qwerty"; — пароль пользователя AMI
$strContext = "app-announcement-47"; — название Приветствия, созданного в FreePBX («точка» входа в FreePBX)
Список названий приветствий, созданных в FreePBX можно найти в файле /etc/asterisk/extensions_additional.conf сервера Asterisk.
Принцип работы: пользователь нажимает на кнопку «Перезвоните мне», после чего, ему поступает звонок. Пользователь берет трубку, и попадает в Приветствие FreePBX. Далее направляйте его куда угодно :).