Поддерживает ли версия 3 Google Play In-App Billing возврат средств?

У меня работает IAB v3, и я смог совершить покупку для управляемого элемента. Однако, чтобы продолжить разработку и тестирование, я хотел вернуть деньги за покупку, чтобы я мог попробовать сделать ту же покупку еще раз. Я вошел в свою учетную запись продавца Google Checkout и успешно вернул деньги за покупку. Однако приложение по-прежнему считает, что пользователь купил товар. Прошло уже несколько недель с тех пор, как я сделал возврат, так что это не проблема задержки.

По сути, в моей реализации QueryInventoryFinishedListener inventory.hasPurchase(SKU_REMOVE_ADS) всегда возвращает истину, даже после возврата (SKU_REMOVE_ADS - это SKU для товара, который я продаю). Я ожидал, что он вернет false после обработки возврата.

Если вы посмотрите на раздел «Обработка возвратов» справки IAB, это говорит, что ваше приложение должно прослушивать сообщения IN_APP_NOTIFY. Однако документация для IN_APP_NOTIFY относится к v2 in- биллинг приложения. Это не похоже на то, что доступно в v3, поскольку оно нигде не упоминается в справочнике v3, и я не могу найти ссылку на него в пример приложения TrivialDrive, которое они используют для демонстрации IAB v3.

Так поддерживает ли версия 3 IAB возврат / отмену покупок? Кто-нибудь пробовал и заработал?


person Alinium    schedule 02.04.2013    source источник


Ответы (3)


Что касается Google Play, то на самом деле нет никакой разницы между расходным материалом и непотребным предметом; это различие полностью зависит от того, что вы реализуете в своем приложении. Таким образом, даже если SKU, который вы тестируете, не предназначен для использования в качестве расходных материалов (например, для постоянного премиального обновления), в целях тестирования вы можете рассматривать его как расходный материал и использовать его, чтобы его можно было приобрести снова.

Удобный подход состоит в том, чтобы настроить временное меню тестирования в вашем приложении (например, путем добавления пункта меню во время тестирования в главное меню параметров вашего приложения), а затем заставить обработчик этого элемента вызывать метод takeAsync () вашего экземпляра IabHelper для артикул, который вы хотите снова протестировать при покупке. При этом товар будет израсходован и, таким образом, сразу же станет доступен для обратной покупки с вашего устройства.

Конечно, вы все равно захотите вернуть деньги за покупку через Google Checkout, чтобы не тратить собственные деньги только на тестирование своего приложения.

Я бы добавил, что consumerAsync (), похоже, также отлично работает для сброса тестового SKU android.test.purchased, если вы тестируете с использованием таких статических значений.

Что касается обновления состояния покупки для отражения возврата, я лично испытал (и есть много подобных отчетов, опубликованных другими разработчиками), что ручное инициирование возврата через Checkout (например, для тестовой покупки из приложения TrivialDrive) требует дней, чтобы изменить состояние покупки продукта (на INAPP_PURCHASE_STATE_REFUNDED).

(Зная, что несчастье любит компанию, некоторые из этих дополнительных отчетов можно найти в этой теме обсуждения: https://plus.google.com/+AndroidDevelopers/posts/R8DKwZDsz5m)

По крайней мере, отчасти это связано с кешированием данных о покупках в Google Play на устройстве.

По моему опыту, перезагрузка устройства иногда может привести к тому, что Google Play обновит свой кеш с серверов GP. Таким образом, возможно, что изменения, связанные с отменой или возвратом заказа через Checkout, также могут быть обнаружены после перезагрузки.

Может показаться, что такой длительный период обработки не принесет вам никакой пользы, поскольку вы не можете знать, когда пользователи перезагрузятся. Но опять же, вы знаете, что каждое устройство в конечном итоге будет перезагружено, и поэтому, если вас беспокоит, что пользователь, получивший возмещение, в конечном итоге будет заблокирован от использования возвращенного продукта IAB, несколько дней задержки могут не иметь большого значения, до тех пор, пока это в конце концов произойдет.

Конечно, помните, что это представление о том, что кеш будет обновляться при перезагрузке, недокументировано и анекдотично (как и многие варианты поведения IAB3 и TrivialDrive, пока что). Они называют это фольклором.

Еще одна вещь, которая запускает обновление, - это когда пользователь пытается купить продукт. Сразу после начала покупки система должна быть уверена, что продукт еще не принадлежит, и поэтому она обновляет кеш Google Play. По моему личному опыту, это всегда происходило. Но, опять же, это не очень практичный способ проверить возврат средств, потому что это потребует отображения диалогового окна покупки без приглашения, а также сообщения об ошибке, которое сообщает пользователю, что «у вас это уже есть» (если они делают < / em> владеть им).

Это действительно пригодится, когда пользователь платит за элемент IAB на одном из своих устройств, а затем пытается получить доступ к этому элементу на другом устройстве, которое принадлежит той же учетной записи, которая использовалась для купи это. Информация о покупке в этом случае очень часто еще не кэшируется. Но вы можете просто сделать небольшую заметку в диалоговом окне покупки, что, если элемент уже был куплен, попытка повторной покупки должна сделать его доступным на данном устройстве без дополнительной оплаты. Иногда требуется две (инициированные пользователем) попытки покупки, чтобы наконец получить ответ IabHelper.BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED. Да, немного запутанно, но я думаю, что с человеческой точки зрения это будет работать с соответствующим выделением сообщения и извиняющейся формулировкой диалогового окна подтверждения, говорящего им, что они владеют предметом, и т. Д .:-)).

На практике вы можете увидеть, что Google может не захотеть, чтобы каждый экземпляр каждого приложения IAB в мире обращался к его серверам каждый раз, когда осуществляется доступ к данным о покупках приложения, особенно с учетом того, что они советуют разработчикам чтобы проверять, что было куплено, каждый раз при запуске приложения. Это также проблема производительности вашего приложения - вот что такое кеширование. Поэтому вам нужно знать о триггерах для обновления кеша, и я не нашел ни одного места, где это официально задокументировано (кроме, как мы предполагаем, в коде). Так что будьте готовы выставить руки перед собой и начать ощупывать в темноте.

Дополнительную информацию о буферизации Google Play см. На этой странице:

При каких условиях Изменения сервера версии 3 для биллинга приложений стали доступны на клиентских устройствах?

Я хотел бы отметить, что во фрагменте кода вашего сообщения вы вызываете inventory.hasPurchase (SKU_REMOVE_ADS), но это сообщит вам только, находится ли покупка в списке покупок, возвращенных в объекте инвентаря; он не сообщит вам состояние покупки этого SKU. Я знаю, что это подход, используемый приложением TrivialDrive, но это приложение не занимается возвратами и отменами. Для обнаружения возвратов и отмененных заказов вам понадобится что-то вроде этого:

Purchase removeAdsPurchase = inventory.getPurchase(SKU_REMOVE_ADS);
if(removeAdsPurchase != null) {
  int purchaseStateForRemoveAds = removeAdsPurchase.getPurchaseState();
  if(purchaseStateForRemoveAds == 1) {
    //Do cancelled purchase stuff here
  }
  else if(purchaseStateForRemoveAds == 2) {
    //Do refunded purchase stuff here
  }
}

Хорошая новость о возврате средств и отмене заказов заключается в том, что и то, и другое, AFAIK, полностью на усмотрение разработчика. Итак, если вы обнаружите, что пользователи, которые получают их, могут продолжать использовать ваше приложение в течение длительного периода после этого, и если вы обнаружите, что многие пользователи пользуются этим, то вы можете решить, хотите ли вы продолжать предоставлять возмещение в все дела. Я предполагаю, что это не будет проблемой; даже если какой-то пользователь, получивший возмещение, некоторое время будет использовать ваше приложение, это не будет большой проблемой.

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

person Carl    schedule 04.04.2013
comment
Не решает изначальную загадку, почему состояние покупки не возвращается как возвращенное, но позволяет мне продолжать тестирование и разработку. Я приму этот ответ. - person Alinium; 05.04.2013
comment
Спасибо; Я обновил свой ответ выше, чтобы добавить то, что мне удалось узнать о процессе возврата, а также несколько других вещей. - person Carl; 05.04.2013
comment
Спасибо за правку; очевидно, три рецензента одобрили ваше изменение, а один отклонил его, поэтому я вошел, чтобы утвердить его сам как автор ответа, и мне сказали, что я был идиотом, потому что это изменение испортило мой пост, и что я провалил тест. чтобы увидеть, обращаете ли вы внимание. Думаю, даже ТАК не идеален! Во всяком случае, каким-то образом я вижу ваше редактирование на странице, так что все хорошо, что хорошо кончается (я говорю, когда меня затаскивают в темницу SO для коррекции поведения с помощью углей и острых щипцов). - person Carl; 07.04.2013
comment
Тестирование IAP Google было худшим опытом в моей жизни! Я советую ЛЮБОМУ инди-разработчику: даже не думайте о IAP ... просто сделайте пробную сборку приложения и профессиональную сборку приложения. Это также помогает в том, что вас не заставляют публично раскрывать свой реальный адрес !! - person Someone Somewhere; 04.02.2016
comment
Эта часть The good news about refunds and canceled orders is that both are, AFAIK, entirely at the option of the developer. больше не соответствует действительности. Теперь пользователь может заполнить форму прямо в Google. . И деньги возвращаются примерно через 5 минут. Я проверил себя. Так есть ли другой способ определить статус покупки? Я пытаюсь использовать GGplayAPI, но все еще требуется время, чтобы обновить статус с Chargable до Cancel (или это зависит от того, когда пользователь отправит форму возврата). - person Trung Nguyen; 09.05.2016
comment
@Carl Я тестировал выставление счетов на покупку приложений V3, после покупки, возврат средств разработчиком, пользователь всегда получает статус купленного. Даже пробовал с чистым кешем игрового магазина, чистым кешем приложения, ждал 1 месяц, но пользователь все еще пользуется как платное приложение. Даже я тестировал статус NOT_LICENSED с электронным письмом разработчика, тестирующим в игровом магазине, но с таким же результатом. Есть ли какое-либо решение для отмены выплаченных льгот после того, как мы вернем пользователю сумму? - person Smeet; 06.03.2020

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

Теперь убедитесь, что вы тестируете приложение с тем же идентификатором Gmail, за который у вас есть возмещение? Чтобы проверить сценарий возврата, я думаю, вы можете использовать идентификатор продукта android.test.refundedas.

Если это не работает, вы можете сначала проверить общее количество приобретенных предметов и Доступных предметов в Google Play при первом запуске вашего приложения, и если вы получаете один и тот же идентификатор продукта в обоих вызовах (чего не должно быть, если это так, сообщите об этой ошибке в Google), затем выполните вызов api, чтобы сделать тот же элемент потребленным.

person Ankit    schedule 03.04.2013

С момента публикации этого вопроса я обратил внимание на то, что мне нужно вызвать getPurchase(...).getPurchaseState() и проверить его значение. Возможные значения: 0 (куплено), 1 (отменено) или 2 (возвращено).

Однако в моем случае он все еще перенастраивается на 0 (приобретенный), даже если элемент возвращен. Я размещаю эту информацию здесь на случай, если она кому-то поможет.

person Alinium    schedule 05.04.2013
comment
В биллинге v3, даже после того, как я вернул деньги, состояние купленного элемента по-прежнему возвращает 1 (куплено) для тестовой учетной записи. - person Monster Brain; 04.09.2019