Как работает транзакция восстановления в In-App Billing (Android)? - PullRequest
3 голосов
/ 28 октября 2011

Я пытался найти эту проблему, но не получил много информации. Я просто знаю, что:
- Восстановление при первой установке приложения пользователем или при переустановке пользователя при удалении / удалении данных.
- Восстановить транзакцию только для управляемого продукта.
Я пытался прочитать пример Dungeon, есть несколько строк кода о транзакции восстановления, например: когда вызывать запрос на восстановление, когда получить ответ восстановления ... но я не знаю:
- Как получить информацию о возврате? (например, идентификатор товара, который вы купили)

Кто-то, пожалуйста, объясните еще раз о процессе восстановления транзакции в биллинге внутри приложения.

Спасибо большое !!!

Отредактировано: извините, я долгое время не работал в Android, и сейчас я не знаю, какой правильный ответ на этот вопрос, поэтому я не могу пометить ответ: P

Ответы [ 4 ]

6 голосов
/ 30 августа 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).

0 голосов
/ 28 марта 2013

Я бы засвидетельствовал ответ @ Фрэнка Ли с правкой, что все покупки совершаются за один PURCHASE_STATE_CHANGED, с подписанными данными следующим образом

signedData:{

    "nonce":1234*,
    "orders":[
         {
         "orderId":"1234*.1234*",
         "packageName":"com.*",
         "productId":"**p1**",
         "purchaseTime":time,
         "purchaseState":0,
         "purchaseToken":"*"
        },
        {
         "orderId":"1234*.1234*",
         "packageName":"com.*",
         "productId":"**p2**",
         "purchaseTime":time,
         "purchaseState":0,
         "purchaseToken":"*"
        },
        {
         "orderId":"1234*.1234*",
         "packageName":"com.*",
         "productId":"**p3**",
         "purchaseTime":time,
         "purchaseState":0,
         "purchaseToken":"*"
        }
    ]
}
0 голосов
/ 06 декабря 2012

Я использовал этот метод:

public static void restoreTransactionInformation(Long nonce){
    if (amIDead()) 
    {
        return;
    }
    Log.i(TAG, "confirmTransaction()");
    Bundle request = makeRequestBundle("RESTORE_TRANSACTIONS");
    // The REQUEST_NONCE key contains a cryptographically secure nonce (number used once) that you must generate
    request.putLong("NONCE", nonce);
    try 
    {
        Bundle response = mService.sendBillingRequest(request);

        //The REQUEST_ID key provides you with a unique request identifier for the request
        Long requestIndentifier     = (Long) response.get("REQUEST_ID");
        Log.i(TAG, "current request is:" + requestIndentifier);

        //The RESPONSE_CODE key provides you with the status of the request
        Integer responseCodeIndex   = (Integer) response.get("RESPONSE_CODE");
        C.ResponseCode responseCode = C.ResponseCode.valueOf(responseCodeIndex);
        Log.i(TAG, "RESTORE_TRANSACTIONS Sync Response code: "+responseCode.toString());
    } 
    catch (RemoteException e) 
    {
        Log.e(TAG, "Failed, internet error maybe", e);
        Log.e(TAG, "Billing supported: " + isBillingSupported());
    }
}

Позвоните, используя

BillingHelper.restoreTransactionInformation(BillingSecurity.generateNonce());
0 голосов
/ 24 февраля 2012

Я не уверен, но думаю, после вызова restoreTransactions () будет вызываться onPurchaseStateChange с идентификаторами приобретенных предметов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...