如何修改 Authorize.Net recurring payment 的下次扣款日期?
结论
Authorize.Net ARB(Automated Recurring Billing)无法直接修改已有订阅的 startDate、计费周期或下一次扣款日期。ARBUpdateSubscriptionRequest 可用于更新金额、付款信息和账单地址等字段,但不能重新安排付款计划。
如需变更下一次扣款日期,应新建订阅,再取消旧订阅:
- 创建新的 ARB subscription,将
startDate设为目标日期。 - 确认新订阅创建成功。
- 使用
ARBCancelSubscriptionRequest取消旧订阅。
确认日期格式
04-03-2018 和 06-04-2018 都可能产生歧义。Authorize.Net 接口要求使用 YYYY-MM-DD 格式:
- 如果
06-04-2018指 2018 年 6 月 4 日,应传入2018-06-04。 - 如果它指 2018 年 4 月 6 日,应传入
2018-04-06。
不要直接向接口传入 06-04-2018。
startDate 还要符合 Authorize.Net 对首次扣款日期的限制,例如不能设为过去的日期。可用日期范围以当前 ARB API 文档及商户环境返回的结果为准。
处理步骤
先用 ARBGetSubscriptionRequest 读取旧订阅,并保存新订阅需要沿用的信息,包括:
- 订阅金额
- 计费间隔
- 客户资料
- 账单地址
- 剩余扣款次数
接口通常不会返回足以直接重建订阅的完整银行卡信息。系统需要保存可复用的 Customer Profile、Payment Profile,或者请客户重新提交付款信息。
然后创建新订阅:
<?xml version="1.0" encoding="utf-8"?>
<ARBCreateSubscriptionRequest xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd">
<merchantAuthentication>
<name>API_LOGIN_ID</name>
<transactionKey>TRANSACTION_KEY</transactionKey>
</merchantAuthentication>
<subscription>
<name>Replacement monthly subscription</name>
<paymentSchedule>
<interval>
<length>1</length>
<unit>months</unit>
</interval>
<startDate>2018-06-04</startDate>
<totalOccurrences>12</totalOccurrences>
</paymentSchedule>
<amount>29.99</amount>
<payment>
<creditCard>
<cardNumber>CARD_NUMBER</cardNumber>
<expirationDate>YYYY-MM</expirationDate>
</creditCard>
</payment>
</subscription>
</ARBCreateSubscriptionRequest>
示例中的金额、付款信息和 totalOccurrences 应按原订阅的实际情况填写。totalOccurrences 是新订阅自身的扣款次数,不会自动扣除旧订阅已经执行的次数。
新订阅创建成功并返回新的 subscriptionId 后,取消旧订阅:
<?xml version="1.0" encoding="utf-8"?>
<ARBCancelSubscriptionRequest xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd">
<merchantAuthentication>
<name>API_LOGIN_ID</name>
<transactionKey>TRANSACTION_KEY</transactionKey>
</merchantAuthentication>
<subscriptionId>OLD_SUBSCRIPTION_ID</subscriptionId>
</ARBCancelSubscriptionRequest>
Authorize.Net-XML 的调用方式取决于项目使用的 library 版本,底层对应以下两个请求:
ARBCreateSubscriptionRequest
ARBCancelSubscriptionRequest
paymentSchedule.startDate 不属于已有订阅的可更新字段,因此不能通过 ARBUpdateSubscriptionRequest 修改。
注意事项
创建和取消是两个独立请求,没有数据库事务的原子性。应先确认新订阅创建成功,再取消旧订阅。如果取消失败,需要立即记录并告警,防止两条订阅同时扣款。
如果旧订阅临近下一次处理时间,取消请求可能来不及阻止该笔扣款。迁移前需要检查旧订阅状态、预计扣款时间以及 Authorize.Net 的处理时点。
调整日期不会自动按比例计费,也不会补扣跳过的周期。差额如何处理、空档期是否免费,以及是否需要另行发起一次性交易,应由业务规则确定。
备注:内容仅供参考。
