javascript 完成事务后发送响应-条带化

0pizxfdo  于 2023-01-01  发布在  Java
关注(0)|答案(2)|浏览(106)

经过与ChatGPT长时间的讨论,我设法编写了代码,将用户重定向到Stripe支付页面,然后在交易成功完成时捕获一个事件。问题是我的fetch请求已经收到了来自/checkout端点的响应,并且没有等待来自/webhook的响应。我希望我的API在成功完成交易后返回一个正确生成的响应。我做错了什么?
首先,我向/checkout端点发送一个请求,该端点负责生成支付链接并将其发回:

fetch('http://localhost:3001/checkout', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        items: [
            {
                id: 0,
            },
        ],
    }),
})
    .then((res) => {
        if (res.ok) return res.json();
        return res.json().then((e) => console.error(e));
    })
    .then(({url}) => {
        console.log(url);
        window.location = url;
    })
    .catch((e) => {
        console.log(e);
    });

当我按下按钮时,此代码会将我重定向到条纹付款页面。
终点/checkout

app.post('/checkout', async (req, res) => {
  try {
      const session = await stripe.checkout.sessions.create({
          payment_method_types: ['card'],
          line_items: req.body.items.map(({id}) => {
              const storeItem = storeItems.get(id);
              return {
                  price_data: {
                      currency: 'pln',
                      product_data: {
                          name: storeItem.name,
                      },
                      unit_amount: storeItem.priceInCents,
                  },
                  quantity: 1,
              };
          }),
          mode: 'payment',
          success_url: `${process.env.CLIENT_URL}/success.html`,
          cancel_url: `${process.env.CLIENT_URL}/cancel.html`,
      });
      console.log(session.url);
      res.json({url: session.url});
  } catch (e) {
      // If there is an error send it to the client
      console.log(e.message);
      res.status(500).json({error: e.message});
  }
});

我使用stripe listen --forward-to localhost:3001/webhook将StripeCLI连接到我的服务器,现在我可以使用/webhook端点捕获成功的事务事件,但是我无法将The transaction was successful返回给客户端:

app.post('/webhook', (req, res) => {
  const event = req.body;

  if (event.type === 'checkout.session.completed') {
      res.send('The transaction was successful');
  }
});
0tdrvxhp

0tdrvxhp1#

成功付款后,客户应重定向回您的网站。在那里您可以创建成功页面。

success_url: `${process.env.CLIENT_URL}/success.html`,

如果你想得到一些数据从Strapi后paymant是成功的页面,你可以添加这个

success_url: `${process.env.CLIENT_URL}/success.html?&session_id={CHECKOUT_SESSION_ID}`

在succes页面,你只需解构数据。然后对它们做任何你想做的事情:)
如果你像这样解构对象:(下一个. js)

const stripe = require("stripe")(`${process.env.STRIPE_SECRET_KEY}`);

export async function getServerSideProps(params) {
  const order = await stripe.checkout.sessions.retrieve(
    params.query.session_id,
    {
      expand: ["line_items"],
    },
  );
  const shippingRate = await stripe.shippingRates.retrieve(
    "shr_1MJv",
  );

  return { props: { order, shippingRate } };
}

export default function Success({ order, shippingRate }) {
  const route = useRouter();

你可以注销整个对象,看看里面有什么

console.log(order);

如果付款成功,则应输入prop变量:付款状态:“已付”

yizd12fk

yizd12fk2#

Stripe会自动将客户端重定向到您在创建Stripe会话时指定的success_url
例如,您可以使用webhook将订单保存在数据库中,但不能重定向客户端。

相关问题