我有两个可用的Twilio <client>
,使用JS Quickstart和Twilio客户端PHP库在我的网站上(在呼叫者输入代码后)接收入站呼叫,这些呼叫被记录并注册在我的数据库中。
[我注意到一个<client>
挂断一个打开的入站呼叫时,此呼叫转到另一个<client>
的网站,我在数据库中有2个寄存器,而不是2个。
这是一个示例:
<?php
//...
//Validating connection status
//$estd is the connection status I get via AJAX
if($estd=="open"){
$call = $twilio->calls($callsid)->update(array("status" => "completed"));
$calla = $twilio->calls($callsid)->fetch();
$parentCall = $calla->parentCallSid; //parent call
$calld = $twilio->calls($parentCall)->update(array("status" => "completed"));
} else if($estd=="pending"){
$call = $twilio->calls($callsid)->update(array("status" => "completed"));
$calla = $twilio->calls($callsid)->fetch();
$parentCall = $calla->parentCallSid; //parent call
$calld = $twilio->calls($parentCall)->update(array("twiml" => '<Response><Dial timeout="20" record="record-from-answer" recordingStatusCallback="https://mywebsite.com/record.php" recordingStatusCallbackEvent="in-progress completed absent"><Client><Identity>the_other_client</Identity><Parameter name="numdoc" value="user_code"/></Client></Dial></Response>'));
}
?>
我该如何解决?
我需要您的帮助。
我相信这可能是发生的,因为单个来电会触发您的两个$ estd if语句。
根据Twilio文档(https://www.twilio.com/docs/voice/client/javascript/connection#status),传入呼叫将首先具有待处理状态,然后处于打开状态。如果状态更改时设置了statuscallbackURL,则您可能会多次调用记录保持代码。根据您使用SQL的方式,您可能每次都插入新记录。
防止重复记录的方法是将呼叫的资源SID保存在数据库中,并使用insert on duplicate key
或update
保存以防止创建新记录。
或者,如果您显示的代码段来自record.php,则在使用Twiml进行出站呼叫时,您将使用callbackURL来调用record.php,这时您可能正在数据库中创建新记录。 (因为此调用将具有自己的唯一SID)。如果要将其附加到当前记录,则需要为此脚本创建的那些拨出电话创建一个不同的callbackURL。
(但是从您提供的详细信息中很难知道何时调用了什么代码。