Документы 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