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?