Вступление
Мы используем Plivo PHP на стороне сервера SDK (устаревшая версия) для управления входящими вызовами. Недавно мне пришлось реализовать блокировку вызовов. Идея проста — если входящий звонок в нашей системе не соответствует определенным правилам, мы вешаем трубку. Для этого hangup_call
функция из RestAPI используется.
Часть кода
Когда наша система получает запрос с событием: StartApp
из Пливо, звонит диспетчер звонков StartCall
функция класса handle
, Эта функция содержит всю логику для начала вызова (проверка правил, сохранение вызова в базе данных, начало записи и т. Д.):
public function handle($data) {
// Finding caller from DB by callerNumber ...
// Finding campaign from DB by targetNumber ...
// Checking if caller already called in certain time interval (isDuplicate) ...
// Starting call - call MUST be saved in DB !
$call = Call::start($data["CallUUID"], $campaign, $caller, $isDuplicate);
$call->save();
try {
// Checking call rules, throwing exceptions and changing call status accordingly
$call->guardCall();
} catch (CountryNotAllowedException $e) {
// Hanging up if caller country not allowed
return $this->callsApi->hangUp($call);
}
// If everything went good waiting(Plivo addWait) for our systems waiting call service to find call consumer and execute transfer...
}
Замечания: hangUp
это функция, которая содержит hangup_call
наряду с некоторыми лесозаготовками.
тестирование
На данный момент для тестирования звонков мы используем Skype с купленными номерами в США, так как мы находимся в Европе.
В целях тестирования каждый вызов в этом тесте не проходит правила — блокируется.
При тестировании этого кода казалось, что все работает, но есть одна проблема — Skype продолжает звонить, хотя Plivo завершает вызов. В результате после того, как наша система получит Hangup
из Пливо начинается новый звонок. И это повторяется в цикле, пока я вручную не завершу вызов в скайпе в качестве звонящего.
С помощью addSpeak
или же addWait
вместо hangup_call
работает — говори или жди выполняется и после этого звонок заканчивается.
Я также пытался использовать addHangup
с параметром причина: «отклонено», но не было никакой разницы.
Вопрос
Почему после hangup_call
выполняется скайп продолжает соединение? (Вызов не заканчивается на стороне вызывающего абонента)
Может ли это быть особенностью скайпа?
Может быть, это потому, что мы используем устаревшую версию SDK? Есть ли большая разница между последним и устаревшим SDK на стороне сервера?
Задача ещё не решена.
Других решений пока нет …