我正在尝试使用“托管”购买和应用内结算来实现用于升级/解锁应用的各种功能的系统,但由于缺乏深入的文档或示例,我陷入了困境。

我的应用程序的目的是从我自己的服务器中检索/解析和显示数据,并且http://developer.android.com/guide/market/billing/billing_best_practices.html上的文档指出:



我的问题是,就实际工作流程而言,最好的方法是什么?

据我所知,成功购买后,我会将购买信息存储在服务器上以及本地应用程序中。当应用程序运行时,我会将订单ID发送到我的服务器,服务器将检查订单是否有效(首先检查该订单是否存在于我的服务器数据库中,其次检查我是否没有手动撤销该订单)不管什么原因)。

如果经过验证,则服务器将向应用发送响应,告知所请求的功能已“获得许可”,并且该应用将向用户提供解锁的功能/内容。

我可以看到的明显问题是:

  • 具有root用户权限的用户可以轻松地更改本地应用程序的SQLITE数据库(或我用来存储订单信息的任何其他方法)以注入(inject)有效的订单ID。
  • 如果网络访问中断或我的服务器出现故障,我仍然希望该应用程序能够使用所有用户购买的功能运行(使用缓存的数据)。

  • 我看到的第一个问题的潜在解决方法包括发送带有验证请求的某种设备标识符,并在服务器端进行监视-如果大量设备在短时间内访问该订单,则撤消该订单。

    对于第二个问题,我找不到合适的解决方案。我最初认为,每次验证成功时,都会存储该验证发生的时间。然后,该应用程序将在上一次成功验证后的48小时内继续使用解锁功能运行。问题在于,如何安全地存储此时间值?同样,拥有root权限的用户可以简单地更改该值,而该应用程序将变得更加明智。

    有没有人设计过基于服务器的系统来管理应用内账单购买,并且可以提供一些建议?

    最佳答案

    Google许可提供了一种方法,允许缓存的“您的许可有效”响应保持有效。

    Application Licensing

    您还可以加密要存储的数据。如果他们支付了费用,则可以对其进行解密。如果没有可用的网络访问,则实现与应用程序许可(当前根据Apache许可,版本2.0许可)类似的缓存方案。

    10-07 19:41
    查看更多