3

In-app Billing 的 Android 文档似乎对以下问题非常清楚。在REQUEST_PURCHASE您显示带有未决意图的结帐后(很好,没有问题),然后用户与结帐交互并点击购买按钮(在这种情况下,我使用的是静态产品 ID android.test.purchased)。

现在我的广播接收器应该收到一个RESPONSE_CODE然后一个IN_APP_NOTIFY。好吧,那没有发生。有时我会先收到回复,但通常我会在收到通知后收到回复。

下面引用的 Android Doc 部分的第二个强调部分是为什么这是一个问题。如果我在收到对购买请求的异步响应时将我的应用程序中的状态更新为待处理,因为文档似乎表明我应该这样做,那么如果该响应出现在通知之后,我的应用程序陷入待处理状态。是否应该说“当您从即时同步响应中收到 result_ok 时”?

是 Goole Play 的 bug(我手机上的 Google Play 版本是 3.5.15,Android os 版本是 2.2)?我误解了文档吗?文档是完全错误的吗?是静态测试产品的问题吗?是不是还有什么问题?请注意,在我这边,一切都在 UI 线程中运行,所以这不是线程问题。

典型的非工作运行的日志输出显示在底部。

Android文档的相关部分(强调我的):

处理广播意图

一个 REQUEST_PURCHASE 请求还会触发两个异步响应(广播意图)。首先,Google Play 应用程序发送一个 RESPONSE_CODE 广播意图,它提供有关请求的错误信息。如果请求没有产生错误,则 RESPONSE_CODE 广播意图返回 RESULT_OK,表示请求发送成功。(需要明确的是,RESULT_OK 响应并不表示请求的购买成功;它表示请求已成功发送到 Google Play。)

接下来,当请求的交易改变状态时(例如,购买成功通过信用卡扣款或用户取消购买),Google Play 应用程序发送一个 IN_APP_NOTIFY 广播意图。此消息包含一个通知 ID,您可以使用它来检索 REQUEST_PURCHASE 请求的交易详细信息。

注意:Google Play 应用程序还会发送 IN_APP_NOTIFY 请求退款。有关更多信息,请参阅处理 IN_APP_NOTIFY 消息。

因为购买过程不是即时的,并且可能需要几秒钟(或更长时间),所以您必须假设从您收到 RESULT_OK 消息到您收到交易的 IN_APP_NOTIFY 消息为止,购买请求处于待处理状态。当交易处于待处理状态时,Google Play 结账 UI 会显示“授权购买...”通知;但是,此通知会在 60 秒后关闭,您不应依赖此通知作为向用户传达交易状态的主要方式。相反,我们建议您执行以下操作:

我的日志中的示例未按预期顺序进行:

MAKING REQUEST: PurchaseRequest
EXECUTING REQUEST: PurchaseRequest
IMEDIATE RESPONSE IN: PurchaseRequest, IS RESULT_OK
REQUEST ID: 1814990809059790249, PurchaseRequest
Receiver: Notify
Notify String in IN_APP_NOTIFY intent: android.test.purchased
PROCESSING NOTIFICATION
MAKING REQUEST: PurchaseInformationRequest
EXECUTING REQUEST: PurchaseInformationRequest
IMEDIATE RESPONSE IN: PurchaseInformationRequest, IS RESULT_OK
REQUEST ID: 602248989635492868, PurchaseInformationRequest
Receiver: purchase state changed
PROCESSING PURCHASE_STATE_CHANGE
newestMarketPurchaseState = PURCHASED
SetState on product 'Enterprise'. Message: PURCHASED
MAKING REQUEST: ConfirmNotificationsRequest
EXECUTING REQUEST: ConfirmNotificationsRequest
IMEDIATE RESPONSE IN: ConfirmNotificationsRequest, IS RESULT_OK
REQUEST ID: 693394902887436727, ConfirmNotificationsRequest
Receiver: Response Code = RESULT_OK
Receiver: Response Code requestId = 602248989635492868
PROCESSING RESPONSE
ASYNCH RESPONSE IN: PurchaseInformationRequest, IS RESULT_OK
Receiver: Response Code = RESULT_OK
Receiver: Response Code requestId = 1814990809059790249
PROCESSING RESPONSE
ASYNCH RESPONSE IN: PurchaseRequest, IS RESULT_OK
SetState on product 'Enterprise'. Message: PURCHASE PENDING
Receiver: Response Code = RESULT_OK
Receiver: Response Code requestId = 693394902887436727
PROCESSING RESPONSE
ASYNCH RESPONSE IN: ConfirmNotificationsRequest, IS RESULT_OK
Confirm Notifications Request returned asynch OK
4

1 回答 1

3

我也遇到过同样的问题。根据问题中的答案是否按顺序接收 Android 广播?, 不能绝对保证按照发送的顺序接收意图。他们通常这样做,但不一定。因此,即使 Google Play 正确订购了它们,它们仍然可以以其他顺序到达。

在我看来,唯一的解决方案是不要假设 RESPONSE_CODE 到达的时间。在这方面,Android 文档对我来说确实是错误的。响应代码可能应该通过回调实现,而不是广播。我不得不承认,谷歌有时会变得相当粗心。

于 2012-04-07T17:06:43.590 回答