我已经使用 Twilio JavaScript SDK 和 PHP 实现了 Twilio 电话会议。到目前为止,正在运行的功能是:
<?php
require_once './vendor/autoload.php';
use Twilio\TwiML\VoiceResponse;
use Twilio\Rest\Client;
$response = new VoiceResponse();
$dial = $response->dial('');
$dial->conference('first-conference-room',
['startConferenceOnEnter' => 'true', 'endConferenceOnExit' => 'true']);
$sid = getenv("TWILIO_ACCOUNT_SID");
$token = getenv("TWILIO_AUTH_TOKEN");
$twilio = new Client($sid, $token);
$twilio->conferences("first-conference-room")
->participants
->create($fromnumber,
$tonumber,[
"statusCallbackEvent" => ["ringing","initiated","answered","completed"],
"statusCallback" => "link-to-php-function-to-write-call-record-to-database",
"statusCallbackMethod" => "POST"
]);
return $response;
?>
现在,作为主管,一旦在代理(使用浏览器)和另一个电话号码之间建立了电话会议,我就会通过一个按钮来获取并显示正在进行的通话记录,以作为主管加入。
有什么建议可以让第三个人作为主管或教练加入会议吗?
一个单独的问题 - 三人(号码)之间的 Twilio 会议是否按两次 Twilio 语音通话收费,或以较低费用第三人加入会议的一次 Twilio 语音通话收费?
您的主管也在浏览器中,因此当您单击加入按钮时,我假设您正在使用 Twilio Voice SDK 进行呼叫,并且您的 TwiML 应用程序将 Webhook 定向到您的端点,该端点运行您的第二个代码块问题。
当您想要指导通话时,您实际上想要的不仅仅是静音。您希望能够收听呼叫、与座席交谈而不让另一端的人听到,或者介入并与会议中的双方交谈。为此,您需要使用 coach
TwiML的
<Conference>
属性。
要使用
coach
,您需要获取座席呼叫支路的SID。如果代理从浏览器发出出站呼叫,则其 SID 将是发送到您的 Webhook URL 的 CallSid
参数。如果他们正在接收呼叫,则 API 调用会返回他们的呼叫 SID,以创建会议参与者。
获得 SID 后,在代理的 Webhook 响应中,您需要拨入会议并添加
coach
属性以及代理的呼叫 SID 值。
$response = new VoiceResponse();
$dial = $response->dial('');
$dial->conference('first-conference-room', ['coach' => $agentCallSid ]);
echo $response;
一个单独的问题 - 三人(号码)之间的 Twilio 会议是否按两次 Twilio 语音通话收费,或以较低费用第三人加入会议的一次 Twilio 语音通话收费?
Twilio 按每段通话收费。 Twilio 和调用者之间的每个连接都是一条腿。因此,在这种情况下,会议中的三个人就是三条腿,并按每分钟的会议费率收费。
在我的场景中,当代理创建出站呼叫时,另一个用户希望作为教练加入该会议,因此它正在工作,但是当代理收到呼叫并且其他用户希望作为教练加入该会议时,它会开始向客户提供指导,而不是对于代理,这条腿不适用于这种情况,因为当我得到代理和客户端连接的参与者呼叫ID时,因此在该腿中,“发件人”号码是客户的号码,而教练属性从该呼叫ID中获取“发件人”号码并开始指导我在这方面需要指导:
public function makecoach(){
$conferenceSid = $this->input->post('conferencesid');
$agentCallSid = $this->input->post('callsid');
$participantsid = $this->input->post('participantcallsid');
$client = new Client($this->config->item('TWILIO_ACCOUNT_SID'), $this->config->item('TWILIO_ACCOUNT_TOKEN'));
// Fetch the list of participants in the conference
$participants = $client->conferences($conferenceSid)
->participants
->read();
// Find the participant's CallSid
$participantCallSid = null;
$toNumber = null;
foreach ($participants as $p) {
if ($p->callSid === $participantsid) {
$participantCallSid = $p->callSid;
$toNumber = $p->to;
break;
}
}
if ($participantCallSid) {
// Set the participant as a coach
$client->conferences($conferenceSid)
->participants($participantCallSid)
->update([
'coaching' => true,
'callSidToCoach' => $toNumber // The CallSid of the participant you want to coach
]);
echo json_encode(['status' => 'Supervisor added to conference in coach mode.']);
} else {
echo json_encode(['status' => 'Error', 'message' => $participantCallSid]);
}
}