PAYATHON 2026

如何修改 Authorize.Net recurring payment 的下次扣款日期?

技术老齐

结论

Authorize.Net ARB(Automated Recurring Billing)无法直接修改已有订阅的 startDate、计费周期或下一次扣款日期。ARBUpdateSubscriptionRequest 可用于更新金额、付款信息和账单地址等字段,但不能重新安排付款计划。

如需变更下一次扣款日期,应新建订阅,再取消旧订阅:

  1. 创建新的 ARB subscription,将 startDate 设为目标日期。
  2. 确认新订阅创建成功。
  3. 使用 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 的处理时点。

调整日期不会自动按比例计费,也不会补扣跳过的周期。差额如何处理、空档期是否免费,以及是否需要另行发起一次性交易,应由业务规则确定。

备注:内容仅供参考。