NodeJS 如何在Stripe的checkout.session.completed事件后完成订单?

mznpcxlj  于 2022-12-12  发布在  Node.js
关注(0)|答案(1)|浏览(208)

我的问题是Stripe的元数据对象有500个字符的限制。我有一个工作结帐流程,但我唯一的限制是我的购物车的字符限制。我的cartItems对象有额外的和客户注解,我想包括每个购物车项目。与此同时,元数据限制得到500个字符快。我读了另一个职位here,在我的应用程序中实现了websockets,这样我就可以在监听到stripes事件后使用它来创建订单。我该怎么做呢?还有其他的解决方法吗?

let endpointSecret;
endpointSecret =
  "whsec_bd73383ed0fcf9cfb27bd4929af341605ad32577dfd8825e1143425b846bb3c3";

router.post("/webhook", (request, response) => {
  const sig = request.headers["stripe-signature"];

  let data;
  let eventType;

  if (endpointSecret) {
    let event;

    try {
      event = stripe.webhooks.constructEvent(
        request.rawBody,
        sig,
        endpointSecret
      ); //@JA - Had to modify this to take the rawBody since this is what was needed.
    } catch (err) {
      response.status(400).send(`Webhook Error: ${err.message}`);
      return;
    }

    data = event.data.object;
    eventType = event.type;
  } else {
    data = request.body.data.object;
    eventType = request.body.type;
  }

  // Handle the event
  if (eventType === "checkout.session.completed") {
    stripe.customers
      .retrieve(data.customer)
      .then((customer) => {
        console.log("customer:", customer);
        console.log("data:", data);
        createOrder(customer, data);
      })
      .catch((err) => console.log(err.message));
  }
mspsb9vt

mspsb9vt1#

您通常不会在元数据中传递所有购物车信息,您通常会将该信息存储在自己的数据库中,然后根据与该数据对应的UUID和您在Checkout Session上通过元数据设置的订单ID(然后通过Webhook返回)检索必要的信息。
给予一个我上面推荐的例子--
在您的数据库中,您将拥有类似以下的内容:
| 订单编号|购物车项目1|购物车项目1说明|购物车项目2...|
| - -|- -|- -|- -|
| 小行星123456|帽子|红色的|嵌接|
| 小行星123457|短袜|蓝色的||
当您创建结帐会话时,只需将订单ID作为元数据传递。当您收到checkout.session.completed Webhook时,该元数据将指示订单ID,这样您就拥有了履行和对帐所需的所有数据(并且您可以相应地更新数据库)。
此外,为了消除误解,使用Stripe's metadata可以有50个键,每个键的值最长为500个字符。

相关问题