4

その問題について検索しようとしましたが、多くの情報が得られませんでした。私はそれを知っています:
- ユーザーがアプリを初めてインストールするとき、またはユーザーがデータをアンインストール/消去するときに再インストールするときに復元します。
・管理対象商品の申請だけで復元取引が可能です。
ダンジョンの例を読み込もうとしましたが、次のような復元トランザクションに関するコード行はほとんどありません: いつ復元要求を呼び出すか、いつ復元応答を取得するか... しかし、私は知りません:
- 戻り情報を取得する方法? (購入したアイテム ID など)

アプリ内課金の復元トランザクションのプロセスについてもう一度説明してください。

本当にありがとうございます!!!

編集済み:申し訳ありませんが、私は長い間Androidで作業していませんでした。現在、この質問の正しい答えがわからないため、答えをマークできません:P

4

4 に答える 4

7

一般的な流れは次のとおりです。

  1. ユーザーがアプリをインストールします。

  2. アプリの初回読み込み時に、購入を復元する必要があるかどうかを確認します。

  3. その場合は、RESTORE_TRANSACTION 同期リクエストを Google に送信します。

  4. Google は、RESTORE_TRANSACTION リクエストに対して確認応答を返します。(これは、彼らがあなたの要求を受け取ったことを確認するだけです。)

  5. この時点で、すでに Google に復元リクエストを送信済みであり、アプリから復元を送信する必要がないことをマークする必要があります。

  6. これで、ユーザーが以前に購入したアプリ内購入ごとに、非同期でGoogle が「PURCHASE_STATE_CHANGED」イベントをアプリに送信し始めます。この呼び出しは、ユーザーが初めて購入した場合に Google が送信するものと同じです。

  7. 同じ呼び出しであるため、アプリはイベントを取得し、ユーザーがアプリ内製品を購入したかのように通常どおり処理します (これにより、購入した機能が「復元」されます)。

手順 2 と 5 に関して、アプリに対して行ったことは、既定で false に設定されている 'APP_INITIALISED' という名前の SharedPreference 値を保持することです。アプリが起動するたびに、'APP_INITIALISED' が false の場合、Google に RESTORE_TRANSACTION を指示し (ステップ 2)、APP_INITIALISED を true に設定します (ステップ 5)。

于 2012-08-29T23:34:19.320 に答える
0

私はこの方法を使用しました:

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());
于 2012-12-06T08:33:13.343 に答える
0

よくわかりませんが、restoreTransactions()の呼び出し後、購入したアイテムのIDでonPurchaseStateChangeが呼び出されると思います。

于 2012-02-24T15:34:24.943 に答える
0

@Frank Leighの回答を、すべての購入が 1 つであるという編集で証明します。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":"*"
        }
    ]
}
于 2013-03-27T22:25:22.007 に答える