54

現在、InApp 課金メカニズムをテストしています (InApp Billing バージョン 3 API を使用しているため、TrivialDrive の例を参考にしてください)。

管理対象アイテムが 1 つありますが、これはプレミアム バージョンにアップグレードされています。

現在、テスト アカウントでアイテムを購入することはできますが、後で Google チェックアウトで注文全体をキャンセルすると、コードはアイテムが購入されたことを示しているため、プレミアム機能が付与されます。

MainActivity で購入を確認する方法は次のとおりです。請求 API v3 を使用すると、必要に応じてアドホックに購入を照会できることがわかったので、購入状態をローカルのどこかに保存しません。

@Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();

        iabHelper = new IabHelper(this, Helper.getPKey());
        iabHelper.enableDebugLogging(true);

        iabHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {

            @Override
            public void onIabSetupFinished(IabResult result) {
                Log.d("IAB", "SETUP FINISHED");

                if(!result.isSuccess())
                {
                    Log.d("IAB", "SETUP NOT OK");
                    return;
                }
                else
                    Log.d("IAB", "SETUP OK");

                iabHelper.queryInventoryAsync(
                    new QueryInventoryFinishedListener() {

                        @Override
                        public void onQueryInventoryFinished(IabResult result, Inventory inv) {
                            Log.d("IAB", "Query inventory finished.");
                            if (result.isFailure()) {
                                Log.d("IAB","Failed to query inventory: " + result);
                                return;
                            }

                            Log.d("IAB", "Query inventory was successful.");

                            // Do we have the premium upgrade?
                            boolean mIsPremium = inv.hasPurchase(Helper.premiumSku);
                            Purchase p = inv.getPurchase(Helper.premiumSku);
                            if(p != null)
                                Log.d("IAB PURCHASE STATE", IabHelper.getResponseDesc(p.getPurchaseState()));
                            else
                                Log.d("IAB PURCHASE STATE", "Purchase is null");

                            Log.d("IAB", "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM"));


                        }
                    }                       

                );              
            }
        });       
    }

注文をキャンセルしてから 1 時間経っても、getPurchaseState = 0 を取得し続けます。これは、購入済みであることを意味します。なんで?

4

9 に答える 9

8

これは1年前のものであることは知っていますが、提示された回答/ヒントはどれも役に立たなかったので、ソリューションを追加すると思いました.

まず、私は同じ問題を経験していました。つまり、テスト購入を行い、それをキャンセルし、有効な購入を示す購入状態を受け取った。

私が忘れていたのは、最近、Google Play デベロッパー コンソールの設定ペインにある [ライセンス テストの応答] フィールドを [RESPOND_NORMALLY] から [LICENSED] に切り替えたことです。

「RESPOND_NORMALLY」に戻した後、キャンセルされた購入の購入状態がそのまま正しく返されました。

そのため、何日も待つ前に確認することをお勧めします

于 2014-01-10T20:19:27.927 に答える
7

ステップ 1. 約 10 分間待ちます。「キャンセルされた注文」が配信されるまで。あなたのGoogleウォレットに。

Sep 15 11:28 AM キャンセルされました 注文は配達されました。

Sep 15 11:18 AM キャンセル この注文はキャンセルされました。理由:お客様からのキャンセル依頼。

ステップ 2. デバイスでテスト Google アカウントをログアウトしてから、再ログインします。

少なくともそれで私の問題は解決しました。

于 2013-09-15T20:04:56.457 に答える
1

trivialdrivesample の参照コードが正しく表示されていれば、アプリ内課金の公式参照プロジェクトにとって残念なことです。

purchase == null の場合は、購入されていないことを意味します。あなたが電話しなければならない本当の情報を得るために

purchase.getPurchaseState()

ここによると

purchaseState 注文の購入状態。可能な値は、0 (購入済み)、1 (キャンセル済み)、2 (返金済み)、または 3 (期限切れ、サブスクリプション購入のみ) です。

于 2013-07-28T10:25:00.257 に答える
1

Googleの公式ドキュメントですでに十分に回答されています。ここに単語をコピーします。

ユーザーがサブスクリプションをキャンセルした場合、Google Play は現在の請求サイクルの払い戻しを行いません。代わりに、ユーザーは、現在の請求サイクルが終了するまでキャンセルされたサブスクリプションにアクセスでき、その時点でサブスクリプションが終了します。たとえば、ユーザーが月単位のサブスクリプションを購入し、サイクルの 15 日目にキャンセルした場合、Google Play はサブスクリプションが 30 日目 (または月によっては他の日) の終わりまで有効であると見なします。

それはそれをすべて説明するはずです。getPurchase()現在のサブスクリプション サイクルが終了するまで、購入データは引き続き返されます。

于 2014-01-10T21:51:22.160 に答える
0

ドキュメント(IAB API v2)で次のセクションを見つけましたが、これが IAB API v3 に使用できるかどうかはわかりません。ただし、ブロードキャストは引き続き送信される可能性があります。

「... Google Play が Google ウォレットから払い戻し通知を受信すると、アプリケーションは IN_APP_NOTIFY ブロードキャスト インテントを受信できます。この場合、Google Play は IN_APP_NOTIFY メッセージをアプリケーションに送信します。アプリケーションは、アプリケーションが開始する REQUEST_PURCHASE メッセージで、最終的にアプリケーションが、返金されたアイテムに関する情報を含む PURCHASE_STATE_CHANGED メッセージを受け取るようにする. 返金情報は、PURCHASE_STATE_CHANGED ブロードキャスト インテントに付随する JSON 文字列に含まれる. また、JSON の purchaseState フィールド文字列は 2 に設定されています。」

から: http://developer.android.com/google/play/billing/v2/api.html#billing-action-notify

于 2014-09-04T08:45:38.827 に答える