Android 在应用程序内购买非托管物品和购买状态更改通知之间存在重大延迟

Android 在应用程序内购买非托管物品和购买状态更改通知之间存在重大延迟,android,google-play,in-app-purchase,in-app-billing,Android,Google Play,In App Purchase,In App Billing,我已经在Android marketplace上有一个应用程序,具有应用内信用购买能力,已经有好几个月了。我们的#1问题是成功完成非托管购买并计费的用户,但无论出于何种原因,我的客户端应用程序没有将其记录到我们的服务器。这种情况并非100%都会发生,大多数购买都会成功执行,如果由于连接问题或其他原因无法将成功购买上载到服务器,我们会有非常积极的重试逻辑 最近,我们看到了一个场景,其中对非托管项目进行了应用内购买,但onRequestPurchaseResponse方法(在示例代码中定义,我们的代

我已经在Android marketplace上有一个应用程序,具有应用内信用购买能力,已经有好几个月了。我们的#1问题是成功完成非托管购买并计费的用户,但无论出于何种原因,我的客户端应用程序没有将其记录到我们的服务器。这种情况并非100%都会发生,大多数购买都会成功执行,如果由于连接问题或其他原因无法将成功购买上载到服务器,我们会有非常积极的重试逻辑

最近,我们看到了一个场景,其中对非托管项目进行了应用内购买,但onRequestPurchaseResponse方法(在示例代码中定义,我们的代码基于此)在超过60秒的时间内没有实际调用

我现在怀疑的是,在这些成功购买没有上传到服务器的情况下,onRequestPurchaseResponse要么从未调用,要么用户在通知发生之前退出应用程序,因为它被延迟了

现在,每当用户从Android Marketplace应用程序返回后调用onResume时,我都会显示一个ProgressDialog,以防止用户过快离开,从而阻止我们记录购买情况


有人能告诉我,在成功购买Android Marketplace应用程序后,是否存在任何已知的错误,包括延迟或丢失通知,如果有,您部署了哪些解决方法

延迟不是错误。交易处理系统不是实时的,而且几乎没有一个具有公共API的系统能够为处理交易或向商户报告成功购买所需的时间提供可靠的保证

然而,我不确定我是否看到了这个问题。您的应用程序应该在某个时间点收到回调通知,只要用户最终再次运行它。当然,假设谷歌将其购买通知排成队列,直到它确信它们至少已经发送了一次。我想他们会的

无论如何,我认为你有两个选择:

  • 让您的客户始终假设购买成功,除非/直到听到其他消息。然后,你不需要应用程序告诉服务器什么时候发生了购买,只需要它告诉服务器什么时候发生了你认为没有发生的购买。这种方法与当前方法存在相同的延迟问题,但副作用对用户的危害较小

  • 只需等待最终应该出现的通知回调,然后发送它。不要锁定你的整个应用程序,试图阻止用户离开,只需显示他们的购买状态为“等待谷歌确认”,直到你收到回调(这取决于用户的行为,可能发生在实际购买后几分钟、几小时或几天)。然后将信息发送到服务器,并在发送到服务器成功时更新应用程序中的购买状态


  • 同意延迟不是错误;这就是说,延迟应该出现在Android Marketplace应用程序本身,而不是Android Marketplace应用程序和我的客户端应用程序之间的通信中。不幸的是,我的应用程序不可能假定事务成功,因为服务器验证事务的签名。从根本上说,该架构是有缺陷的——交易应该发生在服务器端,而不是客户端、服务器端、客户端,然后是服务器端,但这正是Android Marketplace迫使应用程序进入的。我和你有同样的问题,刚刚读到这篇文章:谢谢!那篇文章明确地描述了我们所看到的,我是这篇文章中提到的有问题的开发者。就其价值而言,我认为非托管采购比托管采购(我使用的)更可靠。我怀疑您的问题可能只是您的错误实现。:)据谷歌称,这些漏洞也在12月22日得到了修复。从那以后,我再也没有经历过任何新的事件。这是最初的G+帖子:而且,市场团队应该已经在12月22日解决了这些问题。我确认我的问题在那一天之后停止了。尽管丢失/丢失数据的订单仍被破坏。