【问题标题】:Monthly subscription with Firebase每月订阅 Firebase
【发布时间】:2017-06-14 20:26:04
【问题描述】:

我想为我的应用实现每月订阅,但我不知道哪种方法是正确的。

这是我的结构:

groups
 -groupId
    - premium:true/false
    - owner: userId

这应该是流程:

  1. 用户可以购买 1 个月的订阅,这将使他选择的 groupId/premium = true。

  2. 1 个月+宽限期后,如果用户还没有支付订阅费用,groupId/premium 应更改为 false。

起初我以为我可以在 android 设备上检查他的订阅是否处于活动状态,或者如果它没有,并相应地更新数据。但是如果用户从不打开他的应用程序会发生什么?然后我无法检查,并且他的组在他打开应用程序之前一直保持高级状态?我不能这样,因为有其他用户与该组相关联,然后他们将获得免费订阅。

所以我是否必须通过在 appengine 服务器上运行的每日 cron 作业来执行此操作,该作业每天都会检查哪些订阅达到了结束时间,然后检查相关用户是否已为此付费,并更新相应的数据库?

这意味着像这样向数据库中添加更多节点。

- groupSubscriptions
  - groupId
    - ownerToken: token
    - expireDate: timestamp

然后根据expireDate查询,获取ownerToken,查看是否支付了IAP。

这是解决我的问题的正确方法吗?这是我想太多了吗?没有服务器可以做吗?

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    我不太确定您的应用的高级操作是什么。但是说这就像能够读取特定的数据一样。在这种情况下,您可以在安全规则中对订阅到期进行建模。

    首先,您将在数据库中的安全位置对过期时间戳进行建模:

    - userSubscriptions
      - userId
        - expireDate: timestamp
    

    然后,您将有一个数据读取规则,该规则需要订阅检查订阅是否过期:

    ".read": 
      "root.child('userSubscriptions').child(auth.uid).child('expireDate').val() > now"
    

    我在这个例子中使用了uid,但同样的逻辑也适用于组。

    【讨论】:

    • 这听起来像是一个很好的解决方案,可以保护高级选项在订阅到期后不被使用。但是一旦 Firebase 数据库过期,如何对其进行更改呢?因为否则,组状态仍然会说它处于高级模式,即使它不是,用户可能会感到困惑。
    • 我认为这可能是谷歌实时开发者通知的用途,但我自己还没有实现。除了 cron 作业,你找到解决方案了吗?
    • @frank 相同的登录用户,即“userId”是否会在付款后将“expireDate”字段添加到“userSubscriptions”文档中?这不会有安全风险吗?由于“userId”将有权访问“userSubscriptions”并且可以更新“expireDate”。
    猜你喜欢
    • 2019-03-31
    • 2012-03-07
    • 2015-06-26
    • 2021-09-04
    • 2015-08-05
    • 2015-11-23
    • 2019-11-12
    • 2012-09-08
    • 2018-11-28
    相关资源
    最近更新 更多