Witam,
po długich rozmowach z ChatGPT udało mi się napisać kod, który przekierowuje użytkownika na stronę płatności Stripe, a następnie przechwytuje zdarzenie po pomyślnym sfinalizowaniu transakcji.
Na początku wysyłam żądanie na punkt końcowy /checkout, który zajmuje się wygenerowaniem linku do płatności i jego odesłaniem:

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);
    });

Ten kod po naciśnięciu przycisku przekierowuje mnie na stronę płatności Stripe.
Punkt końcowy /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});
  }
});

Połączyłem StripeCLI z moim serwerem używając stripe listen --forward-to localhost:3001/webhook. Teraz mogę przechwycić zdarzenie pomyślnej transakcji używając punktu końcowego /webhook:

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

  if (event.type === 'checkout.session.completed') {
      res.send('Transakcja została pomyślnie sfinalizowana');
  }
});

Problem: Problemem jest to, że moje żądanie fetch dostało już odpowiedź z punktu końcowego /checkout i nie czeka na odpowiedź z /webhook. A ja chciałbym, żeby po pomyślnym sfinalizowaniu transakcji moje API zwróciło odpowiednio wygenerowaną odpowiedź. Co robię źle?