Twilio Outbound call - добавить людей к существующему вызову

Я пытаюсь создать веб-приложение, в котором:

  1. Я делаю исходящий звонок из приложения браузера на номер телефона через 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();    
    }
    
  2. Во-вторых, как только исходящий вызов будет подключен, я хочу добавить больше людей к текущему вызову.

Как добиться второго требования?

ИЗМЕНИТЬ: Я пробовал использовать код ниже для конференц-связи:

@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

Другие вопросы по тегам