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

基于Node.js与Stripe API,如何先校验支付方式余额再扣费?

Node.js + Stripe 实现支付资金校验与扣费流程

Stripe 没有提供直接查询支付方式余额的 API,因为支付方式的资金状态由发卡方/支付机构控制。我们可以通过先验证支付方式有效性(含资金充足性),再执行扣费的两步流程来实现需求,以下是具体实现:

初始化 Stripe

首先确保已安装 stripe 包,并初始化客户端:

npm install stripe
const stripe = require('stripe')('你的Stripe秘钥'); // 替换为你的实际秘钥

第一步:校验支付方式资金充足性

通过 SetupIntent 验证支付方式的可用性(包括是否有足够资金),适合需要预验证后再扣费的场景:

async function verifyPaymentMethod(customerId, paymentMethodId, amount, currency = 'usd') {
  try {
    const setupIntent = await stripe.setupIntents.create({
      customer: customerId,
      payment_method: paymentMethodId,
      confirm: true,
      payment_method_options: {
        card: {
          request_three_d_secure: 'automatic' // 自动触发3DS合规验证
        }
      }
    });

    if (setupIntent.status === 'succeeded') {
      return { success: true, message: '支付方式验证通过,资金充足' };
    }
    return { success: false, message: '支付方式需额外验证' };
  } catch (error) {
    if (error.type === 'StripeCardError') {
      // 捕获卡相关错误,如资金不足、卡被拒绝等
      return { success: false, message: error.message };
    }
    return { success: false, message: '支付方式验证失败' };
  }
}

第二步:执行扣费操作

验证通过后,通过 PaymentIntent 完成实际扣费:

async function processPayment(customerId, paymentMethodId, amount, currency = 'usd') {
  try {
    const paymentIntent = await stripe.paymentIntents.create({
      amount: amount, // 金额为最小货币单位(如100 = 1美元)
      currency: currency,
      customer: customerId,
      payment_method: paymentMethodId,
      confirm: true,
      payment_method_options: {
        card: {
          request_three_d_secure: 'automatic'
        }
      }
    });

    if (paymentIntent.status === 'succeeded') {
      return { success: true, paymentIntentId: paymentIntent.id, message: '扣费成功' };
    }
    return { success: false, message: '扣费需额外操作' };
  } catch (error) {
    if (error.type === 'StripeCardError') {
      return { success: false, message: error.message };
    }
    return { success: false, message: '扣费失败' };
  }
}

整合两步流程

将校验与扣费逻辑组合,实现完整的两步流程:

async function handleTwoStepPayment(customerId, paymentMethodId, amount) {
  // 第一步:校验支付方式
  const verifyResult = await verifyPaymentMethod(customerId, paymentMethodId, amount);
  if (!verifyResult.success) return verifyResult;

  // 第二步:执行扣费
  return await processPayment(customerId, paymentMethodId, amount);
}

// 使用示例(替换为实际的Customer和PaymentMethod ID)
handleTwoStepPayment('cus_XXXXXX', 'pm_XXXXXX', 1000) // 10美元(1000分)
  .then(res => console.log(res))
  .catch(err => console.error(err));

关键说明

  • 金额单位:Stripe API 要求金额以最小货币单位传入(如人民币传分、美元传分)。
  • 错误处理:StripeCardError 包含具体错误码(如 insufficient_funds 表示资金不足),可根据需求做更细粒度的业务处理。
  • 3DS验证:针对需强客户认证的场景,request_three_d_secure: 'automatic' 会自动触发验证,确保支付合规。
  • 一次性支付简化:若无需明确的两步拆分,可直接创建 PaymentIntent 并确认,失败则返回错误,一步完成校验与扣费。

内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 02:00:38