PAYATHON 2026

如何将周期扣款类型从DAY修改为MONTH?

支付老李

结论

已经签约的代扣协议,如果周期扣款类型为 DAY,不能直接改成 MONTH。

需要先解约原协议,再按月周期重新发起签约,并将新协议周期规则中的 period_type 设为 MONTH。原协议中的其他周期参数不会自动转换,也要按照月扣款规则重新填写。

原因

周期扣款类型是签约协议的核心规则。协议生效后,支付宝会按照签约时约定的周期、扣款日期和金额限制执行扣款,不能通过更新接口把 DAY 改为 MONTH。

只修改商户本地记录不会改变支付宝侧的协议规则,后续扣款仍可能按原协议执行。

操作步骤

1. 停止使用原协议发起扣款

原协议解约完成前,不要再用其协议号提交新的周期扣款请求,以免重复扣款,或出现新旧规则同时生效的情况。

2. 解约原协议

调用对应产品的协议解约接口,通常为:

alipay.user.agreement.unsign

解约时,需要传入可以唯一定位原协议的信息,例如支付宝协议号 agreement_no 或商户协议号 external_agreement_no。具体必填字段以当前接入产品及官方接口文档为准。

示例请求结构:

{
  "agreement_no": "202xxxxxxxxxxxxxxxx",
  "personal_product_code": "CYCLE_PAY_AUTH_P"
}

使用商户协议号定位时,请求结构如下:

{
  "external_agreement_no": "merchant_agreement_001",
  "personal_product_code": "CYCLE_PAY_AUTH_P"
}

不能默认两种协议号都可以省略。应按照接口要求,至少提供一种有效的协议标识。

3. 确认原协议已失效

收到解约成功响应后,还要更新商户系统中的协议状态。必要时,可通过协议查询接口确认原协议已经不可用,然后再允许用户重新签约。

建议保留原协议号和解约时间,不要用新协议直接覆盖历史记录。

4. 重新发起月周期签约

重新调用周期扣款签约接口,并在周期规则中设置:

{
  "period_type": "MONTH"
}

完整规则示例:

{
  "period_type": "MONTH",
  "period": 1,
  "execute_time": "5",
  "single_amount": 100.00
}

该示例表示每 1 个月为一个周期,并计划在周期内的指定日期执行扣款。execute_time 的具体格式、可选范围及月末日期的处理方式,以当前周期扣款产品文档为准。

如果签约接口要求以 JSON 字符串传递周期规则,可根据接口 SDK 的字段类型进行序列化,例如:

String periodRuleParams =
    "{\"period_type\":\"MONTH\","
  + "\"period\":1,"
  + "\"execute_time\":\"5\","
  + "\"single_amount\":100.00}";

重新签约时,需要生成新的商户协议号:

String externalAgreementNo = "merchant_agreement_002";

不要继续使用已解约协议的 external_agreement_no,除非当前接口文档明确允许复用。

注意事项

  • DAY 和 MONTH 不能通过修改商户数据库直接切换,必须在支付宝侧重新签署协议。
  • 重新签约通常需要用户再次确认授权,商户后台不能静默完成。
  • 新协议签约成功后会形成新的协议关系,后续扣款必须使用新协议号。
  • 解约前应检查是否有处理中或已经提交的扣款请求,避免解约和扣款并发。
  • 按月扣款时,要处理不同月份天数不一致的情况。如果选择每月 29、30 或 31 日,具体执行规则以产品文档为准。
  • personal_product_code、签约接口名称和周期规则字段可能因接入产品而异。以上示例使用周期扣款的常见参数说明处理方式,实际请求应以当前应用接入的支付宝接口文档和 SDK 定义为准。

备注:内容仅供参考。