Rails、Stripe 和 Subscriptions - 模型

Posted

技术标签:

【中文标题】Rails、Stripe 和 Subscriptions - 模型【英文标题】:Rails, Stripe and Subscriptions - Model 【发布时间】:2012-04-28 09:59:18 【问题描述】:

在我的网站中,所有 Stripe 集成都在工作,但我仍在努力思考如何确定订阅是否处于活动状态。我曾考虑将所有内容都保存在本地数据库中,但随后我会从 Stripe 获得重复数据。但是,如果 Stripe 是主记录,如果它们已关闭并且我无法确定用户是否有活动订阅怎么办?在我看来,应该有一种方法可以将所有内容同步在一起。我应该向帐户/用户保留某种当前订阅到期日期吗?

模型应该存储哪些订阅信息?这应该是用户模型的一部分还是单独的“订阅”模型的一部分?

【问题讨论】:

【参考方案1】:

"什么订阅信息应该和模型一起存储?应该 这是用户模型的一部分或作为单独的一部分 “订阅”模式?”

将所有信息存储在订阅模型中,并将该模型与用户相关联。由于订阅有自己的元数据,而且它们实际上是不同的实体,因此将它们分开存储是有意义的。

“但是,如果 Stripe 是主记录,如果他们倒闭了,我怎么办? 无法确定用户是否有有效订阅?在我看来 应该有一种方法可以将所有内容同步在一起。我应该保留一些吗 当前订阅到期日期的排序与 帐户/用户?”

如果您在每个请求或登录时都检查订阅,那么每次都点击条带 api 可能没有意义......这是很多开销。这一切都取决于您的用例,但运行一个每日(或每小时)的 cron 作业可能是有意义的,该作业点击条带 api 检查订阅到期,然后更新本地订阅存储。

【讨论】:

【参考方案2】:

我使用 SaaS Rails 工具包的方法是将信息保留在订阅模型中,包括 next_renewal_at 字段,将其留给 Stripe 进行计费。相反,我有一个每日 cron 作业,它对所有具有 new_renewal_at = 今天的订阅进行计费,因此您可以立即知道是否收费失败。

【讨论】:

【参考方案3】:

只需存储一个标志,指示订阅是否处于活动状态,订阅时默认设置为 true。

然后设置条带回调挂钩,以在订阅过期/取消/其他情况下通知您的应用。收听 customer.subscription.updated 并查看状态字段,可以是活动、过期、取消或未付款。

您将立即收到条带通知,因此无需承担不断检查的开销。如果条带由于某种原因无法回调,它会以指数退避重试几次,因此非常健壮。

不要自己实现订阅,也不要定期运行作业以与条带同步。使用条纹回调钩子,这两种策略都是完全不必要的。

【讨论】:

扩展 Stripe 的 webhooks 策略 (stripe.com/docs/webhooks)。如果 webhook 没有收到来自应用程序的 200 代码响应。 “Stripe 将继续尝试每小时发送一次 webhook,最多持续 3 天。” 同意。我真的不喜欢接受的答案中提出的 cron 作业解决方案...

以上是关于Rails、Stripe 和 Subscriptions - 模型的主要内容,如果未能解决你的问题,请参考以下文章

Rails / Stripe - 付款不会处理

在 Rails 中使用 Stripe webhook

有没有更安全的方法可以同时使用 Stripe 和 ActiveMerchant? Ruby on Rails

成功付款后履行订单 Stripe Rails

使用 Stripe on Rails 免费订阅 - 无需卡即可获得令牌

如何延迟 Rails 控制器操作,直到 Stripe 的 webhook 成功?