首页 > 解决方案 > Twilio 设备设置 - 注册、连接到 TWiML 应用程序,但不接受呼叫

问题描述

我正在尝试通过 TWiML 应用程序在浏览器中设置软电话。

我创建了以下内容:

设备设置正确,因为我可以注册并连接没有错误。该应用程序有效 - 当我按下TWiML 应用程序页面
上的“使用 Twilio 呼叫”按钮时,当我拨打指向 TWiML 应用程序的号码时,以及当我按下我自己页面上的按钮时,电话会在 +111 处响铃。耶!

我无法弄清楚:

以下是所有相关页面:

调用.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;

标签: twiliotwilio-twiml

解决方案


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;

推荐阅读