繁体   English   中英

付款成功后删除所有购物车物品

[英]On payment success remove all cart items

我已将 Stripe api 集成到我的电子商务网站中。 当您结帐时,您会被发送到您在其中输入信息的 stripe api 付款链接。 当然,这里可能会发生两件事,要么付款通过并成功,要么订单被取消。 一切正常,除了我试图仅在付款成功并通过时删除所有购物车物品。

这是我的代码:

app.post('/api/createCheckoutSession', async (req, res) => {


    try {
        const session = await stripe.checkout.sessions.create({
            payment_method_types: ['card'],
            mode: 'payment',
            line_items: req.body.items.map(item => {
                const storeItem = storeItems.get(item.id)
                return {
                    price_data: {
                        currency: 'usd',
                        product_data: {
                            name: storeItem.name
                        },
                        unit_amount: storeItem.priceInCents
                    },
                    quantity: item.quantity
                }

            }),
            success_url: `${process.env.SERVER_URL}`,
            cancel_url: `${process.env.SERVER_URL}cart`,
        })

        res.json({ url: session.url })
    } catch (e) {
        console.log(e)
        res.status(500).json({ error: e.message })
    }

});

因此,如果我执行以下代码,我可以从用户中删除所有 cartItems,但是无论付款是否成功,都会发生这种情况:

app.post('/api/createCheckoutSession', async (req, res) => {


    try {
        const session = await stripe.checkout.sessions.create({
            payment_method_types: ['card'],
            mode: 'payment',
            line_items: req.body.items.map(item => {
                const storeItem = storeItems.get(item.id)
                return {
                    price_data: {
                        currency: 'usd',
                        product_data: {
                            name: storeItem.name
                        },
                        unit_amount: storeItem.priceInCents
                    },
                    quantity: item.quantity
                }

            }),
            success_url: `${process.env.SERVER_URL}`,
            cancel_url: `${process.env.SERVER_URL}cart`,

        })


        cartItem.remove({ user: req.body.user }, function (err) {
            if (err) {
                console.log(err)
            }
        })

        res.json({ url: session.url })
    } catch (e) {
        console.log(e)
        res.status(500).json({ error: e.message })
    }
    });

因此,查看 Stripe api 文档并在谷歌上搜索唯一始终出现的是success_url,这不是我想要的(至少我认为它不会解决我想要做的事情)。 因此,对于原始代码,我尝试console.log(session)并找到了payment_status: 'unpaid'并认为我可以使用它来执行以下操作:

app.post('/api/createCheckoutSession', async (req, res) => {


    try {
        const session = await stripe.checkout.sessions.create({
            payment_method_types: ['card'],
            mode: 'payment',
            line_items: req.body.items.map(item => {
                const storeItem = storeItems.get(item.id)
                return {
                    price_data: {
                        currency: 'usd',
                        product_data: {
                            name: storeItem.name
                        },
                        unit_amount: storeItem.priceInCents
                    },
                    quantity: item.quantity
                }

            }),
            success_url: `${process.env.SERVER_URL}`,
            cancel_url: `${process.env.SERVER_URL}cart`,

        })


        console.log(session)
        if (session.payment_status == 'paid') {
        cartItem.remove({ user: req.body.user }, function (err) {
            if (err) {
                console.log(err)
            }
        })
        }


        res.json({ url: session.url })
    } catch (e) {
        console.log(e)
        res.status(500).json({ error: e.message })
    }



});

使用上面的代码,if 语句不起作用,因为只有在会话首次创建时才会将某些内容记录到控制台,因此 if 语句在支付成功或被取消后不会执行。

另一个解决方案是让我创建一个不同的success_url,它会在其中弹出,并且我有一个react useEffect 调用remove cart items 函数。 然后它再次重定向到其他地方,但正如我之前提到的,这似乎是一个糟糕的解决方案,因为我感觉我只是错过了一些非常简单的东西来让它按照我尝试的方式工作。

我将重申我认为你的目标是什么,所以我很清楚答案是什么。

将用户发送到结帐后,您希望应用处理 2 个潜在结果:

  • 支付成功:拿钱,拿货
  • 付款取消:清空用户购物车

您遇到的问题是您的代码只能等待用户会话的创建 此时,您应该只重定向到 Checkout URL。 此时,您的代码不知道付款是否会通过,因为用户只是被重定向到他们可以付款的 Checkout UI。

用户付款的状态会以 2 种不同的方式反馈给您的应用。

  • 自定义的成功/取消 URL - 虽然此文档侧重于捕获成功 URL 中的会话 ID,但您可以对取消 URL 执行相同的操作。 在这种情况下,用户被发送到哪个 URL 会告诉您的系统 Checkout 是成功还是被取消。 注入 URL 的会话 ID 标识了它是哪个 Checkout 会话。

  • 签出 Webhook 事件- 此方法提供成功确认,但需要等到会话过期才能确认取消。 尽管如此,还是建议大多数集成使用Webhook来监控帐户活动。

因此,回到您的代码,我会将清除购物车的代码移动到一个函数,该函数响应用户被重定向到应用程序中的cancel_url或响应checkout.session.expired webhook 事件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM