You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Node.js部署Stripe Webhook并实现线上运行?

如何将Node.js Stripe Webhook部署到线上环境

结论

当然可以用Node.js部署Stripe Webhook到线上环境,你的现有代码逻辑是可行的,但需要调整几个关键配置并遵循部署规范,确保线上稳定运行。

代码修正要点

你的代码存在几个会导致线上运行异常的问题,先做如下修改:

1. 启用Webhook签名验证(必须)

线上环境必须开启签名验证,防止伪造请求。取消注释并正确配置Webhook密钥:

// 替换原来的空webhookSecret定义
const webhookSecret = process.env.STRIPE_WEB_HOOK;

2. 使用原始请求体进行签名验证

Stripe的constructEvent需要未解析的原始请求体(Buffer或字符串),而你当前用的express.json()会解析请求体,导致签名验证失败。修改Webhook路由的中间件:

router.post(
  "/webhook",
  // 替换express.json为express.raw,保留原始请求体
  express.raw({ type: "application/json" }),
  async (req, res) => {
    // ... 后续代码
  }
);

3. 修复重复响应问题

你的代码中多次调用res.status(),会导致"Cannot set headers after they are sent to the client"错误。保留唯一的响应:

// 移除checkout.session.completed块内的重复响应,只保留最外层的
if (eventType === "checkout.session.completed") {
  try {
    const customer = await stripe.customers.retrieve(data.customer);
    await createOrder(customer, data); // 加上await确保异步操作完成
    console.log("Order processed successfully");
  } catch (err) {
    console.log("Error processing order:", err.message);
    // 即使处理失败,也要返回200给Stripe,避免重复发送事件
  }
}

res.status(200).end(); // 唯一响应

4. 优化异步代码(可选但推荐)

用async/await替代.then/.catch,让代码更易维护:

// 替换原有的stripe.customers.retrieve().then(...)逻辑
if (eventType === "checkout.session.completed") {
  try {
    const customer = await stripe.customers.retrieve(data.customer);
    await createOrder(customer, data);
    console.log("Order processed successfully");
  } catch (err) {
    console.log("Error retrieving customer or creating order:", err.message);
  }
}

部署步骤

1. 选择部署平台

任意支持Node.js的平台都可以,比如:

  • Heroku(适合快速部署)
  • Vercel/Netlify(支持Serverless函数)
  • DigitalOcean Droplets(自定义服务器)
  • AWS EC2/Elastic Beanstalk

2. 配置环境变量

在部署平台的环境变量设置中添加以下参数:

  • STRIPE_SECRET: Stripe后台的Secret Key
  • STRIPE_WEB_HOOK: Stripe后台Webhook的签名密钥(在Webhook设置中获取)
  • MONGODB_URI: MongoDB的连接字符串(确保线上服务器能访问你的MongoDB实例,比如用Atlas的话要允许平台IP访问)

3. 更新Stripe控制台的Webhook地址

部署完成后,你的Webhook会有一个公网可访问的URL,比如https://your-domain.com/api/stripe/webhook,在Stripe后台的Webhook设置中:

  • 添加该URL
  • 订阅checkout.session.completed事件(以及你需要的其他事件)
  • 保存设置

4. 测试线上Webhook

使用Stripe CLI测试线上事件接收:

# 替换为你的线上Webhook URL
stripe listen --forward-to https://your-domain.com/api/stripe/webhook

然后发起一个测试支付,检查服务器日志是否正常创建订单,同时查看Stripe控制台的Webhook日志是否显示成功。

常见问题排查

  • 签名验证失败: 检查STRIPE_WEB_HOOK是否和Stripe后台的一致,确保请求体是原始未解析的格式。
  • 订单未创建: 检查MongoDB连接是否正常,服务器日志是否有报错,确认Stripe事件是否发送成功。
  • 请求超时: 确保你的服务器响应速度足够快,Stripe要求Webhook在10秒内返回响应,避免在Webhook处理中执行耗时操作(可将耗时操作放入队列)。

内容的提问来源于stack exchange,提问作者Sahidul arif

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:30:55