Android 每月向Firebase订阅

Android 每月向Firebase订阅,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我想为我的应用程序实施每月订阅,但我不知道哪种方法是正确的 这是我的结构: groups -groupId - premium:true/false - owner: userId 这应该是流程: 用户可以购买为期1个月的订阅,这将使其选择的groupId/premium=true 在一个月+宽限期后,如果用户尚未支付其订阅费,则groupId/premium应更改为false 起初,我想我可以在android设备上检查他的订阅是否有效,然后相应地更新数据。但是,如果用户从未

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

这是我的结构:

groups
 -groupId
    - premium:true/false
    - owner: userId
这应该是流程:

  • 用户可以购买为期1个月的订阅,这将使其选择的groupId/premium=true

  • 在一个月+宽限期后,如果用户尚未支付其订阅费,则groupId/premium应更改为false

  • 起初,我想我可以在android设备上检查他的订阅是否有效,然后相应地更新数据。但是,如果用户从未打开他的应用程序,会发生什么呢?那我就不能查了,在他打开应用程序之前,他的团队一直是高级的?我不能这样做,因为有其他用户与该组关联,然后他们将获得免费订阅

    因此,我是否需要在appengine服务器上运行一个每日cron作业,每天检查哪些订阅达到了其结束时间,然后检查关联的用户是否支付了费用,并相应地更新数据库

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

    - groupSubscriptions
      - groupId
        - ownerToken: token
        - expireDate: timestamp
    
    然后根据expireDate查询它,抓取ownerToken,检查他们是否支付了IAP


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

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

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

    - userSubscriptions
      - userId
        - expireDate: timestamp
    
    然后,您将有一个数据读取规则,该规则要求订阅检查订阅是否已过期:

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

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

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

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

    - userSubscriptions
      - userId
        - expireDate: timestamp
    
    然后,您将有一个数据读取规则,该规则要求订阅检查订阅是否已过期:

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

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

    这听起来像是一个很好的解决方案,可以在订阅到期后保护高级选项不被使用。但是一旦firebase数据库过期,对其进行更改又如何呢?因为如果不是这样的话,集团状态仍然会说它处于高级模式,即使它不是,用户可能会感到困惑。我想这可能就是谷歌实时开发者通知的目的,但我自己还没有实现。除了cron作业之外,您还找到了解决方案吗?这听起来像是一个很好的解决方案,可以保护高级选项在订阅到期后不被使用。但是一旦firebase数据库过期,对其进行更改又如何呢?因为如果不是这样的话,集团状态仍然会说它处于高级模式,即使它不是,用户可能会感到困惑。我想这可能就是谷歌实时开发者通知的目的,但我自己还没有实现。除了cron工作之外,您是否找到了解决方案?