支付失败后防止用户使用 SaaS 应用程序的最佳方法是啥

Posted

技术标签:

【中文标题】支付失败后防止用户使用 SaaS 应用程序的最佳方法是啥【英文标题】:What is the best way to prevent user from using SaaS app after failed payment支付失败后防止用户使用 SaaS 应用程序的最佳方法是什么 【发布时间】:2013-08-07 18:57:51 【问题描述】:

我正在使用 Ruby on Rails 开发一个 SaaS 应用程序。每个用户都必须订阅特定的计划才能开始使用该应用程序。此步骤已使用 Stripe 完成

问题是我不知道如果自动支付订阅失败(他更换信用卡等),我不知道如何阻止该用户使用我的应用程序。我正在考虑使用用户模型中的一列将此用户标记为非活动并阻止他登录。但它没有按我的预期工作,因为我希望这个用户能够登录,但他必须更新他的订阅继续。

顺便说一句,我在 Rails 上看到了许多 SaaS 示例,例如 https://github.com/RailsApps/rails-stripe-membership-saas 或 https://github.com/railscasts/289-paypal-recurring-billing,但它们似乎不会在发生故障时处理来自提供商(Stripe 或 Paypal)的回发。

请让我知道您的想法以及你们在类似项目中如何处理此问题。

提前致谢,

【问题讨论】:

【参考方案1】:

Stripe 会定期为您从卡中收费。您的应用程序不负责为订阅您服务的用户产生新的费用。

来自the docs

Stripe 让处理失败的付款变得容易。 Stripe 可以在失败后自动重试循环支付,如果反复失败可以自动取消客户的订阅。可以在您的帐户设置中轻松设置等待多长时间以及重试次数。

我可能会在我的 User 模型上跟踪 :subscription_active 布尔值或类似值。当用户登录时,您可以检查 API 以查看用户订阅的状态。 API docs 在回复中对订阅的status 有这样的看法(强调我自己的)

可能的值为trialingactivepast_duecanceledunpaid。仍处于试用期的订阅是 trialing,试用期结束后将移至 active当支付续订失败时,订阅变为past_due。在 Stripe 用尽所有付款重试尝试后,订阅最终状态为 canceledunpaid,具体取决于您的重试设置。请注意,当订阅状态为未付款时,任何未来的发票都会在客户的卡详细信息更新之前不要尝试。

如果响应返回为上述粗体状态之一,请为用户标记:subscription_activefalse。在您需要为用户有条件地启用应用程序功能的地方选中user.subscription_active?

【讨论】:

感谢您的详细解释。正如我从您的描述中了解到的那样,我将不得不检索存储在 Stripe 上的 Customer(我将 Customer_ID 作为 User 模型上的一个属性),然后检查此 Customer 对象的订阅,对吗?顺便问一下,您有与此问题相关的 Paypal 经验吗? 是的,当 retrieving a customer 在响应中有一个 subscription 哈希时,您可以检查其中的 status。我没有使用 PayPal 的经验(我鄙视它)。【参考方案2】:

我认为您应该以与 Devise 的工作方式类似的方式处理此问题。 要强制执行有效的登录用户,您需要在控制器中输入 before_action authenticate_user!

如果我必须解决您的问题,我会创建类似的方法,例如

before_action verify_payment!

def verify_payment!
  redirect_to user_payments_path unless current_user.has_valid_payment?
end
protected :verify_payment!

然后在User#has_valid_payment? 中输入逻辑检查帐户是否有效(我没有观看那些截屏视频,但我想这类似于检查最后一次付款是否超过 30 天,等等)

编辑:

查看优秀的 Deefour 答案以了解 Stripe 的具体细节!

【讨论】:

以上是关于支付失败后防止用户使用 SaaS 应用程序的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

socketIO拒绝连接后防止心跳(反复)重连

在iOS上处理jQuery Mobile点击事件后防止点击事件

在 Laravel 中无效后防止重定向到主页

PlayFramework 1.4 在条件不满足后防止传播

如何使用servlet和jsp在注销后防止查看页面[重复]

双击后防止文本选择