Как подключить вызывающего абонента к третьему лицу, но объявить вызов третьему лицу перед подключением? - PullRequest
0 голосов
/ 18 апреля 2019

Я разрабатываю услугу звонка с поминутной оплатой с интеграцией базы данных с помощью сценариев AGI / PHP.Я довольно хорошо разбираюсь в части интеграции, но меня смущает вопрос о том, как подключить клиентов к провайдерам таким образом, чтобы не раскрывать личную информацию любой из сторон (например, информацию CID).Кроме того, я должен быть в состоянии отследить время, когда обе стороны соединены (для точного выставления счетов).

По существу, вот краткое изложение потока вызовов:

  • Клиент запрашиваетразговаривать с провайдером в приложении
  • Приложение генерирует 6-значный код доступа, который будет использоваться при вызове номера 800
  • Клиент вызывает горячую линию и вводит код доступа
  • Сервер подключается к базе данных через AGI и получает мобильный номер провайдера, связанный с кодом доступа
  • Сервер вызывает провайдера и объявляет, что «такой-то пользователь находится на линии».Пользователь в тот или иной момент слышит только удерживаемую музыку
  • Поставщик нажимает клавишу (например, фунт), чтобы принять вызов, или другую, чтобы отклонить
  • Сервер объявляет что-то вроде "Вашвызов подключен, тарификация начнется сейчас "для обеих сторон
  • Сервер соединяет обе стороны и выходит из пути, но начинает отсчет времени до тех пор, пока канал не будет сброшен
  • Когда вызовзакончилась, значение таймера записывается в базу данных через AGI

Есть идеи?Я часами рыскал в Интернете и не смог найти ни одного примера, даже отдаленно близкого к тому, что я хочу сделать.

Буду признателен за любую помощь, которую кто-либо может предложить, или, если у кого-то есть примеры, которые он сделалчто-то похожее на это в прошлом.

РЕДАКТИРОВАТЬ:

Вот моя абонентская группа:

exten => 1,1,Read(acode,enter_acode,6)
same => Set(ACODE = ${acode})
same => n,agi(baba.agi,get_call,${acode})
same => n,GotoIf($["${CALLSTAT}" == "1"]?call-ok:call-bad)
same => n(call-bad),GotoIf($["${CALLSTAT}" == "2"]?ag-unavail:call-not-found)
same => n(call-not-found),Playback(acode_invalid)
same => n,Goto(baba,1,1)
same => n(ag-unavail),Read(opt,ag_unavail,1)
same => n,GotoIf($["${opt}" == "1"]?ag-notify:no-call)
same => n(ag-notify),agi(baba.agi,ag_notify,${ACODE})
same => n,GotoIf($["${NSTAT}" == "1"]?notify-ok:call-error)
same => n(notify-ok),Playback(ag_notify)
same => n,Goto(baba,s,1)
same => n(call-ok),Read(opt,call_ready,1)
same => n,GotoIf($["${opt}" == "1"]?start-call:no-call)
same => n(start-call),Playback(attempt_connect)
HERE IS WHERE I WANT TO CALL ${APHONE}
same => n,Goto(no-call)
same => n(no-call),Playback(no_call)
same => n,Goto(baba,s,1)
same => n(call-error),Playback(error_proc_req)
same => n,Goto(baba,s,1)

А вот функция из моего PHP agi:

function get_call()
{
    global $db;
    log_agi("Retrieving call information for access code: {$this->agi_arg_2}");
    $q = "SELECT * FROM `call-user` WHERE `call_code`='%s' AND `call_status`=1 LIMIT 1";
    $q = sprintf($q,$this->agi_arg_2);
    $res = $db->query($q);
    db_error($db,$q);
    if ($res->num_rows > 0)
    {
        $call = $res->fetch_object();
        log_agi("Call #{$call->call_id} found! Checking agent availability...");
        if ($call->ag_avail)
        {
            log_agi("Agent is available! User Phone: {$call->user_phone}, Agent Phone: {$call->ag_phone}");
            execute_agi("SET VARIABLE CALLSTAT 1");
            execute_agi("SET VARIABLE UPHONE {$call->user_phone}");
            execute_agi("SET VARIABLE APHONE {$call->ag_phone}");
            return true;
        }else{
            log_agi("Agent [{$call->ag_username}] is unavailable!");
            execute_agi("SET VARIABLE CALLSTAT 2");
            return false;
        }
    }else{
        log_agi("Call associated with access code #{$this->agi_arg_2} was not found!");
        execute_agi("SET VARIABLE CALLSTAT 0");
        return false;
    }
}

Спасибо!

1 Ответ

0 голосов
/ 28 апреля 2019

Думаю, приложение Follow Me будет для вас интересным. Он имеет встроенную функциональность для вызова получателя, воспроизведения сообщения и назначения для нажатия клавиши для подтверждения вызова (по умолчанию 1).

Для выставления счетов используйте Записи данных о вызовах (CDR) . Вы можете добавить свои собственные поля.

...