Введение
Мы используем Plivo PHP на стороне сервера SDK (устаревшая версия) для управления входящими вызовами. Недавно мне пришлось реализовать блокировку вызовов. Идея проста - если входящий звонок в нашей системе не соответствует определенным правилам, мы вешаем трубку. Для этого используется hangup_call
функция из RestAPI.
Кусок кода
Когда наша система получает запрос с событием: StartApp
от Plivo, контроллер вызовов вызывает 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
от Plivo, начнется новый вызов. И это повторяется в цикле, пока я вручную не завершу вызов в Skype как вызывающий абонент.
Использование addSpeak
или addWait
вместо hangup_call
работает - говорить или ждать, и после этого вызов завершается.
Я также пытался использовать addHangup
с параметром причина: "отклонено", но различий не было.
Вопрос
Почему после выполнения hangup_call
Skype продолжает подключаться? (Вызов не заканчивается на стороне вызывающего абонента)
Может ли это быть особенностью скайпа?
Может быть, это потому, что мы используем устаревшую версию SDK? Есть ли большая разница между последней и устаревшей SDK на стороне сервера?