我正在尝试使用 Google Checkout API 从我的服务器验证 Android 应用内购买。根据另一个查询(Android 市场上的应用程序 - 没有 HTTP 通知),我没有收到回调,所以我使用轮询 API。
它工作正常,只是在轮询收到有关购买的通知之前我有 5 或 6 分钟的延迟,即使所有信息已经对在浏览器中登录到商家帐户的用户可见。检查 API 文档,这意味着可能需要更长的时间,因为它指出“使用轮询 API,您可以检索不到 180 天且至少 30 分钟的所有通知”。
这种延迟是否典型(我在英国)?轮询 API 是否仍然是验证 Android 应用内购买的推荐方法?
在我看来,尝试通过服务器上的 Google Checkout 轮询 API 验证 GP LVL 和/或 IAB 信息并不是最好的方法。如果你有服务器的话,还有更好的选择。
正如文章中提到的保护 Android LVL 应用程序的安全,最好的方法是在受信任的服务器上验证许可证信息。事情是这样的:
- 不要使用 Google 演示代码;它不稳健(不检查所有错误条件)并且甚至可以被脚本替换,例如伪造响应(尽管,如果您按如下方式实现服务器端检查,那么无论如何这是无关紧要的)。使用
com.android.vending.licensing
直接地。不要在您的应用中包含您的 Google 开发者控制台应用密钥,您在那里不需要它。
- 您的应用程序向您的服务器请求随机数
ILicensingService.checkLicense()
称呼。您的服务器向您的应用程序提供安全的随机数。您的应用程序调用ILicensingService.checkLicense()
与那个随机数。
- Android GO LVL 服务通过以下方式回调您的应用程序
ILicenseResultListener.verifyLicense()
,提供签名数据和签名。 (提示:签名数据包含随机数,因此这里甚至不可能进行重放攻击。)
- 您的应用程序将签名数据连同签名一起传递到您的服务器。
- 您的服务器是唯一知道您的 Google 开发者控制台应用程序密钥的实例。它根据签名数据验证签名。
- 验证结果将有助于您有关访问服务器数据的身份验证决策。
- 确保不要过于频繁地检查许可证。 Google 希望您遵守许可证响应中提供的有效性时间戳(他们声称它甚至反映了 15 分钟的退款期)。显然,只有将有效性存储在server端和服务器允许应用程序跳过步骤 2 中的测试。
但有一点不同,这同样适用于 IAB。不幸的是,IAB V3 不适用于以下随机数:getPurchases()
。原因大概是这样的IAB 服务本身(而不仅仅是 Google 应用程序端参考代码)广泛使用缓存。不过,对于购买,您可以通过developerPayload
to com.android.vending.billing.IInAppBillingService.getBuyIntent()
,这将包含在签名数据中getPurchases()
返回。所以只要你有no过期标准或某种implicit(基于时间)或服务器管理的显式应用内购买的过期标准,API仍然足够安全;然后,服务器会要求应用程序消耗过期的项目,如果失败甚至不是问题,因为服务器仍然知道它,并且可以要求应用程序一次又一次地消耗这些项目。
我希望我能对这个话题有所启发。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)