Stripe with node.js +快速结帐问题

qxsslcnc  于 2023-06-22  发布在  Node.js
关注(0)|答案(1)|浏览(118)

我试图将条纹集成到我的结帐,我得到了一个小错误,我似乎无法修复。当点击checkout按钮时,不是得到checkout页面,而是显示以下内容:{“url”:“https://checkout.stripe.com/c/pay/cs_test_rest_of_link_here“}所以不知何故,我没有得到指导,因为我应该。以下是我到目前为止拥有的代码:

customer_cart控制器文件

const AllProduct = require('../database_models/allproduct');
const stripe = require("stripe")(process.env.STRIPE_SECRET_KEY)
module.exports.checkout = async (req, res) => {
    if (!req.session.cart) {
        req.flash('error', 'There are no items to be checked out');
        res.redirect('/');
    }
    try {
        const session = await stripe.checkout.sessions.create({
            payment_method_types: ['card'],
            mode: 'payment',
            line_items: req.session.cart.map(item => {
                return {
                    price_data: {
                        currency: 'gbp',
                        product_data: {
                            name: item.productName
                        },
                        unit_amount: item.itemPrice
                    },
                    quantity: item.quantity * 100
                }
            }),
            success_url: `${process.env.SERVER_URL}/success`,
            cancel_url: `${process.env.SERVER_URL}/cancel.html`
        })
        res.json({ url: session.url })
    } catch (error) {
        res.status(500).json({ error: error.message })
    }
};

客户路由文件

// Require Modules
const express = require('express');
const router = express.Router();

const cart = require('../controllers/customer_cart');

const catchAsync = require('../utils/catchAsync');
const ExpressError = require('../utils/ExpressError');

const { productSchema } = require('../joivalidations.js');
const { isLoggedIn } = require('../middleware');

const AllProduct = require('../database_models/allproduct');

router.get('/add/:id', isLoggedIn, catchAsync(cart.addToCart));

router.get('/', isLoggedIn, catchAsync(cart.viewCart));

router.get('/clear', isLoggedIn, catchAsync(cart.clearCart));

router.get('/checkout', isLoggedIn, catchAsync(cart.checkout))
router.post('/checkout', isLoggedIn, catchAsync(cart.checkout));

module.exports = router;

和checkout.ejs文件

<% layout('layouts/productboilerplate')%>

    <h1>TEST</h1>

    <!-- Display a payment form -->
    <button>Checkout</button>

    <script>
        const button = document.querySelector("button")
        button.addEventListener("click", () => {
            fetch('/cart/checkout', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify({
                    items: req.session.cart,
                }),
            }).then(res => {
                if (res.ok) return res.json()
                return res.json().then(json => Promise.reject(json))
            }).then(({ url }) => {
                console.log(url)
                window.location.href = url
            }).catch(error => {
                console.error(error)
            })
        })
    </script>

我怀疑我没有正确处理checkout.ejs文件中的url属性,但我希望能得到一些意见,因为我已经开始在这方面很长时间了,并没有很快得到任何进展
先谢谢你了

8e2ybdfx

8e2ybdfx1#

一般看起来不错。你在这里使用JSON数据进行响应:res.json({ url: session.url })
所以你应该跟踪你的fetch().then()...链,看看哪里出错了。
你得到res.ok了吗?您看到console.log(url)输出了吗?一步一步来,确保你在每个阶段都得到了预期的结果。

相关问题