Android 为什么使用应用内计费设置开发者有效负载很重要?

Android 为什么使用应用内计费设置开发者有效负载很重要?,android,android-billing,Android,Android Billing,我正在使用应用内计费API的第3版。我有一个单一的、管理的、非消耗品。我还没有在我的应用程序中发布此功能,所以我想在进行任何购买之前决定购买有效负载的内容 发件人: 在发出购买请求时设置开发者有效负载字符串 使用应用内计费版本3 API,您可以包含一个“开发者” 向Google发送购买请求时的有效负载字符串标记 玩通常,这用于传入唯一 标识此采购请求。如果指定字符串值, Google Play将返回此字符串以及购买响应。 随后,当您对此次购买进行查询时,Google Play 返回此字符串和购买

我正在使用应用内计费API的第3版。我有一个单一的、管理的、非消耗品。我还没有在我的应用程序中发布此功能,所以我想在进行任何购买之前决定购买有效负载的内容

发件人:

在发出购买请求时设置开发者有效负载字符串

使用应用内计费版本3 API,您可以包含一个“开发者” 向Google发送购买请求时的有效负载字符串标记 玩通常,这用于传入唯一 标识此采购请求。如果指定字符串值, Google Play将返回此字符串以及购买响应。 随后,当您对此次购买进行查询时,Google Play 返回此字符串和购买详细信息

您应该传入一个字符串标记,以帮助应用程序 识别进行购买的用户,以便以后进行验证 这是该用户的合法购买。对于消耗品, 您可以使用随机生成的字符串,但用于非耗材 您应该使用唯一标识用户的字符串

当您从Google Play获得回复时,请确保验证 开发人员负载字符串与您发送的令牌匹配 在购买请求之前。作为进一步的保障 预防措施,您应该在自己的安全设备上执行验证 服务器


无论正确与否,我决定不采取“进一步的安全预防措施”,即设置服务器来执行购买验证。我不存储自己的购买记录——我总是调用计费API。那么,我真的有什么理由进行有效载荷验证吗?在报告购买的物品之前,验证API本身肯定会验证用户的身份,如果攻击者已经破坏了设备(应用程序或google play API),我看不出在设备上对用户的身份进行额外检查有任何好处,因为这样做很容易规避。或者有没有我没有想到的理由这样做?

如果你没有保存记录,就无法验证你收到的是你发送的。因此,如果您向开发人员负载添加了一些内容,您可以相信它是合法的(如果签名验证,这是一个合理的假设),或者不完全信任它,只将其用作参考,但不用于验证许可证状态等。例如,如果您存储了用户电子邮件,您可以使用该值,而不是要求他们再次输入,这稍微更方便用户,但如果不存在该值,您的应用程序将不会中断

就我个人而言,我认为整个“最佳实践”部分令人困惑,试图让您完成API真正应该做的工作。由于购买与谷歌帐户绑定,Play Store显然保存了这些信息,因此他们应该在购买详细信息中提供这些信息。获取正确的用户ID需要额外的权限,您不需要添加这些权限来弥补IAB API的不足


因此,简而言之,除非您有自己的服务器和特殊的附加逻辑,否则不要使用开发人员负载。只要iabv3api能够工作,您就应该可以了(不幸的是,在这一点上,这是一个很大的“如果”)

开发人员负载处理还有另一种方法。正如尼古拉·埃连科夫(Nikolay Elenkov)所说,要求用户ID和为应用程序的用户配置文件设置额外权限的开销太大,所以这不是一个好方法。那么,让我们看看谷歌在应用内计费v3示例中最新版本的Drive示例应用中说了什么:

  • 警告:开始购买时在本地生成随机字符串,然后 在这里验证它似乎是一个很好的方法,但在将来会失败 用户在一台设备上购买商品,然后在另一台设备上使用您的应用程序的情况 另一个设备,因为在另一个设备上,您将无法访问 最初生成的随机字符串
因此,如果您要在另一台设备上验证购买的物品,则随机字符串不是一个好主意,但他们仍然不认为这不是验证购买响应的好主意。 我会说-通过发送一个随机唯一字符串,将其保存在preferences/数据库中,并在购买响应中检查此开发人员有效负载,仅将开发人员有效负载用于验证购买。至于在活动开始时查询库存(应用程序内购买),不要费心检查开发人员负载,因为这可能发生在另一台设备上,您没有存储随机唯一字符串。我就是这么看的

您应该传入一个字符串令牌,以帮助应用程序识别进行购买的用户

如果您的应用程序提供了自己的用户登录名和身份,这与手机所连接的谷歌帐户不同,那么您需要使用开发者负载将购买附加到您的一个购买帐户。否则,有人可能会在你的应用程序中切换帐户,并从购买的物品中获益

e、 g

假设我们的应用程序有userA和userB的登录名。手机的安卓谷歌账号是X

  • userA,登录我们的应用程序并购买终身会员资格。购买详细信息存储在google帐户X下
  • userA注销,userB登录到我们的应用程序。现在,userB也获得了终身会员的好处,因为安卓谷歌账户仍然是X
  • 为了避免这种滥用,我们会将购买绑定到帐户。在上面的示例中,当userA进行购买时,我们将开发人员负载设置为“userA”。因此,当userB登录时,有效负载将与登录用户(userB)不匹配,我们将忽略购买。因此,userB无法从userA的购买中获得好处。

    我对此感到很挣扎
    MD5(purchaseId + accountId)
    
    MD5(purchaseId + accountId)