使用Stripe恢复订阅(并为以前的未付费服务收费)

时间:2015-02-08 08:35:20

标签: stripe-payments credit-card subscription recurring-billing

我有一个网络服务,为我的用户发布和托管某些信息。每个用户的编辑界面都与他们发布的信息分开。我使用Stripe订阅为它收费,但我在处理未付费订阅时遇到了麻烦。这是我想要实现的逻辑:

  1. 首次尝试失败时,我的应用应锁定用户的编辑界面;相反,它应该为它们提供一个页面,其中包含解决付款问题的选项。但是,他们发布的信息仍会发布,因此延迟付款不会中断访问者的信息。
  2. 在最后一次失败的结算尝试后,15天后,我的应用也会移除他们发布的信息。此时,用户的编辑界面将替换为允许用新信用卡重新激活帐户或完全删除帐户的界面。
  3. 如果用户选择重新激活帐户,则不应该进入试用期
  4. 如果用户重新启动,他们还必须支付他们之前跳过的15天,通过将他们的第一个结算周期缩短15天,或者通过增加相当于15天服务的费用他们的第一个账单。
  5. 如果我注意到正确的webhooks,那么#p和#2非常容易实现 - 只需将对逾期客户或具有已删除或未付费订阅的客户的请求重定向到“修复此问题”页面。 #3非常简单 - 只需将trial_end设置为now即可创建订阅。

    这是#4,这很棘手。如何在取消订阅之前确定用户的上一张发票未付款的确切时间?如何缩短新订阅的第一个结算周期?或者,如何按比例对客户的最后发票总额进行评级,以表示我实际提供给他们的部分,以便我可以将该金额添加到新发票中? (我知道我可以在开始新订阅之前创建一个发票项目来收取金额,所以至少这是可能的。)

    最后,Stripe的“Mark Subscription Unpaid”选项是否有助于解决这些问题?看起来它不断创建发票但不试图为它们收费;我认为这不是我想要的。

1 个答案:

答案 0 :(得分:3)

你可以使用Stripe的订阅完成所有这些操作。正如您所提到的,前两个问题应该通过webhook来解决。您可以在终端上收听invoice.payment_failed以检测付款何时失败,并立即阻止您要求客户更新其卡详细信息的用户界面。

要更新其卡片详细信息,您可以使用Stripe Checkout,但不要设置data-amount参数,以便它不会向您的客户显示价格。这是一个例子:

<form action="/charge" method="POST">
  <script
    src="https://checkout.stripe.com/checkout.js" class="stripe-button"
    data-key="pk_test_XXXX"
    data-image="/square-image.png"
    data-name="Demo Site"
    data-description="Update Card Details"
    data-panel-label="Update Card Details"
    data-label="Update Card Details">
  </script>
</form>

每次客户尝试更新其卡时,您都会使用Update Customer API并在card参数中传递新的卡片令牌。这将删除客户的默认卡并将其替换为新卡。它还将尝试在&#34;过期&#34;中支付每个订阅的最新发票。州。在您的情况下,这意味着将尝试支付仍处于重试模式的最新发票。这不算作重试,可以看作是独立的。如果成功,您只需重新启用UI,否则您将继续要求客户更新其卡片详细信息。

当您达到第四次付款失败时,如果您在dashboard的重试设置中设置的是customer.subscription.canceled,则会收到request。您可以通过查看活动的null键并确定其trial_end来检测到它是自动取消。在这种情况下,您将完全阻止客户的UI /帐户。

过去15天,如果我正确了解您的流量,则客户无法真正使用您的应用程序,因为您已部分锁定了用户界面。但如果您仍然希望他支付这笔金额,您应该在您的数据库中存储客户欠他X美元的15天他无法使用订阅。

稍后,您的客户终于回来了,想要重新启用他的帐户。此时,您通知他,付款流程将从今天重新启动,您将向他收取他之前错过的额外15天的费用。为此,我会使用Invoice Items,这样您就可以自动为第一张发票添加额外的金额。您可以按照以下步骤操作:

  1. Create为您的客户提供$ X的发票项目。
  2. Create如果您的计划默认设置了试用期,那么您的计划设置"now"created的新订阅。
  3. 这将自动为计划金额创建第一张发票,并添加之前创建的发票项目。
  4. 此处的另一个解决方案是重新打开尚未支付的最新已结算发票并使用Pay Invoice API。当发生这种情况时,您知道您的客户现在支付了整整一个月的费用,而不仅仅是他欠您的15天。在这种情况下,您将创建一个新订阅并设置15天的试用期,以便他在该试用后再次开始付款。

    我不会将&#34;马克用作无偿&#34;这里的选项是因为您完全锁定了客户的应用程序。当您让客户使用您的应用程序并计划在几个月内为每张发票向他收取费用时,我将使用此功能。这将用于电力供应商,例如谁会在多个结算周期内保持电量,并继续尝试向您收取每张发票。

    在这种情况下,您的客户真正欠您的金额取决于您允许的重试次数以及每次重试之间的天数。您可以在此处执行的操作是使用发票上的customer.subscription.canceled值,并将其与{{1}}的当前时间进行比较,以确定经过多长时间并计算客户欠您的费用的比例那时候。