我正在使用由 PHP 处理的 Twilio JavaScript 语音 SDK 和 TwiML 应用程序进行出站语音呼叫。
我的第一个实现是直接拨号码..
客户端...
device.connect({
params: {
callee_name: name,
callee_number: phoneNumber,
}
}).then((call) => {
call.on('accept', (acceptedCall) => {
console.log('in accept');
let callSid = acceptedCall.parameters.CallSid;
});
});
服务器端...
$voiceResponse = new VoiceResponse;
$dial = $voiceResponse->dial('', ['callerId' => $callerId]);
$dial->number($calleeNumber,[
'statusCallbackEvent' => 'initiated ringing answered completed',
'statusCallback' => $statusCallbackUrl
]);
$xml = $voiceResponse->asXml();
$response = new Response($xml, Response::HTTP_OK, ['context-type' => 'text/xml']);
return $response;
这很好用。然而,使用这种方法,根本无法实现呼叫转移、指导和许多其他功能。要访问这些功能,我必须将呼叫放入会议中。 因此,一种方法是在我需要这些功能时将电话加入会议。但是,正如此答案 https://stackoverflow.com/a/22919470/7422838 中所述,最好从一开始就将出站呼叫置于会议中。因此,例如,如果您正在对通话进行录音,那么当您将通话置于会议中时,录音不会分成两部分。
那么如何做到这一点?我目前的做法是:
客户端...
device.connect({
params: {
callee_name: name,
callee_number: phoneNumber,
}
}).then((call) => {
call.on('accept', (acceptedCall) => {
let callSid = acceptedCall.parameters.CallSid;
$.ajax({
url: dialFromConferenceUrl,
data: {
call_sid: callSid,
callee_name: name,
callee_number: phoneNumber,
}
});
});
});
服务器端,在voice.XML回调中
$voiceResponse = new VoiceResponse;
$dial = $voiceResponse->dial('', ['callerId' => $callerId]);
$dial->conference($conferenceSid,[
'statusCallbackEvent' => 'start end join leave mute hold',
'statusCallback' => $statusCallbackUrl
]);
$xml = $voiceResponse->asXml();
$response = new Response($xml, Response::HTTP_OK, ['context-type' => 'text/xml']);
return $response;
服务器端,在会议处理程序的调用中...
$client->conferences($conferenceSid)
->participants
->create($mainPhone,$calleePhone
[
'label' => $calleeType,
'statusCallback' => $conferenceStatusUrl,
'statusCallbackEvent' => ['initiated', 'ringing', 'answered', 'completed']
]);
所以这一切都有效,但看起来非常不优雅和笨拙。从客户的角度来看,我正在进行 2 次服务器往返以完成一个操作:通过会议室进行出站呼叫。当然这个操作有多个组成部分:(1)创建会议室; (2) 连接客户端到会议室; (3) 拨打第二方电话加入会议室。但是为什么不能通过客户端的单个查询在服务器端完成所有这些组件操作呢?
我怀疑他们可以,这就是我问这个问题的原因。