如何为Stripe订阅自动生成的循环付款意图设置元数据?
解决Stripe订阅后续Payment Intent元数据问题的两种方案
方案一:通过关联Subscription获取元数据(推荐)
你不需要给每个自动生成的Payment Intent手动设置元数据,因为每个Payment Intent都会关联到对应的Invoice,而Invoice又关联到Subscription。你已经在Subscription上存了productId和userId,直接通过Webhook事件链读取即可:
- 保持现有Subscription创建逻辑(已在metadata中存储所需字段)。
- 在
payment_intent.succeeded的Webhook处理函数中:- 从Payment Intent对象中拿到关联的
invoiceID。 - 拉取该Invoice并展开关联的
subscription。 - 从Subscription的metadata中直接读取
productId和userId。
- 从Payment Intent对象中拿到关联的
代码示例:
// Webhook处理逻辑 async function handlePaymentIntentSucceeded(event) { const paymentIntent = event.data.object; // 获取关联的Invoice,并展开subscription const invoice = await stripe.invoices.retrieve(paymentIntent.invoice, { expand: ['subscription'] }); // 从Subscription元数据中提取所需信息 const { productId, userId } = invoice.subscription.metadata; // 执行你的数据库更新操作 await activateUserSubscription(userId, productId); }
这个方法最可靠,无论后续Stripe的元数据继承规则如何变化,通过Subscription关联的方式都能稳定获取所需信息。
方案二:设置Invoice默认元数据,让Payment Intent自动继承
Stripe允许你为Subscription设置invoice_settings.default_metadata,这样每个账单周期生成的Invoice都会自动带上这些元数据,对应的Payment Intent会直接继承Invoice的元数据:
修改Subscription创建代码,添加invoice_settings字段:
const subscription = await this.stripe.subscriptions.create({ customer: customer.id, items: [{ price: "price_........." }], expand: ["latest_invoice.payment_intent"], metadata: { productId: productId, userId: user.id, }, // 设置后续Invoice的默认元数据 invoice_settings: { default_metadata: { productId: productId, userId: user.id, subscriptionId: "{{subscription.id}}" // Stripe会自动替换为实际订阅ID } } }); // 第一个Payment Intent可手动更新(可选,因为第一个Invoice也会继承default_metadata) await this.stripe.paymentIntents.update(subscription.latest_invoice.payment_intent.id, { metadata: { subscriptionId: subscription.id, userId: user.id, productId: product.id, } });
这样后续自动生成的Payment Intent都会带上你设置的元数据,Webhook里直接从paymentIntent.metadata读取即可。
内容的提问来源于stack exchange,提问作者danyalutsevich
相关产品推荐
相关产品推荐

