我确实有一个 Stripe webhook,它在 Stripe 的 TEST MODE 中被成功捕获并在 http 本地主机服务器上处理。
但是,当切换到 Stripe 的实时模式数据时,webhook 返回状态代码 500,而 EC2 实例未受影响,不会生成任何日志。
签名密钥或条带密钥没有问题,事件永远不会到达使用负载均衡器创建的 EC2 的 HTTPS 端点。
Stripe 的支持无法说明这一点,因此非常欢迎任何有关为什么会发生这种情况或如何处理的建议。
Stripe 上显示的错误是:
HTTP status code 500 (Internal Server Error)
Response Failed to connect to remote host
我向运行在 EC2 上的 express 服务器添加了一个白名单中间件:
app.use((req, res, next) => {
console.log('Always inside ', req.originalUrl);
next();
});
在处理条带 webhook URL 之前
app.use('/afterpayment', bodyParser.raw({ type: 'application/json' }), afterPaymentRoutes);
为了查看 Stripe 事件是否到达服务器,但未发生。
但是,如果我手动在浏览器中输入 Stripe Webhook URL,域/后付款,结果是预期的:白名单中间件打印消息并且 Webhook 处理程序接管。
答案 0 :(得分:1)
我遇到了类似的问题,正在看这个帖子。就我而言,问题是一些不同的事情。我强制使用 https 到我的网站(elb 正在将任何流量从 80 重定向到 443)。我的 ec2 上的应用程序正在接受端口 80 上的连接。对该站点的访问正常。我想可能由于重定向,将 webhook 数据发送到 elb 的条纹可能会中断。事实并非如此。但是,我有一个只允许从我的 IP 地址访问的安全组(用于测试)。从互联网(实际生产访问)将其更改为 0.0.0.0/0 并没有完全解决问题,但我想让事情设置得尽可能接近真实世界。在 Stripe 仪表板中,我创建了一个新的 webhook,指向我公开用于测试的应用程序端点。在 Stripe 仪表板中,我点击了“发送测试 webhook”按钮。这次错误不是超时,而是无效签名。所以,我知道将站点暴露给 Internet 是问题的一部分。,(是的,我可以创建一个安全组,只允许从 Webhook 数据来源的 IP 地址进行访问,但同样 - 我想保留这尽可能接近生产,感谢@justin-michael 在正确方向上的推动)。我的应用程序仍在使用我为开发设置的测试 webhook。当我创建新的 webhook 时,它也创建了一个新的签名密钥。我将这个新的 webhook 签名密钥提取到我的应用程序中,然后再次运行“发送测试 webhook”,它成功了。因此,允许从 Stripe 正确访问并确保签名密码正确为我解决了问题。
答案 1 :(得分:0)
问题是域名没有正确地暴露在互联网上。
所以我有 Elastic Beanstalk 环境运行 node.js 服务器应用程序,我在上面设置了 负载均衡器 并通过 <强>HTTPS。
虽然我可以成功模拟对域端点的 POST 请求,但在尝试捕获由 3rd 方应用程序(如 Stripe)发送的 webhook
时,nothing arrived on the server
。该域也可以通过浏览器访问(或者看起来如此)。
问题是链接到负载均衡器的域名无法在互联网上公开解析。这里有 2 个有用的链接:
对它们运行测试揭示了与我的域的 DNSSEC 配置相关的问题,该配置在我的域中未启用。
在遵循此 instructions 时,我做到了:
在此之后,所有测试都通过了,并且成功处理了 webhook。