Twilio Outbound call - добавить людей к существующему вызову
Я пытаюсь создать веб-приложение, в котором:
Я делаю исходящий звонок из приложения браузера на номер телефона через twilio. Я использую Twilio Client(js) v 1.10.1 для браузера. Внутренний веб-перехватчик написан на Java с использованием глагола Twilio Dial and Number. Мне удалось добиться этого с помощью программируемого голоса Twilio.
Псевдокод выглядит ниже
Код внешнего интерфейса
let device = require('twilio-client').Device; let outboundCall = ''; const twilioInit = () => { // twilio client initialization logic goes here } // on phone icon click i am calling the below method const makeOutboundCall = () => { outboundCall = device.connect({ To: TO_NUMBER // The first to number }); }
Бэкэнд-код - серверная часть (веб-перехватчик)
@RequestMapping(value="/callCustomers", produces= "text/xml") public String callByBrowserToMobile(@RequestParam String ApplicationSid, @RequestParam String ApiVersion, @RequestParam String Called, @RequestParam String Caller, @RequestParam String CallStatus, @RequestParam String To, @RequestParam String From, @RequestParam String CallSid, @RequestParam String Direction, @RequestParam String AccountSid) { Number number = new Number.Builder(To).build(); Dial dial = new Dial.Builder().answerOnBridge(true).number(number).callerId(myTwilioNumber).build(); VoiceResponse response = new VoiceResponse.Builder().dial(dial).build(); logger.info(response.toXml()); return response.toXml(); }
Во-вторых, как только исходящий вызов будет подключен, я хочу добавить больше людей к текущему вызову.
Как добиться второго требования?
ИЗМЕНИТЬ: Я пробовал использовать код ниже для конференц-связи:
@RequestMapping(value = "/callMobile", produces = "text/xml")
public String callByBrowserToMobile(@RequestParam String ApplicationSid, @RequestParam String ApiVersion,
@RequestParam String Called, @RequestParam String Caller, @RequestParam String CallStatus,
@RequestParam String To, @RequestParam String From, @RequestParam String CallSid,
@RequestParam String Direction, @RequestParam String AccountSid) {
LOG.info("Call by browser to mobile");
String voiceCallBackUri = new StringBuilder(
env.getProperty("twilio.exposed.uri").concat("/conferenceCallBack")).toString();
String joinConferenceUri = new StringBuilder(
env.getProperty("twilio.exposed.uri").concat("/joinConference")).toString();
String fromNumber = "+xxxxxxxxx35"; // Bought Twilio Number
Call call = Call.creator(
new com.twilio.type.PhoneNumber("+"+To),
new com.twilio.type.PhoneNumber(fromNumber),
URI.create(joinConferenceUri))
.setMethod(HttpMethod.GET)
.setStatusCallback(URI.create(voiceCallBackUri))
.setStatusCallbackMethod(HttpMethod.POST)
.create();
Conference.Builder conferenceBuilder = new Conference.Builder("My Conference");
Dial dial = new Dial.Builder().conference(conferenceBuilder.build()).build();
VoiceResponse twiml = new VoiceResponse.Builder().dial(dial).build();
return twiml.toXml();
}
@RequestMapping("/joinConference")
public String joinConference() {
LOG.info("joinConference");
Conference.Builder conferenceBuilder = new Conference.Builder("My Conference");
Dial dial = new Dial.Builder().conference(conferenceBuilder.build()).build();
VoiceResponse twiml = new VoiceResponse.Builder().dial(dial).build();
return twiml.toXml();
}
@RequestMapping("/conferenceCallBack")
public void conferenceCallBack(@RequestParam String Called, @RequestParam String ToState,
@RequestParam String CallerCountry, @RequestParam String Timestamp, @RequestParam String Direction,
@RequestParam String CallbackSource, @RequestParam String SipResponseCode, @RequestParam String CallerState,
@RequestParam String ToZip, @RequestParam String SequenceNumber, @RequestParam String To,
@RequestParam String CallSid, @RequestParam String ToCountry, @RequestParam String CallerZip,
@RequestParam String ApiVersion, @RequestParam String CalledZip,@RequestParam String CallStatus,
@RequestParam String CalledCity, @RequestParam String Duration, @RequestParam String From,
@RequestParam String CallDuration, @RequestParam String AccountSid, @RequestParam String CalledCountry,
@RequestParam String CallerCity, @RequestParam String Caller, @RequestParam String FromCountry,
@RequestParam String ToCity, @RequestParam String FromCity, @RequestParam String CalledState,
@RequestParam String FromZip, @RequestParam String FromState) {
LOG.info("conferenceCallBack");
}
Используя приведенный выше код для конференции, вызывающий абонент (приложение браузера) слышит ожидающую музыку для конференц-вызова, а вызываемый абонент получает вызов, но при выборе просто слышит имя конференции, и вызов вызываемого абонента отключается. Пожалуйста, помогите найти проблему.
2 ответа
Проповедник разработчиков Twilio здесь.
Вы не обслуживаете свой
/joinConference
маршрут как
text/xml
поэтому Twilio читает это как
text/plain
и относиться к нему, как если бы это был
<Say>
.
Я думаю тебе нужно добавить
produces = 'text/xml'
к
RequestMapping
, вот так:
@RequestMapping("/joinConference", produces = "text/xml")
Сообщите мне, если это поможет.
Вы можете использовать агентские конференции. Вот пример кода и высокоуровневое изображение того, как это работает https://www.twilio.com/blog/multi-party-calls-voip-gsm-programmable-voice