Интеграция IP-телефонии Asterisk на сайт

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Интеграция IP-телефонии Asterisk на сайт
Сложная
~3-5 рабочих дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    874
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    851

Интеграция IP-телефонии Asterisk на сайт

Asterisk — открытая платформа IP-АТС, де-факто стандарт для корпоративной телефонии. В отличие от облачных провайдеров (Манго, Zadarma), Asterisk разворачивается на собственном сервере — полный контроль над данными, маршрутизацией и стоимостью звонков.

Архитектура интеграции

Браузер (WebRTC/SIP.js) ←→ Asterisk (Kamailio/nginx + WebSocket)
                                    ↓
                              AMI (Asterisk Manager Interface)
                                    ↓
                              Backend API (PHP/Go/Node)
                                    ↓
                              База данных + Redis (события)

Asterisk Manager Interface (AMI) — TCP-соединение к порту 5038, через которое backend получает события реального времени (входящий звонок, ответ, завершение) и отправляет команды (originate, hangup).

Подключение к AMI

// Низкоуровневое TCP-соединение к AMI
$socket = fsockopen(env('ASTERISK_HOST'), 5038, $errno, $errstr, 5);
fwrite($socket, "Action: Login\r\nUsername: api_user\r\nSecret: api_secret\r\n\r\n");

// Получение событий (polling в фоновом процессе)
while (!feof($socket)) {
    $line = fgets($socket);
    // Парсить события: Event: Newchannel, Event: Hangup, etc.
}

На практике удобнее использовать библиотеку: optika-si/phpagi или pami/pami (PAMI — PHP Asterisk Manager Interface).

PAMI — работа с событиями

// composer require marcelog/pami

$client = new \PAMI\Client\Impl\ClientImpl([
    'host'     => env('ASTERISK_HOST'),
    'port'     => 5038,
    'username' => 'api_user',
    'secret'   => 'api_secret',
    'connect_timeout' => 10
]);

$client->open();

// Слушать входящие звонки
$client->registerEventListener(function(\PAMI\Message\Event\EventMessage $event) {
    if ($event->getName() === 'Newchannel') {
        $callerNum = $event->getKey('CallerIDNum');
        $channel   = $event->getKey('Channel');
        // Найти клиента, уведомить менеджера через Redis pub/sub
        Redis::publish('incoming_call', json_encode([
            'caller' => $callerNum,
            'channel' => $channel,
            'timestamp' => now()->toIso8601String()
        ]));
    }
    if ($event->getName() === 'Hangup') {
        $duration = $event->getKey('Duration');
        // Сохранить звонок в БД
    }
});

while (true) {
    $client->process();
    usleep(100000); // 100ms
}

Этот процесс запускается как supervisor-демон, всегда поддерживает соединение с AMI.

Click-to-Call через Originate

// Инициировать звонок: соединить агента с клиентом
$client->send(new \PAMI\Message\Action\OriginateAction(
    "SIP/{$agentExtension}",  // канал агента
    "exten,{$customerPhone},default",  // куда звонить после ответа агента
    [
        'Timeout'    => 30000,
        'CallerID'   => '"Мой Магазин" <80001234567>',
        'Variable'   => "ORDER_ID={$orderId}",
        'Async'      => true
    ]
));

Asterisk сначала звонит агенту, после ответа соединяет его с клиентом — это удобнее для агента, чем самостоятельно набирать номер.

ARI (Asterisk REST Interface)

Современный подход — ARI (Asterisk REST Interface) через WebSocket. Позволяет строить сложные сценарии обработки звонков в виде кода:

// Node.js + ari-client
const ari = require('ari-client');

ari.connect('http://asterisk:8088', 'user', 'secret', function(err, client) {
    client.on('StasisStart', function(event, channel) {
        const callerNum = channel.caller.number;
        // Найти клиента, воспроизвести персональное приветствие
        channel.play({media: `sound:welcome-${customerId}`});
    });
    client.start('my-stasis-app');
});

WebRTC через Asterisk + Nginx

Для звонков из браузера Asterisk должен работать с WebSocket TLS. Конфигурация:

; /etc/asterisk/http.conf
[general]
enabled=yes
tlsenable=yes
tlsbindaddr=0.0.0.0:8089
tlscertfile=/etc/ssl/asterisk/asterisk.crt
tlsprivatekey=/etc/ssl/asterisk/asterisk.key

; /etc/asterisk/pjsip.conf
[transport-wss]
type=transport
protocol=wss
bind=0.0.0.0:8089

Запись разговоров

Asterisk пишет записи в MixMonitor. Файлы хранятся в /var/spool/asterisk/monitor/. Скрипт перекладывает их на S3 и обновляет call_records.recording_url.

Срок разработки: 3–5 недель для полной интеграции: развёртывание Asterisk, AMI-демон, click-to-call, WebRTC в браузере и история звонков.