Android In-App Billing, отсутствие покупок

Я использую Google In-App Billing для моего приложения для Android.

Я использовал класс IabHelper от Google, как, поскольку их выставление счетов кажется чрезвычайно сложным.

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

Я регистрирую идентификаторы клиентов GP, иногда их число похожее,

GPA.1234-5678-9123-1234

Но иногда это похоже,

+1234567891234,1234567891234

Обычно я думаю, что его заказы non GPA не взимаются.

Также я думаю, что вы можете отправить заказ, а затем отменить его и все-таки получить обновление?

Как вы гарантируете, что пользователь действительно заплатил?

Код:

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { public void onIabPurchaseFinished(IabResult result, final Purchase purchase) { if (result.isFailure()) { showMessage("Google Billing Purchase Error"); return; } else if (purchase.getSku().equals(sku)) { IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener = new IabHelper.QueryInventoryFinishedListener() { public void onQueryInventoryFinished(IabResult result, Inventory inventory) { if (result.isFailure()) { showMessage("Google Billing Error"); return; } else { if (inventory.hasPurchase(sku)) { showMessage("Thank you for upgrading"); grantUpgrade(); // ** This line gets call, but no payment occurs. } } } }; mHelper.queryInventoryAsync(mReceivedInventoryListener); } } }; mHelper.launchPurchaseFlow(this, sku, 10001, mPurchaseFinishedListener, ""); 

*** обновлен, чтобы проверить «inventory.hasPurchase (sku)», но все равно вижу пользователей, которые получают обновление, но не платят.

** Возможно, пользователи используют взлом Freedom? В любом случае, чтобы предотвратить это?

  if (result.isFailure()) { //If the user aborts or any other problems it will jump here } else { //The user purchased some item, check out which it is mIsPremium = inventory.hasPurchase(SKU_ANY_ITEM); } 

Поэтому в отношении вашего вопроса этот код уже проверяет, действительно ли пользователь приобрел этот товар!

Покупка premiumPurchase = inventory.getPurchase (SKU);

Boolean mIsPremium = (premiumPurchase! = Null && verifyDeveloperPayload (premiumPurchase));

если (mIsPremium) {

}

Магазин Google Play отслеживает покупки для вас, поэтому вы не должны предполагать, что только потому, что покупка прошла успешно, товар останется покупкой. Пользователь может получить возмещение за покупку. По этой причине вам нужно запрашивать инвентарь пользователя при каждом запуске и соответствующим образом корректировать свои гранты. Вам нужно будет сделать эту проверку в любом случае, чтобы поддерживать пользователей, которые ожидают получить грант, когда они переключаются на новое устройство или удаляют / переустанавливают приложение.