支付宝自动续费设计
一. 参考文档:
二. 流程设计
1. 自动续费时序图
sequenceDiagram participant 用户 participant 小程序 participant 后端服务 participant 支付宝 用户->>小程序:1.请求续约 小程序->>后端服务:2.请求签约接口 后端服务->>支付宝:3.支付宝个人协议页面签约接口 支付宝->>后端服务:4.返回签约参数 后端服务->>小程序:5.返回签约参数 小程序->>用户:6.弹出签约跳转 用户->>支付宝:7.签约 支付宝->>后端服务:8.签约/解约通知 用户->>小程序:9.解除签约 小程序->>后端服务:10.解除签约 后端服务->>支付宝:11.解约接口 支付宝->>后端服务:12.签约/解约通知 后端服务->>支付宝:13.定时规则任务触发:周期扣款 支付宝->>后端服务:14.扣款回调 后端服务->>支付宝:15.退款 后端服务->>支付宝:16.(主动)查询退款 后端服务->>支付宝:17.查询扣款订单异常进行撤销接口(12小时)
2. 接口相关
- alipay.user.agreement.page.sign(支付宝个 人协议页面签约接口)
- 签约/解约通知(周期/商家扣款如何设置异步通知)
- 解约接口
- 签约扣款接口
- 签约退款接口
- 扣款回调/通知 ,触发通知示例
- 查询退款
- 撤销接口
- 查询扣款接口
==备注:需要注意扣款订单和退款订单的订单号规则,防止与内部系统其他类型订单冲突==
三. 注意事项
1. 产品特色
商家扣款 是商家引导用户进行签约授权,签约成功后商家根据签约协议号,再主动调接口完成扣款的支付产品,支持周期性的扣款模式。
商家选择接入商家扣款 产品,可同时选择接入 商家分账 产品,具体查看 商家分账产品介绍。
目前 商家扣款 一个用户在同商家同场景码下==最多可以签约 1 次==,可以设置多个模版,每个模版对应一个场景码;到==扣款日 execute_time 的前 5 天==商家可以根据用户签约协议号完成扣款;单个商家对单个协议的扣款限额为==单笔限额 100 元。==
- 产品业务特征:固定周期、固定金额范围、被动扣款等。
- 产品典型场景:会员包月、租赁费用、定期还款、充值缴费等。
目前允许商家在约定日期之前 5 天开始扣款,如扣款时间 2019-11-06,可从 11-01 到 11-06 调用扣款接口。
2. 注意
为保障用户体验,扣费操作不可在晚上执行,请于==北京时间 7:00~22:00 期间发起扣款。==
3. 签约规则参数
为实现周期性业务逻辑,商家发起签约请求主要遵循以下参数规则。
==涉及接口 alipay.user.agreement.page.sign(支付宝个人协议页面签约接口)、alipay.trade.app.pay(app支付接口2.0) 等。==
规则主要控制逻辑 | 涉及参数 | 必填 | 描述 |
---|---|---|---|
单次扣款最大金额 | single_amount | 是 | 每次发起扣款时限制的最大金额,单位为元。商家每次发起扣款都不允许大于此金额。 |
周期类型 | period_type | 是 | 枚举值为 DAY 和 MONTH。 DAY 即扣款周期按天计,MONTH 代表扣款周期按自然月。 |
周期间隔时间 | period,period_type | 是 | 与另一参数 period_type 组合使用确定扣款周期,例如 period_type 为 DAY,period=90,则扣款周期为90 天。 |
首次扣款时间 | execute_time | 是 | 商家发起首次扣款的时间。精确到日,格式为 yyyy-MM-dd。 结合其它必填的扣款周期参数,会确定商家以后的扣款计划。发起扣款的时间需符合这里的扣款计划。 |
周期总金额 | total_amount | 否 | 单位为元。如果传入此参数,商家多次扣款的累计金额不允许超过此金额。 |
周期总期数 | total_payments | 否 | 如果传入此参数,则商家成功扣款的次数不能超过此次数限制(扣款失败不计入)。 |
4. 扣款( (原退款接口))
为实现周期性业务逻辑,商家发起扣款请求主要遵循以下参数规则。
==涉及接口 alipay.trade.pay(统一收单交易支付接口) 等。==
扣款主要控制逻辑 | 描述 |
扣款金额 | 后续每期扣款金额必须小于等于签约约定金额。 |
扣款时间 | ==扣款必须在约定时间及约定时间前 5天内发起,如果周期间隔时间为自然月,扣款时间只能在(1-28 号)。== |
扣款时间间隔 | 周期内只能有一次扣款,上期未扣款不会叠加到下期;当期内若用户错过扣款日期可以调用 alipay.user.agreement.executionplan.modify (周期性扣款协议执行计划修改接口)延后扣款时间。 |
撤销及退款逻辑 | 交易撤销后,当期内还可以发起一次扣款,交易退款则不允许再次发起扣款。 |
周期总金额和总期数 | 如果签约时传入该信息,则扣款时会校验总扣款金额和期数是否满足条件。 |
下次扣款时间 | 下次扣款时间可以修改,只能往后延期。如果扣款周期类型为天,则无限制;如果扣款周期为自然月,只能延期到(1-28 号)。 |
5. 费率
具体以开通产品时的约定为准,常规计费模式如下
服务名称 | 费率 |
---|---|
单笔费率 | 0.6%~1% |
6.退款 (原退款接口)
退款周期:12 个月,即交易发生后 12 个月内可发起退款,==超过12 个月则不可发起退款==。
退款方式:资金原路返回用户账户。
退款退费:退款时手续费会一并退还。
7.签约解约返回
7.1 区分支付返回异步和签约返回异步
支付接口返回的异步参数和签约返回的异步参数是不一样的。
- 支付返回异步含有 out_trade_no、trade_no。
- 签约返回异步含有 external_agreement_no、agreement_no。
注意:请求时设置 external_agreement_no,异步必传。
7.2 区分签约返回异步和解约返回异步
签约返回异步和解约返回异步可以根据 status 判断
- 签约返回异步含有status=NORMAL,notify_type=dut_user_sign。
- 解约返回异步含有status=UNSIGN,notify_type=dut_user_unsign。
四.表设计
1. 说明
签约: signing of contract;make a contract
扣款订单号:30位=前缀缩写 mac(3位)+运营商编号(9位)+时间戳(13)+5位随机数
退款订单号:30位=前缀缩写 rmac(4位)+运营商编号(9位)+时间戳(13)+4位随机数
签约号:uuid
超级会员购买表:xxx_order
1. external_agreement_no 签约号
2. 扣款订单号
超级会员退款表:xxx_refund_order
1. external_agreement_no 签约号
2. 扣款订单号
3. 退款订单号
用户签约表:xxx_agreement_record,
1. external_agreement_no 签约号
2. status 0 未签约,1已签约,2,已失效
3. 续期时间 . d:天 2. m:(30,90,年)
2. 类图
classDiagram xxx_agreement_record -- xxx_order:签约号 xxx_agreement_record -- xxx_refund_order:签约号 xxx_order -- xxx_refund_order:扣款订单号 class xxx_agreement_record{ 签约表 external_agreement_no 签约号 status 状态 agreement_date 签约时间 } class xxx_order{ 购买表 external_agreement_no 签约号 扣款订单号 } class xxx_refund_order{ 退款表 external_agreement_no 签约号 扣款订单号 退款订单号 }