Существенная задержка между покупкой в ​​приложении неуправляемого предмета и уведомлением об изменении состояния покупки - PullRequest
1 голос
/ 06 января 2012

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

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

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

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

1 Ответ

2 голосов
/ 06 января 2012

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...