创建Stripe结账会话时遭遇CORS错误,求解决方案
解决Stripe创建Checkout Session时的CORS重定向错误
问题核心原因
你遇到的CORS预检请求被拦截问题,主要是Firebase云函数的定义格式错误,导致请求无法正确匹配到函数逻辑,触发了非法重定向;同时Stripe的必填参数缺失也会加剧请求异常。
具体修复步骤
1. 修正云函数的定义格式
你的functions/index.ts中,createCheckoutSession被错误地套了一层函数包装,这会导致Firebase无法正确识别函数入口,部署后请求会被重定向,触发CORS拦截。
错误代码:
export const createCheckoutSession = () => functions .region("asia-northeast1") .https.onCall(async (data) => { // ... });
修正后的代码:
import * as functions from "firebase-functions"; import Stripe from "stripe"; const stripe = new Stripe(functions.config().stripe.secret, { apiVersion: "2022-11-15", }); export const createCheckoutSession = functions .region("asia-northeast1") .https.onCall(async (data) => { const priceId = data.priceId; const session = await stripe.checkout.sessions.create({ line_items: [{ price: priceId, quantity: 1, }], mode: "payment", // 替换为你的实际页面URL,不能为空 success_url: "https://your-domain.com/success", cancel_url: "https://your-domain.com/cancel", payment_method_types: ["card"], }); return session; });
2. 补充Stripe必填的URL参数
Stripe创建Checkout Session时,success_url和cancel_url是强制要求项,不能留空。必须填写用户支付成功/取消后跳转的有效页面地址,否则Stripe API会返回错误,间接导致请求异常。
3. 重新部署云函数
修改完成后,执行以下命令重新部署Firebase云函数:
firebase deploy --only functions
4. 本地开发可选配置(避免跨域)
如果是本地开发,建议连接Firebase Functions模拟器,规避真实环境的跨域问题。在src/firebase.ts中添加:
import { connectFunctionsEmulator } from "firebase/functions"; // 仅在开发环境连接模拟器 if (process.env.NODE_ENV === "development") { connectFunctionsEmulator(functions, "localhost", 5001); }
内容的提问来源于stack exchange,提问作者Ika
相关产品推荐
相关产品推荐

