如何在Heroku中配置允许Stripe IP地址以接收Webhook请求?
问题解答
排查方向是否正确?
你的排查方向完全正确。原因如下:
- 能正常调用Stripe API创建客户、设置账单,说明应用到Stripe的出站网络、API密钥配置、核心业务代码逻辑都没问题。
- Stripe触发Webhook时出现"Timed out connecting to remote host",核心问题是Stripe无法成功发起对你Heroku应用的入站请求,确实属于网络可达性或端点配置类问题,而非代码逻辑错误。
如何配置Heroku以接收Stripe的Webhook POST请求?
Heroku默认不限制外部入站请求,不需要额外配置“允许域名”,重点做好以下几步即可:
1. 确认生产端点的可达性
先验证你的生产Webhook端点是否能正常接收请求:
- 用
curl模拟POST请求测试:curl -X POST https://myapp.com/users/stripe/webhook -d '{}' -H "Content-Type: application/json" - 如果请求超时或返回错误,优先排查:
- Heroku应用是否正常运行(用
heroku ps查看进程状态); - 自定义域名
myapp.com是否正确解析到Heroku应用(检查DNS记录,确保CNAME或A记录指向Heroku的服务器地址); - 应用路由是否正确,
/users/stripe/webhook是否存在且能处理POST请求。
- Heroku应用是否正常运行(用
2. 正确配置Stripe后台的Webhook端点
所谓“更新允许的域名”实际是指在Stripe后台配置生产端点:
- 登录Stripe Dashboard,进入Webhooks设置页面;
- 添加生产环境端点:
https://myapp.com/users/stripe/webhook; - 勾选你需要监听的事件(比如
checkout.session.completed、customer.subscription.updated等); - 确保端点状态为“已启用”,没有被标记为失败。
3. 优化Webhook响应时间(避免Stripe超时)
Stripe要求Webhook端点必须在10秒内返回2xx响应,否则会触发超时:
- 尽量异步处理Webhook事件:收到请求后立即返回
200 OK,再把具体业务逻辑(比如更新数据库、发送通知)放入异步队列(比如Heroku Redis + Sidekiq)执行; - 检查代码中是否有耗时操作(比如大数据库查询、第三方API调用),如果有,全部移到异步任务中。
4. 查看Heroku日志定位细节
用Heroku CLI实时查看日志,确认请求是否到达应用:
heroku logs --tail
- 如果能看到Stripe的请求日志,但返回错误,排查代码中的签名验证、路由逻辑;
- 如果看不到请求日志,说明请求没到达Heroku,检查是否有第三方防火墙(比如Cloudflare)拦截了Stripe的IP,需要在防火墙规则中放行Stripe的官方IP段。
5. 验证Webhook签名(保障安全性)
虽然不是超时的直接原因,但必须确保代码正确验证Stripe Webhook签名,避免恶意请求:
- 在代码中使用Stripe提供的Webhook密钥(在Stripe Dashboard的Webhook设置中获取),调用Stripe官方SDK的签名验证方法(比如Node.js中的
stripe.webhooks.constructEvent)。
内容的提问来源于stack exchange,提问作者econobro
相关产品推荐
相关产品推荐

