Stripe 如何设计订阅:从套餐、账单到支付

用一款云存储的月付套餐,解释订阅在 Stripe 产品体系中的位置,以及商品、价格、订阅、账单和付款为何要分开记录。再看看升级、退订和扣款失败时,这些记录会怎样变化。

一次旅行回来,手机里多了几百张照片和几十段视频。上传到一半,云盘提示容量不足。用户准备换一个更大的套餐,但月费在月初已经付过,升级时还应该付多少?

购买页面上的两个价格,回答不了这个问题。系统得查到用户买了哪个套餐、本期付过多少钱、还剩多少时间,再按商户的规则算出差额。用户点下升级按钮后,后台要核对订阅、账单和付款几种记录。

如果换成取消续费,处理方式又不同。用户可能不想再为云盘付钱,但已经上传的照片还在那里,本月的费用也已经付过。关闭续费以后能用到哪一天,文件还能不能下载,都不能靠一笔付款的成功或失败来判断。

一家人在餐桌旁整理旅行照片,并将照片保存到云盘

English version

上一篇讨论了什么样的生意适合订阅。这篇从软件产品的角度往下看:假定有一款云存储,专业版提供 1 TB 空间,每月 20 美元,用户按月续费。下面的价格和日期都是示例,不计税费、折扣和额外用量费。

Stripe 把订阅放在哪里

接入 Stripe Payments,商户就有了处理付款的能力。向某位用户收取 20 美元,支付过程中需要什么验证,银行接受还是拒绝,都可以通过这套服务处理。Stripe Payments

但到了下个月,商户还得知道该向谁收这 20 美元。有人换过套餐,有人取消了续费,有人的试用期刚结束。如果这些记录保存在商户自己的系统里,续费时就由商户计算金额,再请求 Stripe 收款。

Stripe Billing 提供了另一种做法。商户把套餐、计费周期和订阅记录交给它管理,由它生成账单、安排后续收款。Subscriptions 属于 Billing,负责订阅的创建、续费、变更和取消,周围还有催缴、客户自助管理和收入统计等能力。Stripe Billing

Stripe产品关系图:Subscriptions属于Billing,Payments负责支付处理,Tax和Radar等是其他产品

商户为 Billing 支付的软件服务费,与 Payments 的支付处理费分别计算。只需要收款的商户可以单独使用 Payments;希望少维护一套计费程序的商户,可以再接入 Billing。Billing 定价

这里说的“订阅”有两个使用场合。对云盘用户来说,是订下一段时间的存储服务;到了 Stripe 的产品里,则有一套具体的软件,用来管理这项生意的计费。用户订一年云盘,并不意味着商户必须在 Stripe 里创建一份 Subscription。

从套餐到付款

先把专业版放进 Stripe。Product 记录商品名称和说明,Price 记录金额、币种和计费周期。云存储专业版是一个 Product,每月 20 美元是它的一个 Price。

如果专业版也接受每年 200 美元,商户可以在同一个 Product 下再建一个年付 Price。月付和年付买到同样的空间,只是价格和付款周期不同。空间更大的高级版,则可以作为另一个 Product。Product 和 Price 也能用于单次收款,它们并非订阅专有。商品与价格

一位用户在 9 月 1 日选择专业版月付,系统为他创建 Subscription,将客户与月付价格关联起来,保存计费周期和订阅状态。9 月 10 日购买的另一位用户,会有另一份订阅。两个人用同一款产品,可以在不同日期续费,也可以各自取消。

接下来是账单。假定没有试用期,用户需要为第一个月支付 20 美元,Stripe 就为这份订阅生成 Invoice。它记录本期应付的费用。这里的 Invoice 按账单理解即可,不能直接套用国内税务发票的概念。订阅账单

账单生成时,钱未必收到。Stripe 用 PaymentIntent 跟踪付款:用户可能已经付清,也可能还在完成银行验证,或因为余额不足而付款失败。账单和付款分开记录,才能保留“应该付多少”和“实际有没有付”这两件事。PaymentIntent

订阅收费流程:商户创建订阅,Billing生成本期账单,Payments执行收款并返回结果,账单支付后由商户延续服务权限

10 月 1 日续费时,通常沿用原来的 Subscription,另开本期账单,处理新一笔付款。这样订上几年,订阅可以还是同一份,下面已经有几十张账单和相应的付款记录。查订阅能知道用户现在用什么套餐,查账单和付款则能知道过去每一期收了多少钱。订阅生命周期

如果只在用户表里放一个“是否会员”,这些差别就会消失。欠费的人和主动退订的人都可能被记为“否”;刚关闭续费、但本期还能使用的人,又不知道该记为“是”还是“否”。后面几个例子会碰到这些问题。

升级、取消和欠费

升级套餐,旧月费怎么算

照片和视频会越存越多。孩子过一次生日,手机里就又添了一批录像。等到 1 TB 空间也不够用,用户可以把专业版换成每月 40 美元的高级版。

家长用手机记录孩子的生日,照片和视频随生活不断积累

假定本期 20 美元已经付清,升级发生在计费周期过半的时候。商户允许当天升级,保留原来的续费日期,并按剩余时间补差价。原套餐还剩半期,值 10 美元;高级版的半期费用是 20 美元,抵扣后应补 10 美元。下个周期再收完整的 40 美元。

按比例计费示意:旧套餐剩余费用抵扣10美元,新套餐剩余费用20美元,本期补差10美元

Stripe 用 proration 处理这种部分周期的费用。实际金额按变更时间等条件计算,图里取半个周期方便理解。算出差价以后,还要决定放在哪张账单上、什么时候收取;产生差价项目,不等于已经发起扣款。按比例计费

商户也可以要求补款成功才升级。Stripe 的 pending updates 支持符合条件的这类变更,避免钱没有收到,套餐却已换好。至于让用户先用、下期再结算,还是等到下期才换套餐,平台都不能代替商户作决定。待完成的订阅变更

关掉续费,本月的服务还在

再看另一位用户。他在 9 月 1 日付过 20 美元,到了 9 月 20 日决定不用这个云盘了,开始把照片复制到自己的硬盘。

如果约定是用完本期后停止续订,他应该还能用到 10 月 1 日。Stripe 可以用 cancel_at_period_end=true 记录这个安排:当前周期继续,到期后取消。程序若在用户点击“关闭续费”时就撤掉权限,会让他少用十来天,也可能打断正在进行的文件迁移。取消订阅

用户把云盘中的家庭照片复制到外置硬盘,为停止订阅做准备

本期退款需要另外处理,关闭续费不会自动退还月初付过的钱。至于到期后留多少时间下载、何时限制上传、文件保留多久,是云存储产品自己的服务规则。计费系统知道订阅何时结束,文件服务还得据此执行。

扣款失败,先弄清楚发生了什么

还有一位用户没有取消,10 月 1 日的续费却没扣成。如果只是暂时余额不足,过后重试可能收到钱;银行卡已失效,就需要用户换卡;银行要求验证,则要让用户完成验证。对这些情况重复发送同一个扣款请求,并不总能解决问题。

Stripe 提供重试和催缴能力,商户可以配置相应的处理方式。Smart Retries 在等待用户处理期间,产品可以给宽限期,也可以限制部分功能。这个例子里的云盘若决定暂时停止上传、保留下载,就需要自己的业务系统执行这条规则。

费用一直没付清时,订阅可以按配置进入取消、未支付或继续逾期等状态。此时应该停止哪些服务,要按产品的收费约定处理。Stripe 的 active 也不能当作“所有钱都已付清”的证明:历史账单可能还欠着;采用先发账单、后付款的方式,订阅也可能在首期费用到账前进入这个状态。订阅状态

商户还要做什么

接入 Billing 后,商户可以少写一部分订阅计费和账单程序。存储服务的工作还在:给谁开 1 TB 空间、欠费后能否上传、到期后怎样取回文件,都要在自己的产品里实现。

商户需要把 Stripe 客户与业务账号关联起来,接收订阅和账单的事件通知,再更新权限。Stripe 也提供 Entitlements,用来管理商品与功能权益的对应关系;功能能否使用,最后仍要由产品执行。订阅通知与访问权限

两种接入方式的责任对比:只接Payments时自己维护订阅计费,接入Billing后交给Stripe,业务账号和服务仍由商户管理

对接事件通知时还有一些工程细节。同一条通知可能重复发送,不同通知也可能乱序到达。程序不能每收到一次付款通知就给用户增加一个月,否则一次重发就会多送一个月;也不能让晚到的旧记录覆盖较新的状态。Webhook 事件处理

如果产品只卖一张不自动续费的年卡,事情会少一些。商户收取 200 美元,记录一年的有效期,到期后等用户决定是否重新购买,采用单次支付就可以完成收款。用户订了一年服务,Stripe 里却可以没有 Subscription,Checkout 的 payment 模式就能用于这笔交易。Checkout 模式

是否采用 Billing,可以从这些具体工作算起。只卖年卡时,维护有效期的成本可能不高;再加上试用、连续续费、套餐变更和欠费处理,程序会越来越长,出了问题也要有人排查。平台服务费是否值得,就看它能接过多少工作。

以后若再通过 Apple 或 Google 的应用商店销售,还需要把各渠道的购买记录关联到同一个账号。网页端的账单交给 Billing,并不妨碍商户保留自己的账号和权限系统,这部分也恰好能用来接入其他渠道。

下一篇会写支付宝的订阅接入,结合实际流程,看看其中哪些工作由平台提供,哪些需要自己完成。

正在加载讨论...