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

如何识别Stripe Webhook路由触发对应的用户?

解决Stripe Webhook签名验证失败及用户识别问题

一、先修复Webhook签名验证失败问题

你当前代码的签名验证报错,核心原因是未传递原始请求体给Stripe的验证方法。多数Node.js框架(如Express)会自动解析JSON请求体,但Stripe需要未解析的原始字节流才能完成签名校验。

修复步骤:

  1. 为/webhooks路由配置express.raw中间件,确保传递原始请求体:
// Express路由配置示例
app.post('/webhooks', express.raw({ type: 'application/json' }), postStripeWebhook);
  1. 确认使用的是Stripe后台对应Webhook端点的签名密钥(而非API密钥),该密钥可在Stripe Dashboard的Webhook设置页面获取。
  2. 检查代理或服务器是否篡改了stripe-signature请求头,确保该字段完整传递。

二、识别用户并更新订阅状态

要在Webhook中关联到你的平台用户,关键是在创建Checkout Session时传递用户标识,具体操作如下:

1. 创建Checkout Session时添加用户元数据

在生成Stripe Checkout Session的代码中,通过metadata字段存入你的数据库用户唯一ID:

const session = await stripe.checkout.sessions.create({
  payment_method_types: ['card'],
  line_items: [
    {
      price: '你的价格ID',
      quantity: 1,
    },
  ],
  mode: 'subscription',
  success_url: '你的成功跳转URL',
  cancel_url: '你的取消跳转URL',
  // 核心:存入用户唯一标识
  metadata: {
    userId: '用户在你数据库中的ID' // 比如登录态中的req.user.id
  },
});

2. 在Webhook中获取用户ID并更新状态

在checkout.session.completed事件分支中,从Session对象里取出元数据中的用户ID,执行数据库更新逻辑:

case 'checkout.session.completed':
  const session = event.data.object;
  // 从元数据中提取用户ID
  const userId = session.metadata.userId;
  if (userId) {
    // 执行数据库更新操作,示例:
    await UserModel.updateOne(
      { _id: userId },
      { subscriptionStatus: true }
    );
    console.log(`用户 ${userId} 订阅状态已更新`);
  } else {
    console.log('未找到关联的用户ID元数据');
  }
break;

额外注意事项

  • 确保metadata中的userId是数据库中用户的有效唯一标识,避免关联错误。
  • 处理Webhook事件需保证幂等性:记录已处理的Stripe事件ID,防止因Stripe重试事件导致重复更新用户状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:15:35