如何在Android中实施恢复购买

gst*_*m79 4 android in-app-billing

感谢您访问我的网页。

几天前,我开发了带有应用程序结算功能的简单android游戏。

现在,我要实现恢复购买功能,但是我不知道该如何点它。

我花了几天的时间进行谷歌搜索,并找到了许多链接来提供帮助,但现在它们对我没有用。

请让我知道如何以编程方式进行操作。

我在哪里可以找到恢复购买的样本?

我已经在应用购买中实现了,但尚未恢复购买。

我使用的是Android Studio 1.5.1。

我已参考http://www.techotopia.com/index.php/An_Android_Studio_Google_Play_In-app_Billing_Tutorial 在应用购买中实施。

请帮我 :(

提前致谢。

Nit*_*ith 5

如果使用v3实施InApp Purchase,则无需担心恢复Purchase实施。您可以查询库存并捕获现有的购买信息。请检查执行情况。

我在这里所做的是我已经有一个购买模块。完成购买后,我会将信息发送到我们的服务器。重新登录或返回到应用程序后,服务器将发送当前用户的购买信息(无论是否已购买)。如果服务器给出的结果是否定的,我将检查查询库存,那里是否有任何现有的购买。为此,我在MainActivity onCreate()中使用以下代码。

 mHelper = new IabHelper(this, base64EncodedPublicKey);
        mHelper.enableDebugLogging(true);
        Log.d(TAG, "Starting setup.");
        mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
            public void onIabSetupFinished(IabResult result) {
                Log.d(TAG, "Setup finished.");
                if (!result.isSuccess()) {
                    Log.e(TAG, "In App Set UP error:: Please check gmail account settings/ Credit Card Info etc");
                    return;
                }
                if (mHelper == null) return;
                mBroadcastReceiver = new IabBroadcastReceiver(MainActivity.this);
                IntentFilter broadcastFilter = new IntentFilter(IabBroadcastReceiver.ACTION);

                registerReceiver(mBroadcastReceiver, broadcastFilter);

                Log.d(TAG, "Setup successful. Querying inventory.");
                if (mSupplier.getmSubscriptionStatus() == 0) { // This is the Status given from Local Server 0- UnScubscribed User, 1- Subscribed User
                    mHelper.queryInventoryAsync(mGotInventoryListenerForPurchase);
                }
            }
        });
Run Code Online (Sandbox Code Playgroud)

在结果中,您可以识别现有的购买信息。

IabHelper.QueryInventoryFinishedListener mGotInventoryListenerForPurchase = new IabHelper.QueryInventoryFinishedListener() {
            public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
                try {
                    Log.d(TAG, "Query inventory For Purchase finished.");
                    String payload = // Your developer payload
                    if (mHelper == null) return;
                    if (result.isFailure()) {
                        Log.v(TAG, "PURCHSE RESULT ERROR- NO PURCHASE AVAILABLE");
                        return;
                    }
                    Log.v(TAG, "Query inventory For Purchase was successful.");
                    if (mSkuDetailList == null || mSkuDetailList.isEmpty()) {
                        Log.v(TAG, "SKU INFO FROM LOCAL SERVER- UNABLE TO PURCHASE");
                        return;
                    }
                    Purchase premiumPurchase = null;
                    for (IabSkuDetailModel data : mSkuDetailList) {

                        // Filter the purchase info using SKU:::
                        premiumPurchase = inventory.getPurchase(data.getmPackageName());
                        if (premiumPurchase != null) {
                            break;
                        }
                    }
                    if (premiumPurchase == null) {
                        Log.v(TAG, "NO Available Purchase for this user");
                        return;
                    }
                    if (verifyDeveloperPayload(premiumPurchase)) {
                        Log.v(TAG, "Purchase is there already ::: developer payload is Matching:: This need to update Local Server: No need to purchase agian");
                        if (premiumPurchase.getSku().equalsIgnoreCase(mSelectedSku)) {
                            IabPurchaseUpdateReq request = new IabPurchaseUpdateReq();
                            request.setmPurchaseToken(premiumPurchase.getToken());
                            request.setmUserId("" + mSupplier.getmUserId());
                            request.setmPublicKey(IabConstants.IAB_RSA_PUBLIC_KEY);
                            request.setmSignature(premiumPurchase.getSignature());
                            request.setmSubscriptionId(premiumPurchase.getSku());
                            request.setmPurchaseObj(premiumPurchase.getOriginalJson());

                            //Update "result to local Server"
                        } else {
                            Log.v(TAG, "SKU mismatch ::: ");
                        }
                    } else {
                         Log.v(TAG, "Developer payload error:: Wrong Purchase");
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
Run Code Online (Sandbox Code Playgroud)