twilio - Twilio 设备设置 - 注册、连接到 TWiML 应用程序,但不接受呼叫
问题描述
我正在尝试通过 TWiML 应用程序在浏览器中设置软电话。
我创建了以下内容:
- 我自己的服务器上的一个页面,它服务于 TWiML 来拨打一个号码,比如“+11111111111”。
- 指向该页面的 TWiML 应用程序
- 指向该应用程序的 Twilio 编号。
- 我的服务器上的一个页面,它创建了一个与应用程序和按钮相关联的 Twilio 设备以运行
device.connect()
或device.register()
设备设置正确,因为我可以注册并连接没有错误。该应用程序有效 - 当我按下TWiML 应用程序页面
上的“使用 Twilio 呼叫”按钮时,当我拨打指向 TWiML 应用程序的号码时,以及当我按下我自己页面上的按钮时,电话会在 +111 处响铃。耶!
我无法弄清楚:
- 如何使用 Twilio 设备接听电话。
设备注册没有问题,为什么它没有收到来电? - 除了我的应用程序中的号码之外,如何拨打其他号码。
我在 device.connect({params: {To: '+2222222222'}}
) 中做了,为什么它不呼叫那个号码?
以下是所有相关页面:
调用.pug:
doctype html
html(lang="en")
head
meta(charset="utf-8")
title Browser Calls
body
input#call(type="submit" value="call")
input#register(type="submit" value="register")
pre
script(src="/js/twilio-sdk/twilio.js")
script(type="module" src="/js/calls.js")
[客户端]调用.js
const $ = css => document.querySelector(css);
const echo = msg => $('pre').innerText += msg + "\n";
var device;
async function setupDevice(){
let data = await fetch('/token/new');
data = await data.json();
device = new Twilio.Device(data.token);
device.on("error",
err => echo("Twilio.Device Error: " + err.message));
echo ('Device setup complete.')
}
$('#register').addEventListener('click', async e => {
if (!device) await setupDevice();
device.on("registered", conn =>
echo('Ready to accept incoming calls.')
);
device.on("incoming", call =>
echo('Incoming call to device')
);
device.register()
});
$('#call').addEventListener('click', async e => {
if (!device) await setupDevice();
let params = { To: '+22222222222' }
device.connect({ params })
});
[节点] token.js
const express = require('express');
const router = express.Router();
const AccessToken = require('twilio').jwt.AccessToken;
const VoiceGrant = AccessToken.VoiceGrant;
const config = require('../config');
router.get('/new', function (req, res) {
const accessToken = new AccessToken(
config.accountSid, config.apiKey, config.apiSecret, {identity: 'SG'}
);
const grant = new VoiceGrant({
outgoingApplicationSid: config.appSid,
incomingAllow: true,
});
accessToken.addGrant(grant);
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({ token: accessToken.toJwt() }));
});
module.exports = router;
解决方案
Twilio 开发人员布道者在这里。
如何使用 Twilio 设备接听电话。
设备注册没有问题,为什么它没有收到来电?
要将调用定向到设备,您需要返回带有访问令牌 ID 的 TwiML <Dial>
(在本<Client>
例中为“SG”)。
因此,如果您希望将您的 Twilio 号码的呼叫定向到此客户端,您应该更新 Twilio 号码的传入 webhook 以指向返回此内容的 URL:
<Response>
<Dial>
<Client>
<Identity>SG</Identity>
</Client>
</Dial>
</Response>
- 除了我的应用程序中的号码之外,如何拨打其他号码。我在 device.connect({params: {To: '+2222222222'}}) 中做了,为什么它不调用那个号码?
目前,听起来您将设备指向一个 TwiML 应用程序,该应用程序使用静态 TwiML 进行响应,该应用程序拨打您的示例号码“+11111111111”。要使用这些参数,您需要通过从 Node 服务器返回它来使 TwiML 动态化。参数被发送到 TwiML 端点,因此您可以在响应中使用它们。
这是一个适用于您的示例 Express 端点:
const express = require('express');
const router = express.Router();
const { VoiceResponse } = require("twilio").twiml;
const config = require('../config');
router.use(express.urlencoded({ extended: false }));
router.post("/call", function(res, res) {
const To = req.body;
const twiml = new VoiceResponse();
const dial = twiml.dial({ callerId: config.twilioNumber });
dial.number(To);
res.set("Content-Type", "text/xml");
res.send(twiml.toString());
});
module.exports = router;
推荐阅读
- php - 如何修复未定义的索引 $user = $_GET['user'];
- amazon-web-services - 在 AWS 中开发具有多个实例的应用程序的最佳方式
- sql - Hive 提取数组中的数据
- sql - 获取 java.sql.SQLRecoverableException:Spring Boot 应用程序中的关闭连接
- .net - 无法构建包含 .Net Core 和 SQL 项目的解决方案
- php - 在laravel 5中仅将一列从字符串转换为数组
- javascript - 如何在此滑块/轮播的每个框下方添加不同的文本?
- selenium - 量角器硒错误消息:“gl_surface_egl.cc eglInitialize D3D9 failed with error EGL_NOT_INITIALIZED”
- php - 在 Woocommerce 中添加带有其他单选按钮的自定义支付网关
- javascript - 如何在fabric js中实现橡皮擦