14

好的,大约一年前,我编写了一个网络应用程序,帮助为我父亲的公司安排约会。他现在“没有它就无法做生意”。我已经决定要建立一个 SAAS 订阅模型,并向公众开放。

它目前是基于 codeigniter 和 php 构建的,我认为它不适合 SAAS 版本。我计划在 laravel 4 中从头开始重建它,并使用条带作为支付网关。

我关心的是如何最好地为多个客户处理数据库/应用程序结构。目前,它只服务于一项业务,并且非常不抽象,并且特定于我父亲公司的需求。我需要它能够根据使用它的业务处理不同的数据。

我已经研究过多租户,但我不确定这是否适合。我认为“gmail”风格的方法会更好。一个应用程序/域,登录后用户将看到他们的自定义仪表板,并且只有他们的数据。

在我陷入编码之前,我需要弄清楚如何最好地处理一个数据库上的多个“帐户”。我不想为每个用户创建一个表,也不想为每个用户创建一个数据库。

我想我的问题是任何人都可以为我指出正确的方向,以了解如何最好地处理 Laravel 中的每月付款订阅?这不是我在纠结的代码,而是我需要构建什么来处理每月向客户收费并在计费失败时拒绝他们访问等。

谢谢

4

2 回答 2

37

您需要大量阅读和大量工作!

首先,让我们暂时完全忽略计费方面的问题——归根结底,应用程序的这一部分实际上是相当微不足道的。从37signals Rework中翻页(第 93 和 94 页),并在开始实施之前通过 30 天免费试用推出您的产品(到那时您应该知道如何实施它)。

其次,为什么你认为“gmail”不使用多租户,URI 结构没有说明底层数据库结构。我相当有信心他们不会为每个客户克隆数据库模式。因此,您可能已经回答了自己的问题——您想要实现多租户

您将想要抽象您的数据库(和应用程序架构),老实说,没有比 Taylor Otwell(Laravel 的创建者)的书Laravel:从学徒到工匠更好的资源来帮助您实现这一目标。他的书不适合初学者,当你读完它时,你应该能够自己回答这个问题。

您不会为每个用户创建表或数据库,甚至不会为每个组织创建一个。相反,您将在代码中创建抽象数据库结构,这会将您的用户数据从数据库中提取出来。

考虑检查访问组织的权限作为另一层用户身份验证。对于每个请求,您都将检查该用户是否可以访问特定组织。您可能还会检查以确保组织仍然处于活动状态(它是否因为他们没有付款而过期?)这将再次发生在每个请求上,并且可能在 laravel 中使用过滤器

这确实导致了开发 SaaS 应用程序的下一个非常重要的因素。

我不了解你,但我很偏执,如果我不确定那个用户号4506看不到他不属于的组织的数据,我晚上睡不着觉。确保这一点的唯一真正好方法是通过单元测试,如果您还没有,我强烈建议您学习。

在 Laravel 4 中做到这一点的最好方法是阅读 Jeffrey Way 的书Laravel Testing Decoded。这本书非常先进,但如果你掌握了基础知识,仍然很容易理解。

最后但同样重要的是,第一件事是参与社区——我建议这样做的最简单方法是在#laravel IRC 频道(freenode)上闲置。问一些问题,也许回答一些问题,频道中的每个人都非常友善且反应迅速。

你肯定是在冒险,不要害怕提出问题和犯错误。祝你好运。

于 2013-08-17T22:26:00.790 回答
2

作为粗略的概述,我将有一个客户表和一个订阅表。任何其他需要存储的数据,例如联系人或约会,都可以使用外键关联到客户端表。

在 laravel 中,您可以使用 ORM 获取当前登录的客户端,然后通过关系,获取属于它们的约会和联系人。

cartalyst.com 上有一些对 laravel 有用的工具,包括用于用户身份验证的 sentry 和 sentry-social,以及将用户帐户与 facebook/google/twitter 集成等。

Stripe 将允许您配置定期付款,并在每次付款尝试时通过网络挂钩通知您。您可以将这些记录在支付表中,并将它们与用户/客户相关联。您可以使用它来跟踪谁付款以及最近付款的时间。

另外,请记住,您可能不想在付款失败后立即取消帐户。

Stripe 会重新尝试,您最好的反应可能是迟到两三天后,或者您收到无效卡通知,与客户联系并提示他们更新付款详细信息。

这也可能是一个检查他们上次登录时间的机会。如果是一个多月前,您可以给他们一个免费的月份,并提醒他们您的应用程序可以为他们做多少。通过这样做,您可以让人们继续使用(并支付)他们忘记订阅的内容。

于 2013-08-17T22:08:15.983 回答