我正在使用Google Play计费库,并且阅读了文档以及有关在服务器上验证购买以及如何查询购买的所有问题。
但是,有些要点仍然不清楚,我在这里找不到答案。
[要在用户下次启动应用程序时检索购买,文档说我们应该使用BillingClient.queryPurchases()
,并说明从此方法获得的列表:
只要应用内商品在此列表中,用户应具有访问它。
我从中了解到,单独使用queryPurchases()可以保证用户确实购买了该商品,并且他必须可以访问该商品。
这是真的吗?
欢迎使用stackoverflow!
如果可靠地验证了接收到的数据的签名,则[queryPurchases()
是完全安全的。
问题是,有些黑客应用程序允许人们进行欺诈性购买,并且还会更改设备的代码,因此它可以很好地返回任何签名验证。这仅在有根设备上才有可能,并且不太可能发生,因为Google密切关注该问题,但仍然有可能!
欺诈性购买将永远没有正确的签名,因为只能使用Play控制台专门为您的应用程序生成的密钥来生成它。
[不幸的是,许多程序员忘记了验证代码中的签名,而对于以前所说的,最好在无法被黑客应用程序更改的外部服务器上进行验证。
[当Google提到服务器端验证时,它是指验证服务器上的签名,而不是您必须保留并行的购买清单。
这里是一个示例,要验证的数据是purchase.getOriginalJson()
的数据,并且签名在purchase.getSignature()
中https://stackoverflow.com/a/48531877/7690376
希望它会有所帮助。
更新:如果服务器关闭或无法访问互联网,在代码中提供另一个签名验证替代方法也很方便。