我正在尝试使用Twilio可编程语音JavaScript SDK进行带有statusCallback和statusCallbackEvent的出站呼叫,以便在呼叫完成后更新另一个系统。
这是我的密码。
async function makeOutgoingCall() {
const params = {
// get the phone number to call from the DOM
To: phoneNumberInput.value,
CallerId: myCallerId,
statusCallback: OutBoundCallbackURL,
statusCallbackEvent: 'completed'
};
console.log(params);
if (device) {
log(`Attempting to call ${params.To} from caller id: ${params.CallerId} ...`);
// Twilio.Device.connect() returns a Call object
const call = await device.connect({ params });
dtmf_1.onclick = function(){call.sendDigits('1')};
dtmf_2.onclick = function(){call.sendDigits('2')};
dtmf_3.onclick = function(){call.sendDigits('3')};
dtmf_4.onclick = function(){call.sendDigits('4')};
dtmf_5.onclick = function(){call.sendDigits('5')};
dtmf_6.onclick = function(){call.sendDigits('6')};
dtmf_7.onclick = function(){call.sendDigits('7')};
dtmf_8.onclick = function(){call.sendDigits('8')};
dtmf_9.onclick = function(){call.sendDigits('9')};
dtmf_0.onclick = function(){call.sendDigits('0')};
dtmf_s.onclick = function(){call.sendDigits('*')};
dtmf_h.onclick = function(){call.sendDigits('#')};
/*
* add listeners to the Call
* "accepted" means the call has finished connecting and the state is now "open"
*/
call.on('accept', updateUIAcceptedOutgoingCall);
call.on('disconnect', updateUIDisconnectedOutgoingCall);
call.on('cancel', updateUIDisconnectedOutgoingCall);
call.on('reject', updateUIDisconnectedOutgoingCall);
outgoingCallHangupButton.onclick = () => {
log('Hanging up ...');
call.disconnect();
};
} else {
log('Unable to make call.');
}
}
我希望它像这样发回TwiML:
<Response>
<Dial answerOnBridge="true" callerId="+19876543210">
<Number
statusCallbackEvent="completed"
statusCallback="https://myapp.com/calls/events"
statusCallbackMethod="POST">
+12349013030
</Number>
</Dial>
</Response>
但它正在发回这个:
<Response>
<Dial answerOnBridge="true" callerId="+19876543210">
<Number>+1123456789</Number>
</Dial>
</Response>
我找不到device.connect((的可能参数列表。甚至不确定这是我需要编辑的。
有人能帮我吗?
更新此TwiML响应可能需要在服务器端完成,因此您可能需要从生成Twilio访问令牌(您的客户端最初用于向Twilio注册(的位置开始,并追溯到服务器和特定处理程序所在的位置。
因此,例如,如果在访问令牌中有一个用于创建语音授权的outgoingApplicationSid
,您将希望在Twilio控制台中找到具有相应sid的TwiML应用程序,并按照其配置的语音请求URL查找服务器。然后,您应该能够从服务器中找到创建TwiML响应的位置。
对于基于几个假设的稍微更具体的答案:
- 根据您上面的一些代码片段,您可能使用了TwilioDevEd/voice javascript sdk节点作为项目的跳板
- 如果1为真,您可能会在Twilio控制台中设置一个TwiML应用程序,该应用程序指向语音请求URL,该URL使用ngrok通过隧道连接到您本地运行的节点服务器,就像它们在README中一样
如果这些都是真的,那么您需要在项目中查找voiceResponse
处理程序,并更新twiml.dial()
调用(生成响应TwiML(以创建所需的实际TwiML。
当Twilio向您的TwiML应用程序发出请求时,它会将您传递给connect
方法的所有参数作为请求主体中的参数发送。因此,在现有程序中,似乎正在使用To
和CallerId
参数。因此,您需要调整dial
以同时使用statusCallback
和statusCallbackEvent
参数。这可能看起来有点像:
const { statusCallback, statusCallbackEvent, CallerId, To } = req.body;
const twiml = new VoiceResponse();
const dial = twiml.dial({ callerId: CallerId });
dial.number({ statusCallback, statusCallbackEvent }, To);