我有一个 Stripe Checkout 页面,允许客户开始订阅。然后,我有一个 Webhook,它将在成功结帐会话后启动该网站的帐户注册过程。结帐页面是公开的,即,在结帐会话处于活动状态时,我没有客户 ID。
对于全新用户或现有用户来说,该流程运行良好。我已将其设置为现有客户可能只有 1 个有效订阅,因此,如果您是具有有效订阅的现有客户/用户,并且您点击 Stripe Checkout 页面并输入您的电子邮件地址,它会将您推送至自助服务门户。
但是,当订阅终止时,就会出现这种情况,无论是被客户取消还是被允许失效。在这种情况下,如果客户想要续订,他们可以返回公共注册页面,进入 Stripe Checkout 会话,然后重新订阅。这会在 Stripe 中创建另一个 Customer 对象。我可以在应用程序端优雅地处理这个问题,这样我们就不会通过电子邮件地址重新注册同一用户。但在 Stripe 中,现在有两个客户对象具有相同的电子邮件地址。如果该用户随后进入自助服务门户,现在它将仅显示最新客户对象的交易/发票;不是之前订阅过的。
我开始沿着这条路走下去,在我的代码中,收到 checkout.session.completed 事件后,我检查是否存在具有相同电子邮件地址的另一个客户,尝试将订阅和付款详细信息移至该客户,然后从结帐中删除新创建的客户。然而,这看起来太混乱并且容易出错。
是否有任何方法可以在不事先了解用户的情况下,在 Stripe Checkout 会话期间检查与 Stripe 中已存在电子邮件地址相同的用户(无论是否具有有效订阅)是否正在尝试完成会话?如果是这样,我不需要新的客户对象,但我希望通过该电子邮件对现有客户进行新的订阅。我唯一的办法是改变我的流程,在将用户推送到结帐页面之前填写一个表格来询问电子邮件地址以查找 Stripe 客户吗?
您的 Stripe 仪表板中有一个“限制客户只能订阅 1 次”选项,您可以启用它来限制您的客户只能订阅 1 次。详情请参阅此页面。