Stripe
Stripe插件将Stripe的支付和订阅功能与Better Auth集成。由于支付和认证通常紧密相连,此插件简化了将Stripe集成到您的应用程序中的过程,处理客户创建、订阅管理和webhook处理。
此插件目前处于测试阶段。我们正在积极收集反馈并探索额外功能。如果您有功能请求或建议,请加入我们的Discord社区进行讨论。
功能
- 用户注册时自动创建Stripe客户
- 管理订阅计划和定价
- 处理订阅生命周期事件(创建、更新、取消)
- 通过签名验证安全处理Stripe webhooks
- 向您的应用程序公开订阅数据
- 支持试用期和订阅升级
- 灵活的引用系统,将订阅与用户或组织关联
- 团队订阅支持,具有席位管理功能
安装
将插件添加到您的auth配置中
添加客户端插件
设置Stripe webhooks
在您的Stripe控制面板中创建一个指向以下地址的webhook端点:
/api/auth
是auth服务器的默认路径。
确保至少选择这些事件:
checkout.session.completed
customer.subscription.updated
customer.subscription.deleted
保存Stripe提供的webhook签名密钥,并将其添加到您的环境变量中,命名为STRIPE_WEBHOOK_SECRET
。
使用方法
客户管理
您可以仅将此插件用于客户管理,而不启用订阅。如果您只想将Stripe客户与您的用户关联起来,这很有用。
默认情况下,当用户注册时,如果您设置了createCustomerOnSignUp: true
,将自动创建一个Stripe客户。该客户在您的数据库中与用户关联。
您可以自定义客户创建过程:
订阅管理
定义计划
您可以静态或动态定义您的订阅计划:
详见计划配置。
创建订阅
要创建订阅,使用subscription.upgrade
方法:
这将创建一个结账会话,并将用户重定向到Stripe结账页面。
重要:
successUrl
参数将在内部进行修改,以处理结账完成和webhook处理之间的竞争条件。该插件创建一个中间重定向,确保在重定向到您的成功页面之前正确更新订阅状态。
对于每个引用ID(用户或组织),一次只支持一个活动或试用订阅。该插件目前不支持同一引用ID有多个并发活动订阅。
列出活动订阅
要获取用户的活动订阅:
取消订阅
要取消订阅:
这将重定向用户到Stripe账单门户,他们可以在那里取消订阅。
恢复已取消的订阅
如果用户在取消订阅后改变主意(但在订阅期结束前),您可以恢复订阅:
这将重新激活先前设置为在计费期结束时取消的订阅(cancelAtPeriodEnd: true
)。订阅将继续自动续订。
注意: 这仅适用于仍然活动但标记为在期末取消的订阅。它不能恢复已经结束的订阅。
引用系统
默认情况下,订阅与用户ID关联。但是,您可以使用自定义引用ID将订阅与其他实体(如组织)关联:
带有席位的团队订阅
对于团队或组织计划,您可以指定席位数量:
seats
参数作为订阅项目的数量传递给Stripe。您可以在应用程序逻辑中使用此值来限制团队或组织中的成员数量。
要授权引用ID,实现authorizeReference
函数:
Webhook处理
该插件自动处理常见的webhook事件:
checkout.session.completed
:结账后更新订阅状态customer.subscription.updated
:订阅更改时更新订阅详情customer.subscription.deleted
:将订阅标记为已取消
您还可以处理自定义事件:
订阅生命周期钩子
您可以挂接到各种订阅生命周期事件:
试用期
您可以为您的计划配置试用期:
Schema
Stripe插件向您的数据库添加以下表:
用户
表名: user
Field Name | Type | Key | Description |
---|---|---|---|
stripeCustomerId | string | - | Stripe客户ID |
订阅
表名: subscription
Field Name | Type | Key | Description |
---|---|---|---|
id | string | 每个订阅的唯一标识符 | |
plan | string | - | 订阅计划的名称 |
referenceId | string | - | 此订阅关联的ID(默认为用户ID) |
stripeCustomerId | string | Stripe客户ID | |
stripeSubscriptionId | string | Stripe订阅ID | |
status | string | - | 订阅状态(活动、已取消等) |
periodStart | Date | 当前计费期的开始日期 | |
periodEnd | Date | 当前计费期的结束日期 | |
cancelAtPeriodEnd | boolean | 订阅是否将在计费期结束时取消 | |
seats | number | 团队计划的席位数 | |
trialStart | Date | 试用期的开始日期 | |
trialEnd | Date | 试用期的结束日期 |
自定义Schema
要更改schema表名或字段,您可以向Stripe插件传递schema
选项:
选项
主要选项
stripeClient: Stripe
- Stripe客户端实例。必需。
stripeWebhookSecret: string
- 来自Stripe的webhook签名密钥。必需。
createCustomerOnSignUp: boolean
- 用户注册时是否自动创建Stripe客户。默认: false
。
onCustomerCreate: (data: { customer: Customer, stripeCustomer: Stripe.Customer, user: User }, request?: Request) => Promise<void>
- 客户创建后调用的函数。
getCustomerCreateParams: (data: { user: User, session: Session }, request?: Request) => Promise<{}>
- 自定义Stripe客户创建参数的函数。
onEvent: (event: Stripe.Event) => Promise<void>
- 任何Stripe webhook事件调用的函数。
订阅选项
enabled: boolean
- 是否启用订阅功能。必需。
plans: Plan[] | (() => Promise<Plan[]>)
- 订阅计划数组或返回计划的函数。启用订阅时必需。
requireEmailVerification: boolean
- 是否在允许订阅升级前要求验证电子邮件。默认: false
。
authorizeReference: (data: { user: User, session: Session, referenceId: string, action: "upgrade-subscription" | "list-subscription" | "cancel-subscription" | "restore-subscription"}, request?: Request) => Promise<boolean>
- 授权引用ID的函数。
计划配置
每个计划可以具有以下属性:
name: string
- 计划名称。必需。
priceId: string
- Stripe价格ID。除非使用lookupKey
,否则必需。
lookupKey: string
- Stripe价格查找键。作为priceId
的替代选项。
annualDiscountPriceId: string
- 带有折扣的年度账单价格ID。
limits: Record<string, number>
- 与计划相关的限制(例如,{ projects: 10, storage: 5 }
)。
group: string
- 计划的组名,用于对计划进行分类。
freeTrial: 包含试用配置的对象:
- days:
number
- 试用天数。 - onTrialStart:
(subscription: Subscription) => Promise<void>
- 试用开始时调用。 - onTrialEnd:
(data: { subscription: Subscription, user: User }, request?: Request) => Promise<void>
- 试用结束时调用。 - onTrialExpired:
(subscription: Subscription) => Promise<void>
- 试用过期且未转换时调用。
高级用法
与组织一起使用
Stripe插件与组织插件配合良好。您可以将订阅与组织而非个人用户关联:
确保实现authorizeReference
函数,以验证用户是否有权为组织管理订阅:
自定义结账会话参数
您可以使用附加参数自定义Stripe结账会话:
税收收集
要启用税收收集:
故障排除
Webhook问题
如果webhooks未正确处理:
- 检查您的webhook URL是否在Stripe控制面板中正确配置
- 验证webhook签名密钥是否正确
- 确保您在Stripe控制面板中选择了所有必要的事件
- 检查服务器日志中是否有webhook处理期间的任何错误
订阅状态问题
如果订阅状态未正确更新:
- 确保接收并处理webhook事件
- 检查
stripeCustomerId
和stripeSubscriptionId
字段是否正确填充 - 验证您的应用程序和Stripe之间的引用ID是否匹配
本地测试Webhooks
对于本地开发,您可以使用Stripe CLI将webhooks转发到您的本地环境:
这将为您提供一个webhook签名密钥,您可以在本地环境中使用。