Stripe报错:A token may not be passed in as a Source 问题求助
Stripe支付错误:A token may not be passed in as a Source 解决办法
你遇到的错误核心原因是:Stripe的PaymentIntents API不允许直接传入Stripe Token作为source参数,必须先将Token转换为Source对象后再使用。以下是具体修复方案:
方案一:按提示将Token转换为Source(兼容现有客户端代码)
修改服务端代码,先调用Stripe的接口转换Token,再用转换后的Source ID创建PaymentIntent:
const router = require("express").Router(); const stripe = require("stripe")(process.env.STRIPE_KEY); router.post("/payment", async (req, res) => { try { // 1. 将客户端传入的Token转换为Source const source = await stripe.sources.create({ type: "card", token: req.body.tokenId }); // 2. 使用Source ID创建PaymentIntent const paymentIntent = await stripe.paymentIntents.create({ amount: req.body.amount, currency: "usd", source: source.id, confirm: true // 自动确认支付,可根据业务需求调整 }); res.status(200).json(paymentIntent); } catch (stripeErr) { res.status(500).json(stripeErr); } }); module.exports = router;
客户端代码无需修改,保持原有传入tokenId的逻辑即可。
方案二:升级为Payment Methods API(推荐)
Sources是Stripe的旧版方案,新版更推荐使用Payment Methods API,支持更多支付方式且更灵活。需要同时调整客户端和服务端代码:
客户端代码修改(创建PaymentMethod替代Token)
useEffect(() => { const makeRequest = async () => { try { // 替换原创建Token的逻辑,改为创建PaymentMethod const { paymentMethod } = await stripe.createPaymentMethod({ type: 'card', card: stripeCardElement, // 此处替换为你的Stripe Card Element实例 }); const res = await userRequest.post("/checkout/payment",{ paymentMethodId: paymentMethod.id, amount: cart.total*100, }); history.push("/success",{data: res.data}); } catch(err) { console.error(err); } }; stripeCardElement && makeRequest(); },[stripeCardElement, cart.total, history]);
服务端代码修改(使用PaymentMethod创建PaymentIntent)
const router = require("express").Router(); const stripe = require("stripe")(process.env.STRIPE_KEY); router.post("/payment", async (req, res) => { try { const paymentIntent = await stripe.paymentIntents.create({ amount: req.body.amount, currency: "usd", payment_method: req.body.paymentMethodId, confirm: true, automatic_payment_methods: { enabled: true } // 启用自动支付方法处理 }); res.status(200).json(paymentIntent); } catch (stripeErr) { res.status(500).json(stripeErr); } }); module.exports = router;
内容的提问来源于stack exchange,提问作者Het Patel
相关产品推荐
相关产品推荐

