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

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

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

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

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

GPA.1234-5678-9123-1234

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

+1234567891234,1234567891234

Обычно я думаю, что это не 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? В любом случае, чтобы предотвратить это?

Ответ 1

 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);        
  }

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

Ответ 2

Purchase premiumPurchase = inventory.getPurchase(SKU);

boolean mIsPremium = (premiumPurchase != null 
           && verifyDeveloperPayload(premiumPurchase));

if(mIsPremium){
    ...
}

Ответ 3

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