Stripe支付网关:月度转年度订阅升级的订单金额计算问题
Stripe 订阅升级金额计算与订单明细实现
Stripe 原生支持订阅升级时的按比例抵扣计算,无需手动核算剩余天数费用,你可以通过其API获取精准的订单明细来展示给用户。
核心实现思路
- 配置可升级的订阅计划:确保月度和年度订阅在Stripe后台属于同一产品下的不同价格,或允许跨产品升级。
- 预览升级明细:使用Stripe的
subscriptions.retrieveUpcomingAPI在用户确认支付前生成升级预览,自动计算剩余月度订阅的抵扣额度、年度订阅全额及最终应付金额。 - 展示订单明细:从预览结果中提取所需字段,按你要求的格式渲染给用户。
- 完成升级:用户确认后,调用
subscriptions.updateAPI执行订阅升级,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
相关产品推荐
相关产品推荐

