IAB не возвращает неиспользованную покупку

У меня есть приложение, в котором есть покупки в приложении с помощью Google In-App Billing API. Как правило, это работает хорошо, даже если подключение к Интернету потеряно после совершения покупки, в результате чего продукт отображается как неиспользованная покупка. Однако в некоторых крайних случаях, связанных с включением и выключением Wi-Fi несколько раз во время покупки, иногда случается, что покупка обрабатывается (т.е. деньги были выплачены), но еще не израсходованы в приложении.

При использовании метода getPurchases () этот продукт не возвращается как неиспользованная покупка, даже если в документации указано, что это должно быть. Однако при повторной попытке приобрести этот продукт API возвращает код BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED.
. Таким образом, этот продукт является отмечен как неиспользованный.

Интересно, что после того, как я запустил команду adb shell pm clear com.android.vending в своем терминале, этот продукт действительно появляется в списке, возвращаемом из getPurchases().

Что здесь происходит, когда продукт отображается как неиспользованный продукт только после выполнения команды терминала? Как я могу заставить этот продукт отображаться должным образом при вызове getPurchases?

(Если эта проблема не может быть устранена, возможно, я мог бы при загрузке представления, в котором можно совершать покупки, «смоделировать» процесс покупки для каждого элемента, проверить, возвращает ли он код BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED, предоставить пользователю покупку для каждого элемента, который и разрешите эту покупку программно (хотя это кажется преувеличенным).

9
0
372
2

Ответы 2

Как сказал документы

Upon a successful purchase, the user’s purchase data is cached locally by Google Play’s In-app Billing service

Я столкнулся с той же проблемой, и единственным решением, которое я нашел, было посоветовать пользователю сначала открыть приложение Play Store (это должно обновить внутренний кеш выставления счетов), а затем вернуться в свое приложение и завершить покупку (покупка должна быть доступна в инвентаре)

Открытие приложения Play Store, похоже, не приводит к обновлению внутреннего кеша выставления счетов для меня :( Даже вход в настройки приложения и очистка кеша не помогает. Принудительная остановка приложения Play Store решает проблему, но я хочу спросить пользователь сделать это не будет отличной идеей, ха-ха, хотя спасибо!

Jeroen Hoste 20.04.2018 01:27

Потому что сервис Google Play кэширует результат и сначала возвращает значение кеша.

Покупка совершается до отключения интернета. В результате состояние покупки не обновляется в кеше. Когда вы впервые запрашиваете getPurchases (), она возвращает кешированное значение, поэтому продукт не отображается в списке покупок.

После того, как вы используете команду для очистки кеша, она заставит службу Google Play обновить кеш, прежде чем вернуть список для getPurchases (). Итак, продукт появился!

Итак, я думаю, вам следует обработать код уже_owned вместо того, чтобы проверять состояние покупки, вызывая в этом случае getPurchases ().

Под «обработкой уже_всеного_кода» вы имеете в виду ответ, который я получаю при повторной попытке приобрести товар? Это то, о чем я тоже думал в крайнем случае, но для этого потребовалось бы, чтобы пользователь либо вручную попытался купить этот предмет снова, либо потребовал бы от меня «попытки купить» все предметы при открытии соответствующего экрана. Надеялся, что будет более элегантное решение :) Спасибо за ваш вклад!

Jeroen Hoste 20.04.2018 01:26

Другие вопросы по теме