You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:25:30