验证的Android应用程序内购买时的延迟与谷歌Checkout的轮询API(Delay when

2019-08-31 06:08发布

我试图从使用谷歌Checkout的API我的服务器验证的Android应用内购买。 按照这个其他查询( 应用程序的Android市场- HTTP通知不来 ),我没有得到任何的回调,所以我使用轮询API。

它的工作很好,除了轮询接收关于购买通知,在此之前,我得到一个5或6分钟的延迟,即使所有的信息已经是可见的用户在浏览器中登录到商家账户。 检查API文档,这意味着它可能需要更长的时间,因为它指出:“使用轮询API,你可以检索那些小于180天,并且是至少30分钟古时的通知”。

这是典型的延迟(我在英国的)? 是轮询API仍然验证一个Android应用程序内购买推荐的方式?

Answer 1:

在我看来,试图验证GP LVL和/或通过服务器上的谷歌Checkout的轮询API IAB的信息是不是最好的方法。 有可用的一个更好的选择,如果你有一台服务器反正。

正如在文章中提到固定的Android应用拉特 ,最好的办法是验证的可信服务器上的许可信息。 它是这样的:

  1. 不要使用谷歌演示代码; 它是不稳健(不检查所有错误情况) ,并且可以如伪造的响应(虽然,如果实现如下服务器端的检查,这是无关紧要的反正)通过脚本甚至取而代之。 使用com.android.vending.licensing直接。 不包括与您的应用程序的谷歌开发者控制台应用程序键,你不需要它。
  2. 您的应用程序会询问你的服务器的随机数ILicensingService.checkLicense()调用。 您的服务器提供了一个安全的随机数到您的应用程序。 你的应用程序调用ILicensingService.checkLicense()与该随机数。
  3. Android的GP LVL Servce回拨通过应用程序ILicenseResultListener.verifyLicense() ,prodiving签名的数据和签名。 (提示:签约数据中包含的随机数,所以甚至没有重新上场的攻击是可能的。)
  4. 您的应用通过签名的数据与签名到您的服务器一起。
  5. 你的服务器是哪知道你的谷歌开发者控制台应用程序键的唯一实例。 这对验证签名的数据的签名。
  6. 验证结果将有助于了解获取服务器数据的认证决策。
  7. 确保你不检查许可证过于频繁。 谷歌希望你服从提供的许可证响应有效性时间戳(他们声称它甚至还反映了15分钟的退款期限)。 显然,如果你存储在服务器端的有效性和服务器允许的应用程序,跳过测试,在步骤2中,这将仅是安全的。

有一点不同,同样适用于IAB。 不幸的是,IAB V3不与现时工作的getPurchases() 原因可能是IAB的服务本身(而不仅仅是谷歌应用程序端的参考代码)使用高速缓存广泛 。 尽管如此,购买时,您可以通过一个developerPayloadcom.android.vending.billing.IInAppBillingService.getBuyIntent()这将被包含在签约数据, getPurchases()返回。 所以只要你有或者没有到期的标准或某种隐含的 (基于时间)或服务器管理明确到期标准应用内购买,该API仍然是足够安全的; 那么服务器将要求应用程序消耗过期的项目,如果失败了,因为服务器仍然知道它,可以要求应用程序一次又一次消费项目,它甚至不是一个问题。

我希望我能够说明一点光对这个话题。



文章来源: Delay when verifying Android in-app purchase with Google Checkout Polling API