Stripe payments 如果没有卡,如何使条带订阅状态从试用变为取消?

Stripe payments 如果没有卡,如何使条带订阅状态从试用变为取消?,stripe-payments,Stripe Payments,我们允许客户使用条带订阅进行30天的免费试用。我们希望试验期正好持续30天。如果订阅状态为trialing、active或过期,则客户可以使用我们的服务 如果客户已退出试用期并一直在付款,但由于某种原因,他们的卡不再有效,则订阅状态将从活动状态变为过期状态。订阅状态为过期15天(由我们的重试设置决定)。换言之,如果他们是付费客户,并且在每月付款到期时,他们的卡不好,那么他们仍然可以在修复卡的同时使用我们的服务额外15天 如果30天试用期结束,并且没有卡,则状态从试用移动到激活。3分钟后,状态从a

我们允许客户使用条带订阅进行30天的免费试用。我们希望试验期正好持续30天。如果订阅状态为
trialing
active
过期
,则客户可以使用我们的服务

如果客户已退出试用期并一直在付款,但由于某种原因,他们的卡不再有效,则订阅状态将从
活动状态变为
过期状态
。订阅状态为过期15天(由我们的重试设置决定)。换言之,如果他们是付费客户,并且在每月付款到期时,他们的卡不好,那么他们仍然可以在修复卡的同时使用我们的服务额外15天

如果30天试用期结束,并且没有卡,则状态从
试用
移动到
激活
。3分钟后,状态从
active
变为
pass\u due
。然后状态保持15天,即试验期为45天。我们不希望这样;我们希望试用期仅为30天

我们怎么不允许这15天的额外工作呢

我认为,在这种情况下,将有一个设置,使订阅状态从
试用
变为
取消
,以便根据上面的设置方式轻松设置试用期长度。但此设置似乎不存在


因此,当我检测到(通过webhook)将
试用到
active
,然后在3分钟后
active
过期时,我是否需要手动取消订阅?当datetime从
试用
变为
活动
时,我会将它存储在数据库中。然后,当它从
活动
变为
过期
时,我会检查存储的数据时间是否在15分钟前-如果是,我知道我有一个试用期,结束时没有卡,我会取消订阅。或者有更简单的方法吗?

第一个解决方案是改变您希望处理订阅失败付款的方式。默认情况下,当发票付款失败时,会在3天后、5天后、7天后自动重试,然后最终取消。通过更改仪表板中的,您可以确定在第一次付款失败后需要取消订阅

第二种解决方案是在webhook中捕获
发票。付款失败
,并立即取消您端的订阅

编辑:即使客户没有任何关联的活动卡,并且现在已超出试用期,也应明确提出:

在发票试图付款但付款失败时发生。这可能是由于拒绝付款,或者是因为客户没有活动卡。值得注意的一个特殊情况是,如果没有活动卡的客户到达其免费试用期结束时,将发出invoice.payment\u failed通知


编辑2:如果你想知道试验是否刚刚结束,最简单的解决办法是把它保存在你这一方。您可以只存储客户订阅计划的时间,然后根据收到
发票的日期检测这是否是试用期的结束。付款失败

我能想到的最简单的方法是在您的用户模型中添加布尔
has\u paid
属性,仅当您收到
发票时,才将其设置为
true
。对于
总额大于
0
的发票,付款成功
webhook。(试用开始时,Stripe会为试用期创建一张0美元的发票,该发票始终支付成功,因此您必须忽略该发票。)然后您的
发票。如果
已支付
为false,则支付失败
webhook可以立即取消订阅,或者让自动重试循环继续,如果
已付费
是真的。

我自己也在研究这个问题。事实证明,在创建订阅时,您可以使用与
试用版结束时相同的时间戳将
取消设置为
。当您收到来自用户的已验证付款方式时,您可以通过将时间戳设置为
null
来删除
cancel\u,以便继续订阅。然后检查付款是否成功,并妥善处理


因此,如果用户在试用期结束前未向您提供付款方式,则订阅将在时间戳处取消。

关于您的第一个解决方案,我希望为未跟踪的客户(即已成功付款的客户)保留多次重试。我试图在我的第二段中解释这一点。忽略我在这里的第一个评论。关于您的第一个解决方案,我希望为未进行试验的客户保留多次重试。关于您的第二个解决方案,从来没有
发票。付款失败
事件。只有两个
customer.subscription.updated
事件。然后是
customer.updated
事件。15天后,终于发生了
customer.subscription.deleted
事件。根据文档,这似乎是不可能的,我刚刚更新了答案啊,是的,我看到了
发票。现在付款失败了。但是,从事件数据来看,我似乎无法单独使用这些数据来确定客户是否刚刚结束了试用期。更新了我的答案,可能有一种方法可以检测到这一点而不将其保存在您的端,但我现在想不出一种方法