使用Stripe API,我意识到checkoutSession创建不一致。
回想一下:您可以在服务器上创建一个 checkoutSession,成功后,您将在 Stripe 控制台上获得
payment
信息。
还要记住:您可以使用两种不同的
modes
创建结账会话:a) mode = payment
或 mode = subscription
。
现在的问题是:
如果我使用
mode = 'payment'
创建 checkoutSession,那么我会在 metadata
元数据中找到 payment
字段。 (即在控制台中 Payments: Metadata
下清晰可见)
如果我使用
mode = 'subscription'
创建 checkoutSession,那么我在 metadata
元数据中找不到 payment
字段。 (但元数据可以在 Subscriptions
控制台下找到。
问题:如何确保
Payments
控制台的元数据也显示元数据(首先创建 checkoutSession 时给出的元数据)??
const checkoutSession: checkout_sessions = {
id: checkoutSessionId,
mode: 'subscription',
customer: customerId,
client_reference_id: referenceId,
currency: currency,
created: Date.now() / 1000,
line_items: line_items,
success_url: session.success_url,
metadata: {
checkoutSessionId: checkoutSessionId,
// bunch of other metadata-properties
},
billing_address_collection: 'auto',
};
const returnCheckoutSession = await customer.checkout_sessions.create(checkoutSession);
上面的代码清楚地说明了
mode = 'subscription'
,并且还包括元数据属性。但是成功的 payment
的结果元数据字段是 null
?我怎样才能改变它?
(我不关心是否可以在订阅面板下找到元数据。我只感兴趣将它们放入
Payments
控制台的元数据中。即相同的位置,它们最终也以mode = 'payment'
......
Stripe API 中的元数据是每个 API 资源,并且在几乎所有情况下都不会自动复制到其他 API 资源。有一些例外,例如 Charge 在创建时继承其父 PaymentIntent 的元数据,但这种情况很少见。
您共享的代码在
Checkout SessionAPI 资源上设置
metadata
。预计它不会被复制到 API 中生成的 PaymentIntent 或 Charge 或 Subscription。您提到您在控制台中看到它,我认为这意味着仪表板,但这可能指的是结帐本身。
相反,您应该做的是显式强制底层对象上的元数据。对于付款,您希望使用
payment_intent_data[metadata]
参数;对于订阅,您希望使用 subscription_data[metadata]
参数。
了解订阅模式也很重要,它将在 Subscription API 资源上设置元数据。这不会神奇地被发票、PaymentIntent 或费用继承。如果您想要的话,您必须在创建每个 Invoice 或 PaymentIntent 后编写一些代码/逻辑来自己同步。