【问题标题】:How to implement auto renew subscription in app billing google play如何在应用计费谷歌播放中实现自动续订订阅
【发布时间】:2018-01-30 10:32:47
【问题描述】:

我正在研究通过 google play 在应用计费中实现自动续订订阅的方法。我读了https://developer.android.com/google/play/billing/billing_subscriptions.html 并看到了

按为订阅指定的时间间隔和价格无限期地继续计费。每次续订时,Google Play 都会自动向用户帐户收费,然后通过电子邮件通知用户收费情况。对于月度和年度订阅,计费周期将始终与订阅周期匹配,具体取决于购买日期。 (季节性订阅按年收费,在季节的第一天。)

订阅付款获得批准后,Google Play 会通过 In-app Billing API 将购买令牌返回给购买应用。您的应用可以在本地存储令牌或将其传递到后端服务器,然后后端服务器可以使用它通过 Google Play Developer API 远程验证或取消订阅。

那么有什么方法可以让我的服务器知道用户的订阅何时更新?在该 android 应用将此新账单发送到我的服务器以进行验证之后,而不是 google play 将新账单订阅发送到 android 应用。

当用户续订时,谷歌播放是否可以向我的服务器发送通知,例如通过电子邮件通知用户?我想通过 Google Play 向我发送通知,告知用户的订阅已自动续订,以便我的后端将在应用增加时更新他们的订阅。每次用户打开商店以检查是否有来自 goole play 收费自动化的新账单时,不需要 android 应用程序都必须检查账单。实现了吗?

我的工作

  1. Google 收取新的周期订阅费用并通知我的服务器{正文,例如 bundId、bill、product_id 或订阅包名称、到期日期...),还向用户发送有关其订阅自动化续订的邮件。
  2. 我的服务器确定用户的更改订阅,并通过 google play api 在应用购买中进行验证,如果验证有效,则在您的应用中更改过期包订阅。
  3. 在我的数据库中存储最新的账单

这可能吗?

[更新]从goolge play api doc推荐

建议:在您的应用中包含业务逻辑以通知您的 订阅购买、令牌和任何计费的后端服务器 可能发生的错误。您的后端服务器可以使用服务器端 用于查询和更新您的记录并跟进客户的 API 如果需要,可以直接使用。

如何实施来自 google api、任何文档或教程的推荐?

【问题讨论】:

    标签: in-app-billing in-app-subscription


    【解决方案1】:

    我目前有完全相同的问题。谷歌的概念并不完善。可以将金融交易通知您的后端服务器(请参阅here),但我不建议这样做。您的业​​务交易依赖于许多 Google 服务和服务器正常运行时间。如果出现任何问题或出现故障或其他情况,您将不会收到通知,并且您的后端业务逻辑不再起作用。

    你提到的谷歌推荐也很糟糕。如果存在自动更新(向您的应用程序提供新的 purchaseToken)并且用户从未打开您的应用程序会发生什么情况。那么新的订阅数据将永远不会传输到您的服务器。如果您从未获得新令牌,您如何检查用户是否仍然是订阅者,因为这个有限的 Google Play 开发者 API 愚蠢地需要一个 purchaseToken 作为参数(请参阅here),只要用户永远不会得到自动续订后至少不会打开您的应用一次(以将其提交到您的服务器)。

    我考虑以这种方式实现:
    1.)我通过cron作业不断检查购买记录。购买记录是一个数据库条目,其中包含来自初始订阅的所有数据(orderId、purchaseToken 等,security validation process on the server 所需的所有数据)。每条购买记录都连接到我的后端系统中的用户帐户(一些用户 ID)。只要 purchaseRecord 的 autoRenewing 属性不为 false,则订阅有效。即使超过了 expiryTimeMillis,这个用户仍然可以有一个有效的订阅,因为我上面描述的用例:订阅将由谷歌自动更新,但用户从不打开应用程序,因此没有传输令牌发送到您的服务器,并且您仍然没有收到有关订阅更新的通知。

    2.) 如果用户在任何时候取消他的订阅,autoRenewing 将在任何时候为假。这意味着订阅确实会在 expiryTimeMillis 结束。

    3.) 当用户打开您的应用并将新的 purchaseToken 传输到您的后端时,您将获得一条新的购买记录,该记录再次使用他的用户 ID 连接到用户帐户。用户现在可能有 2 条购买记录。旧的和新的。如果是这样,您可以删除旧的,然后在第 1 步对新的购买记录重复相同的过程。

    到目前为止我还没有实现这个概念,所以我不知道这是否真的像这样工作。也许这可以以不同的方式发挥作用,但也许这是朝着正确方向迈出的一步。

    【讨论】:

    • 是的!这正是我正在做的。我创建了一个 cronjob 任务来为用户 sub 续订。我联系了 google play 服务支持团队,他们说他们不支持更新订阅时通知的挂钩。
    • 我的理解是自动续订不会提供新的 purchaseToken。使用原始令牌查询订阅应始终给出当前状态:developers.google.com/android-publisher/api-ref/purchases/…
    • @svn 显然至少有一种情况是你得到了一个新的令牌,所以你不能依赖它:developer.android.com/google/play/billing/…It's possible, however, that the user regained access to the subscribed content by repurchasing the subscription during the hold period. In that case, a new purchaseToken value is returned to represent the new instance of the subscription.(我实现了我的后端逻辑,希望能涵盖所有这些谷歌不一致,很快我会测试它。)
    • 回购将通过应用程序中的常规流程完成并注册为新订阅。在这种情况下,您将拥有新令牌。这意味着您不应仅根据原始购买的状态及其续订来禁用用户订阅。当新的订阅发生时替换令牌或维护两个令牌并检查服务器端是否有效
    • @svn 我决定尽可能多地保存并且不会删除任何东西(正如我建议的b4)。由于所有的 Google API 描述大多都很糟糕,因此人们永远不知道如果您开始删除任何内容会丢失什么样的信息。
    【解决方案2】:

    我不认为,依靠每天的 cronjob 是解决这个问题的可行方法,它很混乱,你还必须考虑当你的应用程序处理太多请求时,你有事务限制的情况使用android开发人员的api制作的。实现它的更好方法是使用谷歌的推荐。哪些统计数据:

    ... 注意:由于配额限制,不建议通过定期轮询 Google Play 开发者 API 来检查状态,而不是利用实时开发者通知。 ...

    【讨论】:

      【解决方案3】:

      在这里,您可以关注以下网址 How to get expiry date for Subscription with client side in Android? 并实现自动续订。

      【讨论】:

        猜你喜欢
        • 2021-09-09
        • 2012-08-27
        • 2020-01-25
        • 1970-01-01
        • 2013-11-20
        • 1970-01-01
        • 1970-01-01
        • 2011-07-16
        • 1970-01-01
        相关资源
        最近更新 更多