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

Stripe支付成功后,如何获取网站系统内的用户对象?

解决方案:在Stripe Webhook中关联自有系统用户信息

核心解决思路是在创建Stripe支付对象(PaymentIntent/Checkout Session)时,将自有系统的用户唯一标识存入Stripe的metadata字段,这样Webhook触发时就能从事件对象中提取该标识,进而关联你的数据库完成后续操作。

步骤1:创建支付对象时添加自定义用户标识

在你网站后端创建PaymentIntent(或Checkout Session)的代码中,通过metadata字段注入自有系统的用户ID(或其他唯一标识):

// 示例:创建PaymentIntent时关联自有系统用户
const paymentIntent = await stripe.paymentIntents.create({
  amount: 1000, // 支付金额(单位:分)
  currency: 'cny',
  // 注入自定义用户信息,这里存用户唯一ID(推荐)或直接存用户名
  metadata: {
    internal_user_id: 'your_system_user_123',
    internal_username: '张三' // 可选:直接存入需要的用户名
  },
  // 其他必填参数(如payment_method_types等)
});

如果用的是Stripe Checkout,同样在创建Session时添加metadata:

const session = await stripe.checkout.sessions.create({
  payment_method_types: ['card'],
  line_items: [/* 商品信息 */],
  mode: 'payment',
  success_url: 'https://your-site.com/success',
  cancel_url: 'https://your-site.com/cancel',
  // 注入用户标识
  metadata: {
    internal_user_id: 'your_system_user_123'
  }
});

步骤2:在Webhook中提取用户标识并关联数据库

修改你现有的Webhook代码,从事件对象的metadata中取出自定义标识,再用该标识查询你的数据库:

routes.post(
  "/webhook",
  express.raw({ type: "application/json" }),
  async (request, response) => { // 添加async以支持异步数据库操作
    let event = request.body;

    const endpointSecret =
      "whsec_66266181ad61dd3ccde280aaddc27ba14f2fabea8a4d71761804e72581d31436";
    if (endpointSecret) {
      const signature = request.headers["stripe-signature"];
      try {
        event = stripe.webhooks.constructEvent(
          request.body,
          signature,
          endpointSecret
        );
      } catch (err) {
        console.log(`⚠️  Webhook signature verification failed.`, err.message);
        return response.sendStatus(400);
      }
    }

    switch (event.type) {
      // 推荐监听payment_intent.succeeded,而非charge.succeeded(后者是底层事件)
      case "payment_intent.succeeded":
        const paymentIntent = event.data.object;
        // 提取自有系统用户标识
        const internalUserId = paymentIntent.metadata.internal_user_id;
        const internalUsername = paymentIntent.metadata.internal_username;
        
        // 执行数据库查询,获取用户信息并完成后续操作
        // 示例:const user = await yourDB.query('SELECT * FROM users WHERE id = ?', [internalUserId]);
        // 比如更新用户会员状态、发送通知等
        
        console.log(`支付成功!金额:${paymentIntent.amount},关联用户ID:${internalUserId}`);
        break;

      case "charge.failed":
        const charge = event.data.object;
        const failedUserId = charge.metadata.internal_user_id;
        console.log(`支付失败!关联用户ID:${failedUserId},失败原因:${charge.failure_message}`);
        break;
      default:
        console.log(`未处理的事件类型:${event.type}.`);
    }

    response.send().end();
  }
);

关键说明

  • metadata是Stripe提供的自定义键值对存储字段,支持任意字符串类型的数据,完全用于关联外部系统信息
  • 优先存储用户唯一ID而非用户名,因为用户名可能变更,ID更稳定可靠
  • 所有存入metadata的内容都会在Webhook事件中返回,无需额外调用Stripe API查询

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:40:17