Google Play的应用内计费广播顺序不正确?(静态测试)



应用内计费的Android文档似乎对以下问题非常清楚。在REQUEST_PURCHASE之后,您显示了带有挂起意图的结账(好吧,没有问题),然后用户与结账交互并点击购买按钮(在本例中,我使用的是静态产品id android.test.purchased)。

现在,我的广播接收器应该接收一个RESPONSE_CODETHEN一个IN_APP_NOTIFY。但这并没有发生。有时我会先得到回复,但通常我会在收到通知后得到回复。

下面引用的Android文档部分的第二个强调部分是为什么这是一个问题。如果当我收到对购买请求的异步响应时,我将应用程序中的状态更新为挂起,正如文档所指示的那样,那么如果该响应是在通知之后出现的,我的应用程序将陷入挂起状态。它应该说"当你从即时同步响应中收到result_ok时"吗?

这是谷歌播放的错误吗(我手机上的谷歌播放版本是3.5.15,安卓操作系统版本是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

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

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

最新更新