如何让 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
您好,我正在使用 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