async-stripe 订阅计费指南:订阅、发票与计费周期管理全流程
【免费下载链接】async-stripeAsync (and blocking!) Rust bindings for the Stripe API项目地址: https://gitcode.com/gh_mirrors/as/async-stripe
如果你正在用 Rust 构建 SaaS 产品,那么订阅计费一定是绕不开的核心环节。async-stripe 是 Stripe 官方 OpenAPI 规范自动生成的高性能 Rust 绑定库,支持异步与阻塞两种模式,让你在 Rust 中轻松实现订阅、发票与计费周期管理全流程。本文将带你从零开始,用最少的概念快速跑通一套完整的 Stripe 订阅计费流程。
为什么用 async-stripe 做订阅计费?
- ✅API 全覆盖:由官方 OpenAPI 规范每周自动生成,Stripe 新增功能几乎同步可用
- ✅类型安全:所有请求参数与响应均为强类型,编译期就能发现错误
- ✅性能出色:使用 miniserde 反序列化,编译快、二进制体积小
- ✅模块化设计:按业务域拆分为多个 crate,只编译你需要的部分
快速开始:添加依赖
订阅功能涉及客户、商品、价格等多个资源,按需引入即可:
[dependencies] async-stripe = "=1.0.0-rc.5" async-stripe-core = { version = "=1.0.0-rc.5", features = ["customer"] } async-stripe-billing = { version = "=1.0.0-rc.5", features = ["subscription", "invoice"] } async-stripe-product = { version = "=1.0.0-rc.5", features = ["product", "price"] } tokio = { version = "1", features = ["full"] }💡 若使用阻塞模式,可启用
blocking特性;完整示例可参考 subscriptions.rs 示例。
第一步:创建客户并绑定支付方式
订阅必须挂载在客户(Customer)之下。先创建客户,再创建并绑定一张测试卡:
let customer = CreateCustomer::new() .name("Alexander Lyon") .email("test@async-stripe.com") .send(&client).await?;绑定支付方式的完整写法同样基于流畅的 Builder 模式,代码路径在 customer.rs 示例 中可以看到。
第二步:创建商品与循环价格
Stripe 的订阅基于「价格」而非直接传金额。创建一个按月循环扣费 10 美元的价格:
let price = CreatePrice::new(Currency::USD) .product(&product.id) .unit_amount(1000) .recurring(CreatePriceRecurring::new(CreatePriceRecurringInterval::Month)) .send(&client).await?;CreatePriceRecurringInterval支持Day、Week、Month、Year,对应不同的计费周期粒度。
第三步:创建订阅的核心配置
订阅创建的入口是CreateSubscription,它承载了几乎所有订阅计费策略:
let subscription = CreateSubscription::new() .customer(customer.id) .items(vec![CreateSubscriptionItems { price: Some(price.id.to_string()), ..Default::default() }]) .default_payment_method(&payment_method.id) .send(&client).await?;常见订阅参数速查表
| 参数 | 作用 | 典型取值 |
|---|---|---|
items | 订阅包含的价格项 | 价格 ID 列表 |
default_payment_method | 默认扣款方式 | 支付方式 ID |
trial_period_days | 试用期天数 | 7 / 14 / 30 |
billing_cycle_anchor | 账单日锚点 | 自定义时间戳 |
cancel_at_period_end | 周期结束自动取消 | true / false |
collection_method | 自动扣款或寄送发票 | charge_automatically/send_invoice |
计费周期管理:试用期与账单日锚点
试用期设置 ⏱️
想给用户 7 天免费试用?一行搞定:
CreateSubscription::new() .customer(customer.id) .items(items) .trial_period_days(7) .send(&client).await?;自定义账单日
默认账单日从订阅创建时刻起算。若想让所有用户在每月 1 号统一扣费,用billing_cycle_anchor把计费周期对齐到指定日期,实现「按自然月结算」的订阅计费体验。
周期内变更与按比例计费
用户在周期中途升级套餐时,Stripe 会自动计算差价(proration)。可通过proration_behavior控制按比例计费行为,配合payment_behavior决定「先支付再生效」还是「先生效再补扣」,这是订阅计费系统最常见的调优点。
发票管理:自动与手动两种模式
订阅产生的费用会进入发票(Invoice)流程,invoice相关 API 位于 invoice 模块。
自动扣费模式
collection_method设为charge_automatically时,Stripe 在每个计费周期结束时自动从默认支付方式扣款,开发者无需干预,适合大多数订阅产品。
手动开票模式
面向企业客户的年付订单,可设置send_invoice+days_until_due,让客户在指定天数内自行付款。此时可用FinalizeInvoice终结发票、PayInvoice手动收款。
发票生命周期一览
| 状态 | 含义 |
|---|---|
| draft | 草稿,可修改 |
| open | 已发出待支付 |
| paid | 支付成功 |
| void | 已作废 |
取消订阅与优雅降级
周期结束自动取消
用户点「取消订阅」时,最友好的做法是服务到本期结束:
UpdateSubscription::new(subscription.id) .cancel_at_period_end(true) .send(&client).await?;立即取消
需要立即生效时,使用CancelSubscription(定义见 subscription/requests.rs),它支持传入取消原因(feedback)与备注,方便后续做流失分析。
常见问题 FAQ
Q:async-stripe 支持同步调用吗?支持。启用blocking特性后即可使用同步客户端,适合非 async 项目。
Q:订阅中途换套餐,金额怎么算?Stripe 自动生成按比例计费发票,把已付与未付的差额在下一个账单日结清,全程无需手动计算。
Q:试用期结束后怎么收费?试用期结束后 Stripe 自动创建第一张正式发票并从绑定支付方式扣款,状态会从trialing自动转为active。
总结
通过 async-stripe,你可以用类型安全、性能出色的 Rust 代码,快速搭建包含订阅创建、试用期、按比例计费、发票生命周期与取消策略在内的完整订阅计费体系。建议先用 Stripe 测试密钥(sk_test_)跑通 subscriptions.rs 示例,再逐步接入真实支付场景。从客户、价格、订阅到发票,每一步都有清晰的 Builder API 和强类型保障,让订阅计费开发变得简单可靠。🎉
【免费下载链接】async-stripeAsync (and blocking!) Rust bindings for the Stripe API项目地址: https://gitcode.com/gh_mirrors/as/async-stripe
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考