Firebase与Stripe集成问题:invoice.paid()无法显示用户元数据
解决Stripe invoice.paid事件中无法获取用户UUID元数据的问题
核心问题分析
你在Checkout Session中设置了subscription_data.metadata,但Stripe的Invoice对象不会自动继承Subscription的元数据,所以在invoice.paid事件中直接访问invoice.metadata会是空值。另外需要确认你是否在事件处理逻辑中正确定位到元数据的存储位置。
具体解决方案
1. 给Invoice本身添加元数据(推荐)
在创建Checkout Session时,额外添加invoice_data.metadata配置,让生成的Invoice直接携带用户UUID:
const session = await stripe.checkout.sessions.create({ // 原有配置保留... subscription_data: { metadata: { firebaseUID: userId, userEmail: userData.email, subscriptionType: 'Pro' } }, // 新增:给Invoice绑定元数据 invoice_data: { metadata: { firebaseUID: userId, userEmail: userData.email, subscriptionType: 'Pro' } } });
配置完成后,在invoice.paid事件中可以直接从event.data.object.metadata读取firebaseUID。
2. 从Invoice关联的Subscription中获取元数据
如果不想修改Checkout Session配置,可在处理invoice.paid事件时,通过Invoice的subscription字段查询对应的Subscription对象,从中提取元数据:
// invoice.paid事件处理示例 const invoice = event.data.object; // 查询关联的Subscription const subscription = await stripe.subscriptions.retrieve(invoice.subscription); const firebaseUID = subscription.metadata.firebaseUID; // 后续业务逻辑...
3. 利用client_reference_id作为备用方案
你已经在Checkout Session中设置了client_reference_id: userId,可以通过Invoice关联的Checkout Session获取该值:
// invoice.paid事件处理示例 const invoice = event.data.object; if (invoice.checkout_session) { const session = await stripe.checkout.sessions.retrieve(invoice.checkout_session); const firebaseUID = session.client_reference_id; // 后续业务逻辑... }
排查验证步骤
- 登录Stripe控制台,找到对应的Subscription对象,检查
Metadata标签页是否存在你设置的firebaseUID; - 找到该Subscription关联的Invoice对象,检查
Metadata标签页(如果添加了invoice_data.metadata)是否有对应数据; - 在Webhook处理代码中打印完整的
event.data.object,确认字段结构和数据是否符合预期。
内容的提问来源于stack exchange,提问作者user26605191
相关产品推荐
相关产品推荐

