Существенная задержка между покупкой неуправляемого предмета в приложении и уведомлением об изменении состояния покупки

У меня есть приложение на рынке Android с возможностью покупки кредита в приложении уже много месяцев. Наша проблема №1 — это пользователи, которые успешно завершили свою неуправляемую покупку и получили счет, но по какой-то причине мое клиентское приложение не записывает ее на наши серверы. Это не происходит в 100% случаев, большинство покупок выполняются успешно, и у нас есть очень агрессивная логика повторных попыток, если успешная покупка не может быть загружена на сервер из-за проблем с подключением или чего-то еще.

Недавно мы стали свидетелями сценария, когда в приложении была совершена покупка неуправляемого товара, но метод onRequestPurchaseResponse (определенный в примере кода PurchaseObserver.java, на котором основан наш код), фактически не вызывался более 60 секунд.

Теперь я подозреваю, что в этих случаях, когда успешные покупки не загружаются на наши серверы, onRequestPurchaseResponse либо никогда не вызывается, либо пользователь выходит из приложения до того, как уведомление произойдет, потому что оно так задерживается.

Теперь я показываю ProgressDialog каждый раз, когда onResume вызывается после того, как пользователь возвращается из приложения Android Marketplace, чтобы пользователи не уходили слишком быстро и тем самым не позволяли нам записывать покупку.

Может ли кто-нибудь сказать мне, есть ли какие-либо известные ошибки, связанные с задержкой или отсутствием уведомлений из приложения Android Marketplace после успешной покупки, и если да, то какие обходные пути вы использовали?


person esilver    schedule 05.01.2012    source источник
comment
У меня те же проблемы, что и у вас, и я только что наткнулся на эту статью: thenextweb.com/mobile/2012/01/05/   -  person Emir Kuljanin    schedule 10.01.2012
comment
Благодарю вас! Эта статья определенно описывает то, что мы видим   -  person esilver    schedule 10.01.2012
comment
Привет, я разработчик, о котором идет речь в этой статье. Что бы это ни стоило, я думаю, что неуправляемые покупки более надежны, чем управляемые покупки (то, что я использую). Я подозреваю, что ваша проблема может быть просто ошибочной реализацией с вашей стороны. :) Ошибки также были исправлены, согласно google, 22 декабря. С тех пор я не сталкивался с новыми случаями.   -  person koush    schedule 10.01.2012
comment
Вот исходный пост Google+: plus.google.com/u/0/103583939320326217147 /posts/WGQUjMiWoT2   -  person esilver    schedule 10.01.2012
comment
Кроме того, команда рынка предположительно исправила проблемы по состоянию на 22 декабря. Я подтвердил, что мои проблемы прекратились после этой даты. Хотя заказы, которые были потеряны/отсутствуют данные, все еще сломаны.   -  person koush    schedule 10.01.2012
comment
Вполне может быть глючная реализация, спасибо за инфу RE фикс от 22 декабря. Проверил два своих девайса и вижу последняя версия Маркета 3.4.4. Вы знаете, является ли это последней версией, в которой, как сообщается, были исправлены проблемы? Спасибо!   -  person esilver    schedule 10.01.2012


Ответы (1)


Задержка — это не ошибка. Системы обработки транзакций не работают в режиме реального времени, и практически ни одна из систем с общедоступным API не дает надежной гарантии времени, которое потребуется либо для обработки транзакции, либо для сообщения об успешной покупке продавцу.

Однако я не уверен, что вижу проблему. Ваше приложение должно получать уведомление об обратном вызове в какой-то момент времени, пока пользователь в конце концов снова не запустит его. Предполагая, конечно, что Google ставит уведомления о покупках в очередь до тех пор, пока не будет уверен, что они были доставлены хотя бы один раз. Я бы предположил, что они будут.

В любом случае, я думаю, у вас есть несколько вариантов:

  1. Внедрите своего клиента, чтобы он всегда предполагал, что покупка была успешной, если/пока он не услышит обратное. Затем вместо того, чтобы приложение сообщало серверу, когда произошла покупка, вам просто нужно, чтобы оно сообщало серверу, когда покупка, которая, как вы думали, не произошла. Этот подход имеет те же проблемы с задержкой, что и ваш текущий подход, но побочные эффекты менее вредны для пользователей.

  2. Просто дождитесь обратного вызова с уведомлением, который должен прийти в конце концов, и отправьте его. Вместо того, чтобы блокировать все ваше приложение в попытке удержать пользователя от навигации, просто покажите его покупку со статусом «Ожидает подтверждения от Google», пока вы не получите обратный вызов (который, в зависимости от того, что делает пользователь, может произойти через несколько минут). , часов или дней после фактической покупки). Затем отправьте информацию на свой сервер и обновите состояние покупки в приложении, когда отправка на сервер будет успешной.

person aroth    schedule 06.01.2012
comment
Согласен, что задержка не является ошибкой; при этом задержка должна происходить в самом приложении Android Marketplace, а не в связи между приложением Android Marketplace и моим клиентским приложением. К сожалению, мое приложение не может предположить, что транзакция прошла успешно, поскольку сервер проверяет подпись транзакции. По сути, архитектура ошибочна — транзакции должны выполняться на стороне сервера, а не на стороне клиента, на стороне сервера, на стороне клиента, а затем на стороне сервера, но это то, к чему Android Marketplace принуждает приложения. - person esilver; 06.01.2012