节点中的条带Webhook 404错误

时间:2018-02-22 14:10:42

标签: node.js https stripe-payments webhooks stripe.js

我为webhook设置了以下代码:

var express = require('express');
var router = express.Router();
var nodemailer = require('nodemailer');
var middleware = require('../middleware');
var stripe = require("stripe")(process.env.SECRET_KEY);

// router.use(require("body-parser").raw({type: "*/*"}));

router.post("/webhook/all", function(req, res) {
  // Retrieve the request's body and parse it as JSON
  // var event_json = JSON.parse(req.body);
  middleware.sendEmail('Webhook Test', 'event_json');
  res.sendStatus(200);
});

module.exports = router;

当我使用localhost和Postman进行测试时,它可以正常工作,但是当它处于实时状态时会响应404错误:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Cannot POST /webhook/all</pre>
</body>
</html>

我唯一的猜测是它与我的HTTPS有关,因为Stripe Docs这样说:

  

如果您为webhook端点使用HTTPS URL,Stripe会   在发送之前验证与服务器的连接是否安全   你的webhook数据。为此,您的服务器必须正确   配置为支持具有有效服务器证书的HTTPS。

我的SSL证书是通过DO Droplet上的Let's Encrypt设置的,它似乎工作正常,所以我不确定为什么这会是问题。

注意:我故意使event_json成为一个字符串,因为我试图尽可能多地删除混淆变量。一旦这作为字符串工作,我将取消注释body-parser并再次将event_json切换到变量。

1 个答案:

答案 0 :(得分:0)

您需要将本地主机隧道传输到公共站点。请为此使用ngrok。每次您运行ngrok

时,它将为您的本地主机应用程序生成一个随机的公共URL

假设您的本地主机URL是http://localhost:3000/webhook/all,则ngrok url类似于https://somerandomurl/webhook/all

然后,您可以使用此公共URL接收本地主机上的所有webhook事件。

PS:当您在ngrok上按CTRL + C时,它将停止隧道传输,并且您的应用程序将不再能够接收任何webhook事件。此外,您将在条带上获得更高的故障率