【问题标题】:How to send metadata in stripe during checkout process?如何在结帐过程中以条带形式发送元数据?
【发布时间】:2022-02-05 15:54:14
【问题描述】:
const combineData = function (prod, pot, data) {
const newData = [...prod, ...pot];
const finalCheckout = [];

for (let i = 0; i < newData.length; i++) {
finalCheckout.push({
  name: newData[i].plantName || newData[i].potName,
  images: [newData[i].images[0]],
  amount: newData[i].price * 100,
  currency: "inr",
  quantity: data[i].quantity,
  
  metadata: { id: String(newData[i]._id) },// **Mongoose ID**
});
}
return finalCheckout;
};

exports.getCheckOutSession = catchAsync(async (req, res, next) => {
   const [product, pot] = filterVal(req.body.product);
   const userId = req.user._id;

   const products = await ProductModel.find({ _id: { $in: product } });
   const pots = await PotModel.find({ _id: { $in: pot } });
   const newData = combineData(products, pots, req.body.product);

   // 2. create the checkout session
   const session = await stripe.checkout.sessions.create({
      payment_method_types: ["card"],
      success_url: `${req.protocol}://${req.get("host")}/?alert=booking`,
      cancel_url: `${req.protocol}://${req.get("host")}/products/`,
      customer_email: req.user.email,
      client_reference_id: userId,
      line_items: newData,
   });

  res.status(200).json({
    status: "success",
    url: session.url,
  });
});

我正在建立一个电子商务网站,当用户付款时,我想将存储在我的 mongodb 数据库中的产品 ID 作为条带元数据发送。但是我遇到了一个错误,如何解决这个问题。

错误:parameter_unknown - line_items[0][元数据] 收到未知参数:line_items[0][元数据]

Stripe 拒绝 mongodb id 的元数据

“元数据”:{ “id”:“61e40a5a7d83539092e7a92f” }

注意:我在上面的 combineData 函数中发送了所有成功的数据,例如价格、名称、图像数量、数量。

  1. 我已经在没有元数据键的情况下测试了上面的代码。它工作正常,我的付款已注册,并且 webhook 事件已在条带中注册。
  2. 当我使用元数据关键字时,上述错误出现在条带中。

【问题讨论】:

  • 我在 combineData 函数中传递有关产品的所有数据,如产品名称、数量、价格、图像、数量等。我想发送额外的数据,即元数据中的产品 ID 怎么做?

标签: javascript node.js mongodb backend payment


【解决方案1】:

您需要先创建产品+价格。

在通知 stripe 订单项后,session token 会返回给客户端,然后用户会被重定向到 stripe 的支付页面。

通过您在创建会话时提交的订单项,Stripe 将能够知道要向用户显示哪些项目(例如图像、产品名称、产品描述)。

如果你只传递一个 MongoDB _id,stripe 将不知道要显示哪些项目,因为它们没有产品信息。

  const session = await stripe.checkout.sessions.create({
    customer: customerId,
    billing_address_collection: 'auto',
    payment_method_types: ['card'],
    line_items: [
      {
        price: STRIPE_PRODUCT_PRICE, //price of created product
        // For metered billing, do not pass quantity
        quantity: 1,
      },
    ],
    // success_url: `${YOUR_DOMAIN}?success=true&session_id={CHECKOUT_SESSION_ID}`,
    // cancel_url: `${YOUR_DOMAIN}?canceled=true`,
  });

剥离产品和价格 ID 的外观示例。一种产品可以有多种不同的价格。

STRIPE_PRODUCT=prod_I7a38cue83jd
STRIPE_PRICE=price_1HXL0wBXeaFPR83jhdue883

这些参考资料对您很有用。

创建产品:https://stripe.com/docs/api/products/create

创建价格:https://stripe.com/docs/api/prices/create

我通常会将产品 ID 和价格 ID 作为 stripe_product_id 和 stripe_product_price 存储在本地 MongoDB 数据库中,以便您在结帐时使用。

所以在你收到订单后,你可以先创建一个本地订单,加上产品和数量,然后...

  const line_items = ordered_products.map(product => ({ price: product.stripe_product_price, quantity: product.quantity }))

  const session = await stripe.checkout.sessions.create({
      ....
      line_items,
      ...
  })

高级方法 - 随时随地创建产品和价格。

这比较繁琐,因为你需要做更多的检查。

您可以参考以下链接中的条带文档创建 line_items。

https://stripe.com/docs/api/checkout/sessions/object

【讨论】:

    猜你喜欢
    • 2021-07-21
    • 2021-12-25
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多