android - 非托管项目的应用内购买与购买状态更改通知之间存在大量延迟

标签 android google-play in-app-purchase in-app-billing

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

最近我们目睹了一个场景,其中进行了非托管项目的应用内购买,但实际上并没有调用 onRequestPurchaseResponse 方法(在我们的代码所基于的示例代码 PurchaseObserver.java 中定义)超过 60秒。

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

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

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

最佳答案

延迟不是错误。交易处理系统不是实时的,并且几乎没有一个具有公共(public) API 的系统能够可靠地保证处理交易或将成功购买报告给商家所需的时间。

但是,我不确定我是否看到了这个问题。您的应用程序应该会在某个时间点收到回调通知,只要用户最终再次运行它即可。当然,假设 Google 对其购买通知进行排队,直到它确信它们至少已发送一次。我认为他们会的。

无论如何,我认为您有几个选择:

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

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

关于android - 非托管项目的应用内购买与购买状态更改通知之间存在大量延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8751325/

相关文章:

android - 为什么 android dialog.dismiss 从未调用过?

android - Android 中的动态权限

android - 如何在满足特定条件时结束android订阅?

android - 注册成为 Google Play 开发者需要多长时间?

ios - 如何使用单个 appStoreReceiptURL 验证多个 StoreKit 交易?

javascript - 来自 javascript 的 Google Play 商店应用内结算

android - NumberPicker 在对话框中呈现不正确

android - flutter 错误 : SafetyNet Attestation fails basic integrity

android - 如何调用Google Play星级评分对话框?

iphone - 解读苹果的交易收据