簡體   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