我有一个网络服务,为我的用户发布和托管某些信息。每个用户的编辑界面都与他们发布的信息分开。我使用Stripe订阅为它收费,但我在处理未付费订阅时遇到了麻烦。这是我想要实现的逻辑:
trial_end
设置为now
即可创建订阅。
这是#4,这很棘手。如何在取消订阅之前确定用户的上一张发票未付款的确切时间?如何缩短新订阅的第一个结算周期?或者,如何按比例对客户的最后发票总额进行评级,以表示我实际提供给他们的部分,以便我可以将该金额添加到新发票中? (我知道我可以在开始新订阅之前创建一个发票项目来收取金额,所以至少这是可能的。)
最后,Stripe的“Mark Subscription Unpaid”选项是否有助于解决这些问题?看起来它不断创建发票但不试图为它们收费;我认为这不是我想要的。
答案 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,这样您就可以自动为第一张发票添加额外的金额。您可以按照以下步骤操作:
"now"
到created
的新订阅。此处的另一个解决方案是重新打开尚未支付的最新已结算发票并使用Pay Invoice API。当发生这种情况时,您知道您的客户现在支付了整整一个月的费用,而不仅仅是他欠您的15天。在这种情况下,您将创建一个新订阅并设置15天的试用期,以便他在该试用后再次开始付款。
我不会将&#34;马克用作无偿&#34;这里的选项是因为您完全锁定了客户的应用程序。当您让客户使用您的应用程序并计划在几个月内为每张发票向他收取费用时,我将使用此功能。这将用于电力供应商,例如谁会在多个结算周期内保持电量,并继续尝试向您收取每张发票。
在这种情况下,您的客户真正欠您的金额取决于您允许的重试次数以及每次重试之间的天数。您可以在此处执行的操作是使用发票上的customer.subscription.canceled
值,并将其与{{1}}的当前时间进行比较,以确定经过多长时间并计算客户欠您的费用的比例那时候。