一. 参考文档:

支付宝自动续费参考地址

二. 流程设计

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. 接口相关

  1. alipay.user.agreement.page.sign(支付宝个 人协议页面签约接口)
  2. 签约/解约通知(周期/商家扣款如何设置异步通知)
  3. 解约接口
  4. 签约扣款接口
  5. 签约退款接口
  6. 扣款回调/通知 ,触发通知示例
  7. 查询退款
  8. 撤销接口
  9. 查询扣款接口

==备注:需要注意扣款订单和退款订单的订单号规则,防止与内部系统其他类型订单冲突==

三. 注意事项

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 如果传入此参数,则商家成功扣款的次数不能超过此次数限制(扣款失败不计入)。

image.png

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 签约号
         扣款订单号
         退款订单号
    }