PAYATHON 2026

discount code 如何应用于 recurring payments?

支付阿杰

明确结论

仅凭现有信息,无法判断系统最终会生成 $0、$0、$5、$10…,还是 $0、$10、$10…。结果取决于支付平台如何定义 discount code,以及它在订阅账单中的抵扣规则。

多数订阅系统会将固定金额优惠用于当前一期账单,不会自动保留未用完的金额。按这种规则,$25 优惠用于每月 $10 的产品时,通常会得到:

第 1 个月:$0
第 2 个月:$10
第 3 个月:$10
……

当前账单最低只能抵扣到 $0,剩余的 $15 不会自动结转。只有平台明确支持“优惠余额结转”“账户余额”或“跨账期抵扣”,才可能出现:

第 1 个月:$0
第 2 个月:$0
第 3 个月:$5
第 4 个月:$10
……

所以,优惠金额大于单次付款金额,并不代表系统会自动将优惠分摊到后续付款。

原因

固定金额优惠和账户余额是两个不同的概念。

固定金额优惠通常只针对当期账单计算:

本期应付金额 = max(本期账单金额 - 本期优惠金额, 0)

代入示例:

max($10 - $25, $0) = $0

这条公式只能说明本期支付金额为 $0,不能说明多出的 $15 会转为后续可用余额。要实现结转,支付系统还需要单独维护类似 remaining_discount_balance 的状态。

订阅优惠也可能有不同的有效期:

  • once:只用于第一期账单;
  • repeating:连续若干期分别应用;
  • forever:订阅存续期间每期应用;
  • account credit / customer balance:保存余额并按期抵扣。

其中,repeating 通常是指每一期重复应用相同的优惠,不一定是将一笔总优惠拆到多个账期使用。具体含义应以所用平台的文档为准。

解决步骤

先确认支付平台的以下规则:

  1. 固定金额优惠是否以当期账单金额为抵扣上限。
  2. 超出当期账单的部分是否可以结转。
  3. 优惠的持续类型是 once、repeating 还是 forever。
  4. 免费账单是否仍会消耗一次优惠次数。
  5. 税费、手续费和其他附加费用是在优惠前还是优惠后计算。
  6. 退款、取消订阅或更换套餐后,剩余优惠如何处理。

如果平台不支持跨账期结转,而业务需要实现 $0、$0、$5、$10…,不建议直接使用一次性固定金额优惠码。可以将 $25 转为客户账户余额,并在每次生成账单时扣减。

代码示例

下面是跨账期余额抵扣的通用逻辑,不对应任何特定支付平台的真实 API:

function applyCredit(invoiceAmount, remainingCredit) {
  const appliedCredit = Math.min(invoiceAmount, remainingCredit);
  const amountDue = invoiceAmount - appliedCredit;
  const nextCreditBalance = remainingCredit - appliedCredit;

  return {
    amountDue,
    appliedCredit,
    remainingCredit: nextCreditBalance
  };
}

let credit = 25;

for (let month = 1; month <= 4; month++) {
  const result = applyCredit(10, credit);
  credit = result.remainingCredit;

  console.log({
    month,
    amountDue: result.amountDue,
    remainingCredit: result.remainingCredit
  });
}

输出结果如下:

第 1 个月:应付 $0,剩余优惠余额 $15
第 2 个月:应付 $0,剩余优惠余额 $5
第 3 个月:应付 $5,剩余优惠余额 $0
第 4 个月:应付 $10,剩余优惠余额 $0

金额计算应使用最小货币单位,以免产生浮点数误差。例如,美元金额应以美分保存:

const invoiceAmount = 1000; // $10.00
const creditAmount = 2500;  // $25.00

账务计算中不要直接使用 0.1、10.25 等浮点数。

注意事项

  • 如果支付平台只支持单期固定金额优惠,多余部分通常会失效,但仍需查阅该平台的官方文档或在测试环境中确认。
  • “优惠持续多期”和“剩余优惠金额结转”不是同一个功能。
  • 使用账户余额实现结转时,需要记录每次抵扣流水,防止并发生成账单时重复扣减。
  • 应提前确定优惠余额能否退款、是否设有有效期,以及取消订阅后如何处理。
  • 正式交易前,应在测试环境中覆盖首期账单、续费、套餐变更、退款、税费和取消订阅等场景。

备注:内容仅供参考。