アプリ内課金(Android)のトランザクションを復元するにはどうすればよいですか?

I tried to search about that problem, but didnt get many information. I just know that:
- Restore in the first time user install app or when user reinstall when they uninstall/wipe data.
- Restore transaction just apply for managed-product.
I tried to read Dungeon Example, there are few line of code about restore transaction like: when to call restore request, when to get restore respone... but i dont know:
- How to get return information? (like item id that you have bought)

Someone please explain once again about Process of Restore Transaction in In-App billing.

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

編集:申し訳ありませんが、私はAndroidで長年働いていませんでしたが、今は私はこの質問の正解が分かりません。

3
非常に良い質問!どのように動作するのか理解しましたか?ダンジョンズの例では、多くのメソッドとデリゲートメソッドがどこにあっても...どのように動作するのかを理解するのにはいくつかの困難があります...
追加された 著者 Regis_AG,
私もこの問題を抱えています。私のユーザーはアイテムの後にアイテムを拭き取り、BillingController.restoreTransactions(this)を呼び出した後でもアイテムを復元できません。
追加された 著者 Beno,

4 答え

典型的なフローは次のとおりです。

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

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

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

  4. Googleはあなたの RESTORE_TRANSACTIONリクエスト。 (これは謝辞のみです     彼らはあなたのリクエストを受け取りました)。

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

  6. 同じ呼び出しであるため、アプリはイベントをピックアップして、ユーザーがアプリ内アイテムを購入した(つまり、購入した機能を元に戻す)ように通常通り処理します。

手順2と5に関しては、私のアプリケーションで行ったことはSharedPreferenceの値を 'APP_INITIALISED'とし、デフォルトはfalseにしておきます。私のアプリが起動するたびに、 'APP_INITIALISED'が偽であれば、GoogleにRESTORE_TRANSACTION(ステップ2)を指示してから、APP_INITIALISEDをtrueに設定します(ステップ5)。

6
追加された
いい答えだ。私はそれが答えとしてマークされるべきだと思います。
追加された 著者 Aranda,

私は確信していませんが、私は、restoreTransactions()呼び出し後に購入アイテムのIDでonPurchaseStateChangeを呼び出すと思う。

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());
0
追加された

私は @Frank Leigh の回答で、すべての購入が1つの PURCHASE_STATE_CHANGED

code>、次のような署名付きデータ

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
追加された