Трансляции биллинга в приложении из Google Play в неправильном порядке? (статическое тестирование)

Документы Android для биллинга в приложении кажутся довольно ясными по следующему вопросу. После REQUEST_PURCHASE вы показываете кассу с ожидающим намерением (хорошо, без проблем), затем пользователь взаимодействует с кассой и нажимает кнопку покупки (в этом случае я использую статический идентификатор продукта android.test.purchased).

Теперь мой широковещательный приемник должен получить RESPONSE_CODE и ЗАТЕМ IN_APP_NOTIFY. Ну, этого не происходит. Иногда я получаю ответ первым, но часто я получаю его после уведомления.

Второй выделенный раздел из раздела Android Doc, цитируемый ниже, объясняет, почему это проблема. Если я обновлю статус в своем приложении на ожидание, когда я получу асинхронный ответ на запрос на покупку, как кажется, указывает документация, я должен тогда, если этот ответ придет после уведомления, мое приложение застрянет в состоянии ожидания. Предполагается ли говорить «когда вы получите result_ok из немедленного ответа syncronus»?

Это ошибка с Goole Play (версия Google Play на моем телефоне — 3.5.15, а версия ОС Android — 2.2)? Я неправильно понимаю Документы? Документы просто неверны? Это проблема с продуктами статического тестирования? Возможно, что-то еще идет не так? Обратите внимание, что на моей стороне все выполняется в потоке пользовательского интерфейса, поэтому это не проблема с потоками.

Вывод журнала типичного нерабочего запуска показан внизу.

Соответствующий раздел документации Android (выделено мной):

Обработка широковещательных намерений

Запрос REQUEST_PURCHASE также вызывает два асинхронных ответа (широковещательные намерения). Сначала приложение Google Play отправляет широковещательное намерение RESPONSE_CODE, в котором содержится информация об ошибке в запросе. Если запрос не генерирует ошибку, широковещательное намерение RESPONSE_CODE возвращает RESULT_OK, что указывает на то, что запрос был успешно отправлен. (Чтобы было ясно, ответ RESULT_OK не означает, что запрошенная покупка была успешной; он указывает, что запрос был успешно отправлен в Google Play.)

Затем, когда запрошенная транзакция меняет состояние (например, покупка успешно списана с кредитной карты или пользователь отменяет покупку), приложение Google Play отправляет широковещательное намерение IN_APP_NOTIFY. Это сообщение содержит идентификатор уведомления, который можно использовать для получения сведений о транзакции для запроса 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

person ChrisJD    schedule 05.04.2012    source источник


Ответы (1)


Я тоже столкнулся с этой самой проблемой. Согласно ответам на вопрос принимаются ли трансляции Android по порядку?, нет абсолютной гарантии, что намерения будут получены в том порядке, в котором они были отправлены. Обычно они есть, но не обязательно. Таким образом, даже если Google Play упорядочивает их правильно, они все равно могут прибыть в другом порядке.

На мой взгляд, единственное решение — ничего не предполагать о времени прихода RESPONSE_CODE. В этом отношении документация Android действительно кажется мне неправильной. Коды ответов, вероятно, должны были быть реализованы через обратный вызов, а не как широковещательные рассылки. Я должен признать, что Google иногда ведет себя довольно небрежно.

person Malcolm    schedule 07.04.2012
comment
эрг. Это то, что я понял, учитывая количество других ошибок в платежных документах. Рад, что я не единственный, кто сталкивается с такими проблемами. - person ChrisJD; 10.04.2012