2

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

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

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

只要应用内产品在此列表中,用户就应该有权访问它。

我从中了解到的是,仅 queryPurchases() 就可以保证用户确实购买了该商品,并且他必须能够访问它。

这是真的?

  • 如果是,那么为什么我们不只是在用户购买后立即使用此方法作为验证,而不是在服务器上验证呢?
  • 如果否,如果我不想在他每次启动应用程序时在我的服务器上验证他的购买,我如何为用户提供访问权限?
  • 如果我在第一次验证后将购买保存在本地数据库中,并在应用程序启动时询问它以授予用户访问他的项目的权限,这是一种安全的方法,还是可以从恶意用户操纵这个数据库来授予自己访问溢价的权限内容?
4

1 回答 1

1

欢迎来到堆栈溢出!

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

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

欺诈性购买永远不会有正确的签名,因为它只能使用 Play 管理中心专门为您的应用生成的密钥生成。

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

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

这是如何执行此操作的示例,要验证的数据是的数据purchase.getOriginalJson()和签名在purchase.getSignature() https://stackoverflow.com/a/48531877/7690376

希望它会有所帮助。

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

于 2020-05-10T11:56:48.673 回答