我创建了一个条带结帐会话,在其中传递从 line_items 属性中的请求正文收到的产品。在每个产品的 product_data 中,我添加了一个包含产品 id 的 元数据。
try {
const cart: ICart[] = req.body.cart;
const accountEmail: string = req.body.account;
const tax: number = req.body.tax;
const discountId: string = req.body.discount;
const cartItems: Stripe.Checkout.SessionCreateParams.LineItem[] =
cart.map((item): Stripe.Checkout.SessionCreateParams.LineItem => {
return {
price_data: {
currency: "mad",
product_data: {
name: item?.name,
description: item?.description,
images: item?.images,
metadata: { id: item?._id },
},
unit_amount: item?.amount * 100,
},
quantity: item?.quantity,
};
});
// create the checkout session
const session = await stripe.checkout.sessions.create({
currency: "mad",
ui_mode: "hosted",
line_items: [
...(cartItems as Stripe.Checkout.SessionCreateParams.LineItem[]),
],
billing_address_collection: "required",
mode: "payment",
customer_email: accountEmail,
metadata: {
email: accountEmail,
tax: tax,
discount: discountId,
},
success_url: `${env.APP_URL}/success?session_id={CHECKOUT_SESSION_ID}`,
cancel_url: `${env.APP_URL}/success?session_id={CHECKOUT_SESSION_ID}`,
});
res.status(200).json({
status: "success",
session,
clientSecret: session.client_secret,
});
} catch (err) {
console.log(err);
}
然后我创建了一个 webhook 来侦听 checkout.session.completed 事件类型,在其中我检索该特定结帐会话的 line_items,目的是创建 订单文档(因为我正在工作)与 mongoose)并将其保存在我的数据库中,但问题是:我找不到我在每个产品的元数据中定义的 id。
// in the webhook's swith case
// retrieving the line items
case "checkout.session.completed":
const checkoutSessionCompleted = event.data.object;
// Retrieve the session's line items
const lineItems = (await stripe.checkout.sessions.listLineItems(checkoutSessionCompleted.id)).data.map((item) => {
return {
_id: item.price?.metadata?.id, // returns undefined
quantity: item.quantity, // returns the quantity
}
});
如果您需要证据,这里是 stripe api 文档的链接: stripe-api 文档检索 line_items
谢谢,
通过查看您的代码,我可以看出,您已在 cartItems/price_data/product_data/metadata 中分配了 id,该 id 作为 line_items 传递。但是,您正在尝试检索尚未分配的 line_items(cartItems)/price(price_data)/metadata 。 您要搜索的 ID 分配在 line_items(cartItems)/price(price_data)/product_data (也许某些别名无法在文档中找到该值)/metadata