如何让 Twilio webhooks 与 Heroku 一起工作?

How can I get Twilio webhooks to work with Heroku?

您好,我正在使用 Twilio 向多个 phone 号码发送短信。

当用户从我的 React.js 应用程序收到短信时,我希望他们能够回复该短信并让我的应用程序进行一些处理,然后发回短信说明正在处理完成。

基于 Twilio web page

但是我一直收到 404 响应。

以下是此问题的详细信息:

该应用程序是 Heroku

上的 REACT 应用程序 运行

我的 'server.js' 文件中的重要内容

const express = require('express');
const bodyParser = require('body-parser');
const passport = require('passport');
const path = require('path');

const mongoose = require('mongoose');

const sms = require('./routes/api/sms');

const app = express();


// body parser
let size = '50mb';
app.use(bodyParser.urlencoded({limit: size,extended: false}));
app.use(bodyParser.json({limit: size}));


// passport middleware
app.use(passport.initialize());

// passport config file.
// passport uses a strategy
require('./config/passport')(passport);

// use routes

app.use('/api/sms', sms);


// server static assests if in production
if (process.env.NODE_ENV === 'production') {
    // Set static folder
    app.use(express.static('client/build'));

    app.get('*', (req, res) => {
      res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
    });
  }

const serverPort = require('./config/keys').serverPort;

const port = process.env.PORT || serverPort;

app.listen(port, () => console.log(`server running on port ${port}`));

这里是sms.js文件内容('should'响应web hook调用的URL)

router.post('/twiml', (req, res) => {

    let debugThis = true;
    if(debugThis){
        console.log('post api/sms/twiml');
        console.log(req.body);
    }

    const twiml = new MessagingResponse();

    if (req.body.Body == 'hi') {
        twiml.message('Hello!');
      } else if (req.body.Body == 'bye') {
        twiml.message('Goodbye');
      } else {
        twiml.message(
          'No Body param match, Twilio sends this in the request to your server.'
        );
      }

      res.writeHead(200, { 'Content-Type': 'text/xml' });
      res.end(twiml.toString());

});

所以我认为当我拨打电话时,我应该使用的 URL 作为 Web 挂钩应该在我的 phone 号码上配置 Twilio 就像这样:(前面缺少的部分是 HTTPS:// )

当我给我的 Twilio 号码发短信时,这是我在日志中得到的:

2020-01-25T23:53:17.755941+00:00 heroku[router]: at=info method=POST path="/sms/twiml" host=choremonger.herokuapp.com request_id=7d44f910-2850-4282-aa14-08270384e99a fwd="54.198.69.37" dyno=web.1 connect=36ms service=23ms status=404 bytes=393 protocol=https

换句话说:

我的 Twilio 号码是 555-555-5555 乔的号码是 111-111-1111

我设想的消息是这样的:

从 555-555-5555 发送到 111-111-1111 "Is Task A completed"

RC 已在 111-111-1111 "Is Task A completed"

从 111-111-1111 发送至 555-555-5555 "Yes"

RC 在 555-555-5555 "Yes"

这是通过网络挂钩通知我的应用程序 "Yes" 已发短信的地方。

< 发生一些处理,发件人的 phone 号码用于回复 >

从 555-555-5555 发送至 111-111-1111 "Task A is closed"

更新 1

我添加这个的原因是因为网络挂钩 URL 不正确的评论。

当我使用 Visual Studio 代码和 Postman 中的 'npm run server' 检查 URL 时,我得到了这个:

服务器输出 Visual Studio

[nodemon] 1.18.10
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `node server.js`
server running on port 5000
DB connected
post api/sms/twiml
{ Body: 'hi' }

邮递员URL呼叫:

http://localhost:5000/api/sms/twiml

邮差正文:

{
    "Body" :"hi"
}

邮递员结果: 状态:200 正常

<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Message>Hello!</Message>
</Response>

更新2

当我从 Twilio 中的 webhook URL 中删除 'twilml' 并发短信时,我得到了这个:

2020-01-26T18:05:09.862565+00:00 heroku[router]: at=info method=POST path="/sms" host=choremonger.herokuapp.com request_id=8b0d0987-2907-4796-a8b2-d4e6d14e209a fwd="54.208.241.142" dyno=web.1 connect=0ms service=2ms status=404 bytes=387 protocol=https

当我把它放回去并再次发短信时,得到了这个:

2020-01-26T18:06:26.639155+00:00 heroku[router]: at=info method=POST path="/sms/twiml" host=choremonger.herokuapp.com request_id=0af446f3-4432-40fe-b6e6-1b64ecf6608c fwd="3.89.83.196" dyno=web.1 connect=0ms service=3ms status=404 bytes=393 protocol=https

更新3

我认为这可能是由于 HTTPS 与 HTTP 造成的,所以我将网络挂钩更改为 HTTP 并再次尝试...请求获取了 http 更改...但结果相同。

2020-01-27T03:13:51.506124+00:00 heroku[router]: at=info method=POST path="/sms/twiml" host=choremonger.herokuapp.com request_id=539604b1-3b08-47d9-a124-3d2e30596043 fwd="54.166.158.158" dyno=web.1 connect=1ms service=2ms status=404 bytes=393 protocol=http

更新4

我去了 Twilio 的调试器并提取了一些信息...希望有人可以指导我如何解决这个问题

Phone 数字和 SIDS 是正确的

谢谢!

好的......对于所有那些像我一样刚接触网络编程和反应的人......

这是原因:

这是我的 server.js 文件中将 URL 放入世界的行:

const sms = require('./routes/api/sms');

我在 Twilio 配置 URL 中缺少 api' link