我在将 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)
是的,这是一个重大的缺失,因为没有选项可以在事件之间建立联系。当您无法依赖 Webhook 事件的顺序时,这一点就变得至关重要。
不过,我确实解决了这个问题metadata。例如,将您自己的参考 ID 传递my_database_reference_id给两者的元数据checkout.session.create以及subscription_data结帐创建中的元数据。这可以与您在内部传递的值相同client_reference_id。现在,您可以在侦听 Webhook 时使用它,以在结账会话和订阅对象之间进行连接,而不管其进入的顺序如何。
注意:请注意,Stripe 帐户可以编辑元数据,因此如果您是平台并依赖于此进行任何逻辑,请小心。
这client_reference_id是 Stripe 中 Checkout Session 对象的属性,但不是任何其他 Stripe 对象的属性。
订阅事件(如customer.subscription.created)描述订阅对象,发票事件(如invoice.paid)描述发票,两者都不是结帐会话,因此缺少该属性。
通常,所有这些链接在一起的方式是使用cus_123Stripe 中的 Customer 对象 (),该对象应该出现在属性中提到的所有事件中customer。 如果您未指定现有对象,Checkout 将为您创建 Customer 对象。