【问题标题】:Stripe subscription webhooks missing metadata and client_reference_idStripe 订阅 webhook 缺少元数据和 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: `...`,
        });

【问题讨论】:

    标签: stripe-payments


    【解决方案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 纠缠在一起。
    猜你喜欢
    • 2016-10-18
    • 2014-05-01
    • 2023-03-11
    • 2021-01-19
    • 2017-03-04
    • 2023-03-19
    • 2021-02-16
    • 1970-01-01
    • 2020-12-05
    相关资源
    最近更新 更多