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

Stripe支付网关:月度转年度订阅升级的订单金额计算问题

Stripe 订阅升级金额计算与订单明细实现

Stripe 原生支持订阅升级时的按比例抵扣计算,无需手动核算剩余天数费用,你可以通过其API获取精准的订单明细来展示给用户。

核心实现思路

  • 配置可升级的订阅计划:确保月度和年度订阅在Stripe后台属于同一产品下的不同价格,或允许跨产品升级。
  • 预览升级明细:使用Stripe的subscriptions.retrieveUpcoming API在用户确认支付前生成升级预览,自动计算剩余月度订阅的抵扣额度、年度订阅全额及最终应付金额。
  • 展示订单明细:从预览结果中提取所需字段,按你要求的格式渲染给用户。
  • 完成升级:用户确认后,调用subscriptions.update API执行订阅升级,Stripe会自动处理费用抵扣和后续支付。

代码示例(Node.js)

const stripe = require('stripe')('你的Stripe密钥');

// 获取升级预览明细
async function generateUpgradePreview(subscriptionId, annualPriceId) {
  // 获取当前订阅信息
  const currentSubscription = await stripe.subscriptions.retrieve(subscriptionId);
  const currentSubscriptionItemId = currentSubscription.items.data[0].id;

  // 请求Stripe生成升级预览
  const upcomingSubscription = await stripe.subscriptions.retrieveUpcoming({
    subscription: subscriptionId,
    items: [{
      id: currentSubscriptionItemId,
      price: annualPriceId
    }],
    proration_behavior: 'create_prorations', // 生成抵扣明细
    proration_date: Math.floor(Date.now() / 1000), // 按当前时间计算精确剩余天数
    payment_behavior: 'default_incomplete' // 不自动发起支付,仅预览
  });

  // 转换金额单位(Stripe返回的金额以分为单位)
  const convertToDollars = (amount) => (amount / 100).toFixed(2);

  // 提取订单明细字段
  const monthlyRemainingCredit = upcomingSubscription.proration_details?.credit_amount || 0;
  const annualPlanTotal = upcomingSubscription.items.data
    .find(item => item.price.id === annualPriceId)
    .price.unit_amount * 12; // 年度订阅全额(分)
  const totalCredit = monthlyRemainingCredit;
  const totalUpgradeAmount = upcomingSubscription.amount_due;

  // 构建所需格式的订单明细
  return {
    'Monthly Plan (Remaining Days)': `$${convertToDollars(monthlyRemainingCredit)}`,
    'Annual Plan (12 months)': `$${convertToDollars(annualPlanTotal)}`,
    'Total Credit from Monthly': `$${convertToDollars(totalCredit)}`,
    'Total Amount for Upgrade': `$${convertToDollars(totalUpgradeAmount)}`
  };
}

// 调用示例
// generateUpgradePreview('用户当前订阅ID', '年度订阅价格ID')
//   .then(details => console.log(details))
//   .catch(err => console.error(err));

关键参数说明

  • proration_behavior: 'create_prorations':强制Stripe生成剩余订阅期的抵扣记录,这是获取credit金额的关键。
  • proration_date:指定计算抵扣的基准时间,设置为当前时间可确保按精确剩余天数计算,而非默认的账单周期比例。
  • payment_behavior: 'default_incomplete':仅生成预览,不会自动创建发票或发起支付,避免误扣费。

注意事项

  • 如果需要自定义抵扣规则(如不按比例、固定金额抵扣),可以在调用API时传入proration_behavior: 'none',然后手动计算credit并通过invoice_items添加自定义抵扣项。
  • 确保前端展示的金额与Stripe预览结果完全一致,避免用户感知到金额差异。

内容的提问来源于stack exchange,提问作者Lakhwinder Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:16:13