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

Does queryPurchases() from Play Billing Library guarantees retrieving a valid purchase?

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

不过,有些地方还不清楚,我在这里找不到答案。

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

As long as the in-app product is on this list, the user should have access to it.

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

这是真的吗?

欢迎使用 Whosebug!

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

问题是有些黑客应用程序允许人们进行欺诈性购买,它还会更改设备的代码,因此 returns 可以进行任何签名验证。 这只有在获得 root 权限的设备上才有可能,而且不太可能发生,因为 Google 正在密切关注该问题,但仍有可能发生!。

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

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

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

这是一个如何做的例子,要验证的数据是purchase.getOriginalJson()的数据,签名在purchase.getSignature()

希望对您有所帮助。

更新: 在您的代码中提供另一种签名验证替代方法也很方便,以防您的服务器出现故障或无法访问互联网。