Биллинг в приложении Android - как оформить возврат

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

Я пробовал запрашивать API Google Play с помощью queryPurchaseHistoryAsyncкоторый возвращает список последних покупок, сделанных пользователем. Кажется, это не работает, так как покупки все еще существуют после запроса возврата (ждали один день, прежде чем написать это).

Вот что я сделал:

  1. Установите приложение на реальное устройство
  2. Купить контент в приложении
  3. Убедитесь, что приложение разблокирует контент
  4. Зайдите в мою историю заказов в Google Play и попросите вернуть деньги за встроенный в приложение продукт
  5. Через 10 минут транзакция была возвращена (без участия меня как разработчика)
  6. Приложение по-прежнему предоставляет платный контент
  7. Очистка данных и кеша приложений Play Store
  8. Приложение по-прежнему предоставляет платный контент

Значит, любой пользователь может купить мой продукт внутри приложения, а затем сразу перейти на его страницу в Google Play и попросить возмещение? Мне не хватает чего-то очевидного или этот API - кошмар?

В PurchaseState перечисление

  public @interface PurchaseState {
    // Purchase with unknown state.
    int UNSPECIFIED_STATE = 0;
    // Purchase is completed.
    int PURCHASED = 1;
    // Purchase is waiting for payment completion.
    int PENDING = 2;
  }

Я не вижу здесь ничего, связанного с возмещением средств. Это кажется мне вполне нормальным вариантом использования, поэтому я все еще думаю, что мне не хватает какой-то ключевой информации, как мне это сделать?

Спасибо за любую помощь

1 ответ

Проблема

Любая совершенная покупка по-прежнему будет записана, даже если пользователь вернет деньги и фактически получит возмещение. То же самое верно, когда вы (разработчик / владелец приложения) отправляете запрос на возврат / отзыв для продукта внутри приложения.

Единственная разница будет заключаться в "PurchaseState " покупки. Проблема с библиотекой биллинга Google заключается в том, что они маскируют это значение "PurchaseState" в вызове Purcha.getPurchaseState () в состояние PENDNG или PURCHASED. Смотрите в декомпилированном коде:

public int getPurchaseState() {
    switch(this.zzc.optInt("purchaseState", 1)) {
    case 4:
        return 2; // PENDING
    default:
        return 1; // PURCHASED
    }
}

Когда у вас есть продукт в приложении с состоянием возврата, его состояние скорее UNSPECIFIED_STATE, которое замаскировано как PURCHASED, как в приведенном выше коде.

Простое решение

Чтобы справиться с этим, просто проигнорируйте метод библиотеки Purchase.getPurchaseState() и вместо этого используйте свой собственный немаскированный обычай:

void getUnmaskedPurchaseState(Purchase purchase)
{
int purchaseState = 0;
try {
    purchaseState = new JSONObject(purchase.getOriginalJson()).optInt("purchaseState", 0);                                        
} catch (JSONException e)
{
e.printStackTrace();
}
                                
return purchaseState;
}

Сложное решение

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

Покупку можно аннулировать следующими способами:

  • Пользователь запрашивает возврат средств за свой заказ. Пользователь отменяет свой заказ.
  • Заказ возвращается.
  • Разработчик отменяет заказ или возвращает ему деньги. Примечание. В API аннулированных покупок будут отображаться только отозванные заказы.
  • Если разработчик возмещает деньги без установки параметра отзыва, заказы не будут отображаться в API.
  • Google отменяет или возвращает заказ.

Однако это решение в настоящее время недоступно в виде библиотеки Java для Android, и вместо этого вам придется выполнять запросы к серверу и использовать API разработчика Google Play.

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