Stripe 订阅 Webhook 缺少元数据和 client_reference_id

Ign*_*nis 8 stripe-payments

我在将 stripe webhooks 链接到客户时遇到问题,因为我通常使用 client_reference_id 或元数据字段,但是订阅 webhooks 似乎没有这些字段。例如,事件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: `...`,
        });
Run Code Online (Sandbox Code Playgroud)

Abd*_*jid 5

是的,这是一个重大的缺失,因为没有选项可以在事件之间建立联系。当您无法依赖 Webhook 事件的顺序时,这一点就变得至关重要。

不过,我确实解决了这个问题metadata。例如,将您自己的参考 ID 传递my_database_reference_id给两者的元数据checkout.session.create以及subscription_data结帐创建中的元数据。这可以与您在内部传递的值相同client_reference_id。现在,您可以在侦听 Webhook 时使用它,以在结账会话和订阅对象之间进行连接,而不管其进入的顺序如何。

注意:请注意,Stripe 帐户可以编辑元数据,因此如果您是平台并依赖于此进行任何逻辑,请小心。

  • 谢谢,subscription_data.metadata 正是我正在寻找的! (3认同)

Jus*_*ael 3

client_reference_id是 Stripe 中 Checkout Session 对象的属性,但不是任何其他 Stripe 对象的属性。

订阅事件(如customer.subscription.created)描述订阅对象,发票事件(如invoice.paid)描述发票,两者都不是结帐会话,因此缺少该属性。

通常,所有这些链接在一起的方式是使用cus_123Stripe 中的 Customer 对象 (),该对象应该出现在属性中提到的所有事件中customer如果您未指定现有对象,Checkout 将为您创建 Customer 对象。