ruby-on-rails - rails + Stripe : where to store what type of subscription a user has?

标签 ruby-on-rails ruby-on-rails-3 architecture stripe-payments

Rails newb 在这里,所以在答案中添加尽可能多的细节,并随时告诉我我做错了。

背景:我正在构建一个 SaaS rails 应用程序并计划很快添加 strip (支付)集成。我想在集成 strip 之前构建区分各种帐户类型(订阅计划)的功能。

我在整个应用程序中使用了许多 if/else 语句,具体取决于帐户类型(例如,免费、1 级、2 级)来向用户显示/隐藏适当的功能。我的基本陈述如下:

<% if current_user.account_level == "1" %>
    your account level is 1
<% elsif current_user.account_level == "2" %>
    your account level is 2
<% else %>

<% end %>

这假设我正在记录用户在用户模型(或其他模型)中的“帐户级别”。这是合适的地方吗?从技术上讲,Stripe 拥有最新的数据(即,如果卡取消,帐户级别会有所不同)。我应该直接使用 Stripe api 来确定帐户级别吗?看来我应该在我的数据中的某个地方记录下来。

在知道我将来会集成 Stripe 的情况下,我在开发过程中是否应该牢记任何其他最佳做法?

最佳答案

虽然您是对的,Stripe 将存储最新数据,但我建议您为您经常使用的任何内容(如订阅状态)维护一个本地缓存。

您可以使用两种主要方法来确保您的数据库具有最新状态:

  • 在您对 Stripe 进行 API 调用的代码中,请确保您还更新了本地副本,或者

  • 使用我们的webhooks监听与您的客户相关的事件(例如,customer.subscription.updated)。通过这样做,您可以确保您的本地数据库始终与 Stripe 匹配——即使您通过仪表板更改客户的计划,您的 webhook 端点也会收到更新。

在本地存储这些数据的主要好处是速度:您很可能不希望您的客户为访问此数据的每个请求等待 API 调用,尤其是因为您似乎在整个网站都需要它。

您需要确保存储的是 customer ID在您的数据库中,以便您可以将 Stripe 客户与您的本地用户进行匹配。

关于ruby-on-rails - rails + Stripe : where to store what type of subscription a user has?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13524689/

相关文章:

ruby-on-rails-3 - Rails 3 CanCan 授权范围所有权

architecture - 什么是变更请求管理工具?

nhibernate - NHibernate 中的映射装饰器模式

c# - C# 中跨平台类的设计

ruby-on-rails - 如何优雅地重新启动 delay_job 消费者?

ruby-on-rails - 您如何通过Rails迁移克隆数据库表?

ruby-on-rails-3 - Rails _path 帮助程序生成格式不是 id 的路径

ruby-on-rails - 自定义 Rails 验证抛出未定义的方法错误

ruby-on-rails - "Could not find generator figaro:install"

ruby-on-rails - 为什么Omniauth重定向到/auth/failure而不是/auth/:provider/failure?