NodeJS 为什么我在React应用程序中尝试将 checkout 页面重定向到Stripe checkout 时遇到CORS问题?

0wi1tuuw  于 2023-06-05  发布在  Node.js
关注(0)|答案(1)|浏览(117)

我正在尝试在我的React应用程序中实现Stripe checkout 。目前我的“购物篮”页面包含一个结帐按钮,它调用以下表单提交-

const handleSubmit = async(e) => {
    e.preventDefault();
    try {
      const response = await fetch('/create-checkout-session', {
        method: 'POST',
        // mode: "no-cors", // no-cors, *cors, same-origin
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({productId}),
      });
  
      if (response.ok) {
        console.log('Request sent successfully');
      } else {
        console.log('Request failed');
      }
    } catch (error) {
      console.log('Error occurred during the request', error);
    }
  }

这调用了我的API

app.post('/create-checkout-session', async (req, res) => {
    // Get the selected product ID from the frontend
    const { productId } = req.body;

    console.log(productId)

    // Define a mapping of product IDs to prices
    const priceMap = {
        bricky_id: 'price_1NA7O1JVu65LdnVcBljr473q',
        sub_id: 'price_1NA64tJVu65LdnVcfgUwbhUA',
        // Add more product IDs and their corresponding prices here
      };
    
    //   Get the price based on the selected product ID
      const price = priceMap[productId];

      console.log(price);
    
      if (!price) {
        // Handle invalid product ID
        return res.status(400).json({ error: 'Invalid product selected' });
      }
const session = await stripe.checkout.sessions.create({
    line_items: [
        {
            price: price,
            quantity: 1,
        },
        {
            price: 'price_1NA64tJVu65LdnVcfgUwbhUA',
            quantity: 1
        }
    ],
    mode: 'subscription',
    success_url: `http://localhost:4000/order-success`,
    cancel_url: `http://localhost:4000/order-preview`,
});
res.redirect(303, session.url);
// res.redirect({url: session.url});
// res.redirect(session.url);
});

当我在请求体中没有任何内容时进行简单调用时,我会重定向到第三方条带结账页面,但是一旦我将详细信息传递到请求体中,我就会在浏览器中获得以下CORS错误-
访问获取在'https://checkout.条纹。com/c/pay/cs_test_b1SYlrHX7s9b3q2o08lxTvWtMvkV7UJ1ifRvv6tzoHMSGCMIygdCDm9hXD@@#fidkdWxOYHwnPyd1blpxYHZxWjA0Szxpf2RPU3AzMElha1NmbFRjR3N9PU5dS1ZDbnJwQ DJqX21Vb1IzM048TDFgQ2ZWYW5rbkpqXHA3PDVLYndCTnRVTnxAPTRyaH1dQ0djNTxvTTV1NFJQNTVRVlVXTW1LVycpJ2N3amhWYHdzYHcnP3F3cGApJ2lkfGpwcVF8dWAnPydocGlxbFp@WBoJyknYGtkZ2lgVWlkZmBtamlhYHd2Jz9xd3BgeCUl'(重定向自'http://localhost:3000/create-checkout-session')来自源' http://localhost:3000 '已被CORS策略阻止:对印前检查请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果一个不透明的响应满足了你的需求,将请求的模式设置为“no-cors”,以在禁用CORS的情况下获取资源。
OrderPreview. js:11 GET https://checkout.stripe.com/c/pay/cs_test_b1SYlrHX7s9b3q2o08lxTvWtMvkV7UJ1ifRvv6tzoHMSGCMIygdCDm9hXD net::ERR_FAILED
我的React应用程序目前正在使用“代理”:"http://localhost:4000",用于向后端请求。
我正试图从FE向BE传递项目信息,并使用该信息重定向到条带中的正确页面,但CORS阻止了请求。
我已将以下内容添加到我的服务器文件中,

app.use(cors())
app.use(function(req, res, next) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
res.setHeader('Access-Control-Allow-Credentials', true);
next();
  });

我也尝试了各种格式的回应,我已经离开了评论。//redirect({url:});//res.redirect(session.url);
我觉得我误解了这个问题,因为重定向在从前后传递信息之前就开始工作了。我想知道这个问题是否与代理有关?
任何建议将不胜感激。

pxq42qpu

pxq42qpu1#

正如@codename_duchess所说,尝试将重定向移到前面,并尝试在您的帖子请求中添加内容类型:

const handleSubmit = async(e) => {
e.preventDefault();
try {
const response = await fetch('/create-checkout-session', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({productId}),
});

if (response.ok) {
  console.log('Request sent successfully');

  // Fetch the session URL from the response
  const { url } = await response.json();

  // Redirect the user to the Stripe Checkout page
  window.location.href = url;
 } else {
   console.log('Request failed');
  }
}catch (error) {
  console.log('Error occurred during the request', error);
 }

}

相关问题