针对应用内结算的Android文档似乎在以下问题上非常明确。在REQUEST_PURCHASE
显示具有待处理意图的结帐后(很好,没有问题),然后用户与结帐交互并点击购买按钮(在这种情况下,我使用的是静态产品ID android.test.purchased
)。
现在我的广播接收器应该收到RESPONSE_CODE
和那么和IN_APP_NOTIFY
。嗯,这没有发生。有时我会先得到回复,但经常会在收到通知后收到回复。
下面引用的Android Doc部分中的第二个重点部分是为什么这是一个问题。当我获得对购买请求的异步响应时,如果我将应用程序中的状态更新为待处理,因为文档似乎表明我应该在通知之后发出响应,我的应用程序会陷入暂挂状态。是否应该说“当你从立即同步响应中收到result_ok时”?
这是Goole Play的错误(手机上的Google Play版本为3.5.15,Android操作系统版本为2.2)?我误解了Docs吗?文件是否完全错误?这是静态测试产品的问题吗?还有其他可能出错的地方吗?请注意,就我而言,一切都在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结帐用户界面会显示“授权” 购买......“通知;但是,此通知被驳回 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
答案 0 :(得分:3)
我也遇到过同样的问题。根据问题Are Android broadcasts received in order?中的答案,并不能绝对保证按照发送的顺序接收意图。他们通常会,但不一定。因此,即使Google Play正确地命令它们,它们仍然可以以其他顺序到达。
在我看来,唯一的解决方案是不假设RESPONSE_CODE到达的时间。在这方面,Android文档确实对我来说确实是错误的。响应代码应该可以通过回调实现,而不是广播。我不得不承认谷歌有时会变得粗心。