【问题标题】:How can I implement restore purchase in android如何在android中实现恢复购买
【发布时间】:2016-05-18 05:55:45
【问题描述】:

感谢您访问我的页面。

几天前,我开发了一个简单的安卓游戏,里面有应用内计费。

现在我要实现恢复购买功能,但是不知道怎么点。

我已经进行了几天的谷歌搜索,并找到了许多帮助它的链接,但它们现在对我不起作用。

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

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

我已经在应用内购买了,但没有恢复购买。

我使用的是 Android Studio 1.5.1。

我已推荐http://www.techotopia.com/index.php/An_Android_Studio_Google_Play_In-app_Billing_Tutorial 实施应用内购买。

请帮帮我:(

提前致谢。

【问题讨论】:

    标签: android in-app-billing


    【解决方案1】:

    如果您使用 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);
                    }
                }
            });
    

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

    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();
                    }
                }
            };
    

    【讨论】:

    • 感谢 Nithinjith 的回答。这对我有用。再次感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多