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 结帐会话与订阅 webhook 关联

从 Stripe webhook .Net 中提取元数据

收到 Stripe Webhook 后将项目保存在数据库中

使用 Stripe Firebase 扩展 Webhook 运行订阅付款未触发

如何在Stripe PHP和webhook中使用好事件,比较收到的付款数量并取消订阅

Stripe:在创建时将元数据添加到订阅