Play Billing Library中的queryPurchases()是否保证检索有效的购买?

问题描述 投票:1回答:1

我正在使用Google Play计费库,并且阅读了文档以及有关在服务器上验证购买以及如何查询购买的所有问题。

但是,有些要点仍然不清楚,我在这里找不到答案。

[要在用户下次启动应用程序时检索购买,文档说我们应该使用BillingClient.queryPurchases(),并说明从此方法获得的列表:

只要应用内商品在此列表中,用户应具有访问它。

我从中了解到,单独使用queryPurchases()可以保证用户确实购买了该商品,并且他必须可以访问该商品。

这是真的吗?

  • 如果是,那么为什么我们不只是在用户之后使用此方法进行购买作为验证,而不是在服务器?
  • 如果不,如果我不想,该如何为用户提供访问权限每次启动应用程序时,都要在我的服务器上验证他的购买吗?
  • 如果我在第一次购买后将购买的商品保存在本地数据库中验证并在应用启动以向用户授予访问权限时询问对他的项目而言,这是一种安全的方法还是该数据库可以由恶意用户操纵以授予自己访问权限高级内容?
android in-app-purchase in-app-billing android-inapp-purchase play-billing-library
1个回答
0
投票

欢迎使用stackoverflow!

如果可靠地验证了接收到的数据的签名,则[queryPurchases()是完全安全的。

问题是,有些黑客应用程序允许人们进行欺诈性购买,并且还会更改设备的代码,因此它可以很好地返回任何签名验证。这仅在有根设备上才有可能,并且不太可能发生,因为Google密切关注该问题,但仍然有可能!

欺诈性购买将永远没有正确的签名,因为只能使用Play控制台专门为您的应用程序生成的密钥来生成它。

[不幸的是,许多程序员忘记了验证代码中的签名,而对于以前所说的,最好在无法被黑客应用程序更改的外部服务器上进行验证。

[当Google提到服务器端验证时,它是指验证服务器上的签名,而不是您必须保留并行的购买清单。

这里是一个示例,要验证的数据是purchase.getOriginalJson()的数据,并且签名在purchase.getSignature()https://stackoverflow.com/a/48531877/7690376

希望它会有所帮助。

更新:如果服务器关闭或无法访问互联网,在代码中提供另一个签名验证替代方法也很方便。

© www.soinside.com 2019 - 2024. All rights reserved.