提问者:小点点

Stripe AxiosError:请求失败,状态码为500


我正在尝试按照此示例在NextJS中实现Stripe签出。

但我总是得到这个错误:

checkout. js:

    import React from "react";
    import Header from "../components/Header";
    import Image from "next/image";
    import { selectItems, selectTotal } from "../slices/basketSlice";

    import { useSelector } from "react-redux";
    import CheckoutProduct from "../components/CheckoutProduct";
    import Currency from "react-currency-formatter";
    import { useSession } from "next-auth/react";
    import {loadStripe} from '@stripe/stripe-js';
    
    import axios from 'axios';
    const stripePromise = loadStripe(process.env.stripe_public_key)
    
    function Checkout() {
      const items = useSelector(selectItems);
      const total = useSelector(selectTotal);
      const { data: session } = useSession();
    
      const CreateCheckoutSession = async () => {
        const stripe = await stripePromise
    
        // create checkout session
        const checkoutSession = await axios.post("/api/create-checkout-session", {
          items : items,
          email: session.user.email,
        })
        //redirect user to Stripe checkout
        const result = await stripe.redirectToCheckout({
            sessionId: checkoutSession.data.id
        })
    
        if (result.error) {
          alert(result.error.message)
        }
      }

create-checkout-session. js(尝试在文档页面上这样做,但得到相同的结果):

const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY)


export default async (req, res) => {
    const {
        items,
        email
    } = req.body

    // console.log(items)
    //console.log(email)
    // console.log(process.env.STRIPE_SECRET_KEY)

    const transformedItems = items.map(item => ({
        description: item.description,
        quantity: 1,
        price_data: {
            currency: 'usd',
            unit_amount: item.price * 100,
            product_data: {
                name: item.title,
                images: [item.image]
            },
        },
    }))


    const session = await stripe.checkout.sessions.create({
        payment_method_types: ['card'],
        mode: 'payment',
        shipping_rates: ['shr_1MFhHmL1z8EG1fYglFH9EBP7'],
        shipping_address_collection: {
            allowed_countries: ['GB', 'US', 'CA']
        },
        line_items: transformedItems,
        success_url: `${pocess.env.HOST}/success`,
        cancel_url: `${process.env.HOST}/checkout`,
        metadata: {
            email,
            images: JSON.stringify(items.map(item => item.image))
        }
    })
}


res.status(err.statusCode || 500).json(err.message);


res.status(200).json({
    id: session.id
})

在我看来,我遵循Stipe格式,但一直得到这个无用的错误。有人知道这意味着什么吗?


共3个答案

匿名用户

错误似乎来自您自己的服务器,而不是Stripe的API。在您的create-checkout-session. js文件中,异步函数的范围似乎在您运行res.status(xxx).json(…)之前结束。

在这种情况下,session变量超出了您的res. status(…).json(…)函数的范围。此外,我怀疑这段代码正在发送500res.status(err.statusCode||500).json(err.message);,因为它不知道err变量是什么。

您是否可以尝试修复范围以及定义err变量,看看这是否会有所不同?

匿名用户

以防这对某人有帮助。

事实证明,我使用的Stripe api版本具有不同的格式要求,因此描述需要在product_data数组中。

我发现Stripe留档很难导航。我不明白为什么不为所有项目使用平面数组,为什么要继续嵌套-重新嵌套项目?:(

匿名用户

stripe-session sion-checkout. js图像

删除运费和付款方式类型

对我很管用