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 通常是指每一期重复应用相同的优惠,不一定是将一笔总优惠拆到多个账期使用。具体含义应以所用平台的文档为准。
解决步骤
先确认支付平台的以下规则:
- 固定金额优惠是否以当期账单金额为抵扣上限。
- 超出当期账单的部分是否可以结转。
- 优惠的持续类型是
once、repeating还是forever。 - 免费账单是否仍会消耗一次优惠次数。
- 税费、手续费和其他附加费用是在优惠前还是优惠后计算。
- 退款、取消订阅或更换套餐后,剩余优惠如何处理。
如果平台不支持跨账期结转,而业务需要实现 $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 等浮点数。
注意事项
- 如果支付平台只支持单期固定金额优惠,多余部分通常会失效,但仍需查阅该平台的官方文档或在测试环境中确认。
- “优惠持续多期”和“剩余优惠金额结转”不是同一个功能。
- 使用账户余额实现结转时,需要记录每次抵扣流水,防止并发生成账单时重复扣减。
- 应提前确定优惠余额能否退款、是否设有有效期,以及取消订阅后如何处理。
- 正式交易前,应在测试环境中覆盖首期账单、续费、套餐变更、退款、税费和取消订阅等场景。
备注:内容仅供参考。
