Stripe 订阅 webhook 缺少元数据和 client_reference_id
Posted
技术标签:
【中文标题】Stripe 订阅 webhook 缺少元数据和 client_reference_id【英文标题】:Stripe subscription webhooks missing metadata and client_reference_id 【发布时间】:2021-03-28 13:32:06 【问题描述】:我在将条带 webhook 链接到客户时遇到问题,因为我通常使用 client_reference_id 或元数据字段,但是订阅 webhook 似乎没有这些字段。例如,事件 checkout.session.completed 确实包含 client_reference_id,而 invoice.paid 不包含。
NodeJS 代码生成付款:
const session = await stripe.checkout.sessions.create(
payment_method_types: ['card'],
line_items: [
price_data:
currency: 'usd',
product_data:
name: `Premium license`,
,
unit_amount: 600,
recurring:
interval: "month",
interval_count: 1
,
,
quantity: 1
],
subscription_data:
trial_period_days: 1,
,
metadata: 'userId': userId ,
client_reference_id: userId,
mode: 'subscription',
customer_email: customerEmail,
success_url: `...`,
cancel_url: `...`,
);
【问题讨论】:
【参考方案1】:是的,没有选项可以在事件之间建立联系是一个重大缺失。当您不能依赖 webhook 事件的顺序时,这一点变得至关重要。
我确实使用metadata
解决了这个问题。将您自己的参考 ID,例如 my_database_reference_id
传递给 checkout.session.create
的元数据以及结帐创建中的 subscription_data
。这可以与您在client_reference_id
中传递的值相同。现在,您可以在收听 webhook 时使用它来连接结帐会话和订阅对象,而不管它进入的顺序。
注意:请注意,元数据可以由 Stripe 帐户编辑,因此,如果您是平台并依赖此进行任何逻辑,请小心。
【讨论】:
谢谢,subscription_data.metadata 正是我想要的! 你有条带编辑元数据的参考吗?在欺诈检测等某些场景中,它读取元数据但不对其进行编辑。【参考方案2】:client_reference_id
是 Stripe 中 Checkout Session 对象的属性,但不是任何其他 Stripe 对象的属性。
订阅事件(如customer.subscription.created
)描述订阅对象,发票事件(如invoice.paid
)描述发票,两者都不是结帐会话,因此缺少该属性。
通常,所有这些链接在一起的方式是使用 Stripe 中的 Customer 对象 (cus_123
),它应该出现在 customer
属性中提到的所有事件中。 Checkout will create the Customer object for you if you don't specify an existing one.
【讨论】:
但是我们仍然需要在客户中添加一些元数据才能访问用户ID对吗? 是的,如果您想存储任意信息(例如系统中的用户 ID),您可以使用 metadata,它可以在许多 Stripe 对象上设置。 我看不出系统中经过身份验证的用户 ID 对结帐中涉及的端到端事件是如何任意的。如果会话唯一地涉及单个结帐,那么由于该会话而生成的后续事件为什么不携带此关键信息?这似乎是一个条带化业务决策,让开发人员倾向于使用条带化客户对象作为键,从而不必要地使系统与 Stripe 纠缠在一起。以上是关于Stripe 订阅 webhook 缺少元数据和 client_reference_id的主要内容,如果未能解决你的问题,请参考以下文章
使用 Stripe Firebase 扩展 Webhook 运行订阅付款未触发