Выставление счетов в приложении Android, как справиться с переустановкой приложения

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

@Override
public void onCreate(Bundle savedInstanceState)
{
    mContext = this;
    startService(new Intent(mContext, BillingService.class));
    BillingHelper.setCompletedHandler(mTransactionHandler);
}

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

public Handler mTransactionHandler = new Handler()
{
    public void handleMessage(android.os.Message msg)
    {
        Log.i(TAG, "Transaction complete");
        Log.i(TAG, "Transaction status: "
            + BillingHelper.latestPurchase.purchaseState);
        Log.i(TAG, "Item purchased is: "
            + BillingHelper.latestPurchase.productId);

        if (BillingHelper.latestPurchase.isPurchased())
        {
            new Message("Thank you!", getApplicationContext());
            PAY_VERSION = true;
            SharedPreferences purchasePreferences = getSharedPreferences(PURCHASE_PREFERENCES, Activity.MODE_PRIVATE);
            Editor purchaseEditor = purchasePreferences.edit();
            purchaseEditor.putBoolean("purchased", PAY_VERSION);
            purchaseEditor.commit();
            Intent intent = getIntent();
            finish();
            startActivity(intent);
        }
    };

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

РЕДАКТИРОВАТЬ:

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

РЕДАКТИРОВАТЬ 2:

Мне что, звонить сюда, чтобы проверить?

BillingHelper.restoreTransactionInformation(BillingSecurity.generateNonce());
BillingHelper.getPurchaseInformation(new String[] {"myItem"});

Ранее этот код давал сбой на телефоне моей сестры (SGS3, ICS), но не на моем (работают GN, ICS и JB). Я вызывал его в onCreate() моей первой активности. Не совсем уверен, что делать с getPurchaseInformation(...) после того, как его вызвали. У него нет возвращаемого значения, поэтому я не уверен, смогу ли я разобрать JSON или что-то еще, что я должен делать...

Кроме того, эти 2 строки дают мне следующее:

08-27 11:54:04.271: E/BillingService(17702): BillingHelper not fully instantiated
08-27 11:54:04.271: E/BillingService(17702): BillingHelper not fully instantiated

person user1146523    schedule 27.08.2012    source источник


Ответы (2)


JSON

Пример объекта заказа JSON, который включает токен покупки подписки, показан ниже.

{ "nonce" : 1836535032137741465,

  "orders" :
    [{ "notificationId" : "android.test.purchased",
       "orderId" : "transactionId.android.test.purchased",
       "packageName" : "com.example.dungeons",
       "productId" : "android.test.purchased",
       "developerPayload" : "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ",
       "purchaseTime" : 1290114783411,
       "purchaseState" : 0,
       "purchaseToken" : "rojeslcdyyiapnqcynkjyyjh" }]
}

Как разобрать JSON в Java.

Android поддерживает JSON библиотеку

Биллинг Android

Если у вас есть удаленный сервер, мы рекомендуем хранить информацию о покупках на вашем сервере, а не в локальной базе данных на устройстве. Посмотрите здесь.

Прочтите об управляемом аккаунте пользователя, неуправляемом или подписке< /а>

Я использую биллинг следующим образом:

  1. В onCreate

     BillingHelper.setCompletedHandler(handlerTransaction);
    

    У вас есть обработчик в вашем коде.

  2. Далее в onClick или что-то в этом роде

     BillingHelper.requestPurchase(this, currentMarketProduct.getMarketId());
    
person Dawid Drozd    schedule 28.08.2012
comment
Спасибо за информацию! Очень полезно, однако я до сих пор не знаю, как запросить магазин игр, если мое приложение переустановлено, чтобы проверить, был ли куплен предмет. Моя часть покупки работает нормально, как я сказал выше. Мне сказали, что мне нужно запросить JSON, чтобы проверить в игровом магазине, какие предметы были приобретены через выставление счетов в приложении. - person user1146523; 29.08.2012

Вы на правильном пути со вторым обновлением. Хитрость заключается в том, чтобы понять, что все делается асинхронно.

Типичный поток выглядит следующим образом:

  1. Пользователь устанавливает ваше приложение.

  2. При первой загрузке приложения вы проверяете, нужно ли восстановить покупки.

  3. Если вы это сделаете, отправьте синхронный запрос RESTORE_TRANSACTION в Google.

  4. Google ответит подтверждением на ваш запрос RESTORE_TRANSACTION. (Это лишь подтверждение того, что они получили ваш запрос.)

  5. На этом этапе вы должны отметить, что вы уже отправили запрос на восстановление в Google, и вам больше не нужно отправлять восстановление из приложения.

  6. Теперь асинхронно Google начнет отправлять в ваше приложение событие PURCHASE_STATE_CHANGED для каждой покупки в приложении, которую пользователь совершил ранее. Этот вызов такой же, как тот, который отправил бы Google, если бы пользователь совершил эту покупку в первый раз.

  7. Поскольку это один и тот же вызов, ваше приложение подхватит событие и обработает его в обычном режиме, как если бы пользователь только что приобрел продукт в приложении (тем самым «восстановив» приобретенную функцию).

Что касается шагов 2 и 5, то, что я сделал для своего приложения, это сохранить значение SharedPreference с именем «APP_INITIALISED», которое по умолчанию равно false. Каждый раз, когда мое приложение запускается, если «APP_INITIALISED» имеет значение false, я говорю Google RESTORE_TRANSACTION (шаг 2), а затем устанавливаю для APP_INITIALISED значение true (шаг 5).

person Frank Leigh    schedule 29.08.2012