如何将周期扣款类型从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 定义为准。
备注:内容仅供参考。
