Биллинг в приложении Android - как оформить возврат
Я пытаюсь реализовать в своем приложении биллинг внутри приложения, все работает отлично, за исключением случаев возврата денег. Я бился головой об этом в течение последних нескольких дней, и кажется невероятным, что на стороне приложения нет способа узнать, запросил ли пользователь возврат. Я хотел бы иметь возможность отозвать доступ к одноразовому управляемому продукту (удалить рекламу) после того, как пользователю был возвращен платеж. Я не использую серверную часть, поэтому полагаюсь на API Google Play.
Я пробовал запрашивать API Google Play с помощью queryPurchaseHistoryAsync
который возвращает список последних покупок, сделанных пользователем. Кажется, это не работает, так как покупки все еще существуют после запроса возврата (ждали один день, прежде чем написать это).
Вот что я сделал:
- Установите приложение на реальное устройство
- Купить контент в приложении
- Убедитесь, что приложение разблокирует контент
- Зайдите в мою историю заказов в Google Play и попросите вернуть деньги за встроенный в приложение продукт
- Через 10 минут транзакция была возвращена (без участия меня как разработчика)
- Приложение по-прежнему предоставляет платный контент
- Очистка данных и кеша приложений Play Store
- Приложение по-прежнему предоставляет платный контент
Значит, любой пользователь может купить мой продукт внутри приложения, а затем сразу перейти на его страницу в 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.