android - inventory.getPurchase() 总是返回 null,尽管已经购买

标签 android in-app-purchase in-app-billing android-billing

我正在处理应用内购买示例。我的应用程序有 2 个按钮,第一个按钮默认禁用,单击第二个按钮将购买并启用第一个按钮。购买按钮可以正常使用,但购买后,我检查了库存,但它总是返回 null,这意味着我还没有购买。

这是源代码:

设置:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    buyButton = (Button) findViewById(R.id.buyButton);
    clickButton = (Button) findViewById(R.id.clickButton);
    clickButton.setEnabled(false);
    String base64EncodedPublicKey = "key";
    mHelper = new IabHelper(this, base64EncodedPublicKey);

    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
        public void onIabSetupFinished(IabResult result) {
            if (!result.isSuccess()) {
                Log.d(TAG, "In-app Billing setup failed: " + result);
            } else {
                Log.d(TAG, "In-app Billing is set up OK");
            }
            // Query to detect user was buy this item or not
            mHelper.queryInventoryAsync(mReceivedInventoryListener);
        }
    });

    buyButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            if (clickButton.isEnabled()) {
                mHelper.queryInventoryAsync(mReceivedInventoryListener);
            } else {
                buyClick(v);
            }
        }
    });
}

购买商品点击:

public void buyClick(View view) {
    mHelper.launchPurchaseFlow(this, ITEM_SKU, 10001,
            mPurchaseFinishedListener, "");
}

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
        if (result.isFailure()) {
            // Handle error
            return;
        } else if (purchase.getSku().equals(ITEM_SKU)) {
            // consumeItem();
            // buyButton.setEnabled(false);
            mHelper.consumeAsync(purchase, mConsumeFinishedListener);
        }

    }
};

听众:

IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
    public void onQueryInventoryFinished(IabResult result,
            Inventory inventory) {

        if (result.isFailure()) {
            Toast.makeText(getApplicationContext(),
                    "Query Inventory Error!", Toast.LENGTH_SHORT).show();
            // Handle failure
        } else {
            Toast.makeText(getApplicationContext(),
                    "Query Inventory Success!", Toast.LENGTH_SHORT).show();
            // mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU),
            // mConsumeFinishedListener);
            // if (inventory.hasPurchase(ITEM_SKU)) {
            // clickButton.setEnabled(true);
            // }
            Purchase item = inventory.getPurchase(ITEM_SKU);
            if (item != null) {
                clickButton.setEnabled(true);
            } else {
                Toast.makeText(getApplicationContext(),
                        "This item was not buy yet!", Toast.LENGTH_SHORT)
                        .show();
            }
        }
    }
};
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
    public void onConsumeFinished(Purchase purchase, IabResult result) {

        if (result.isSuccess()) {
            Toast.makeText(getApplicationContext(), "Consume done!",
                    Toast.LENGTH_SHORT).show();
            clickButton.setEnabled(true);
        } else {
            Toast.makeText(getApplicationContext(), "Consume Error!",
                    Toast.LENGTH_SHORT).show();
            // handle error
        }
    }
};

当第一次点击购买按钮时,它会显示支付对话框,支付成功后,clickButton 被启用。

但是当我第二次点击 buyButton 时,它会转到库存,但 inventory.getPurchase(ITEM_SKU) 总是返回 null。

有什么想法吗?

谢谢!

最佳答案

只需从 OnIabPurchaseFinishedListener "mHelper.consumeAsync(purchase, mConsumeFinishedListener);"中评论或删除您的代码

If you prefer Android default Trivial demo then go for the premium product purchase for the single time product purchase.

OnIabPurchaseFinishedListener()

// Callback for when a purchase is finished
    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
            Log.d(TAG, "Purchase finished: " + result + ", purchase: "
                    + purchase);
            if (result.isFailure()) {
                complain("Error purchasing: " + result);
                // setWaitScreen(false);
                return;
            }
            if (!verifyDeveloperPayload(purchase)) {
                complain("Error purchasing. Authenticity verification failed.");
                // setWaitScreen(false);
                return;
            }

            Log.d(TAG, "Purchase successful.");


                if (purchase.getSku().equals(SKU_PREMIUM)) {
                          // bought the premium upgrade! 
                          Log.d(TAG, "Purchase is premium upgrade. Congratulating user.");
                  alert("Thank you for upgrading to premium!");
                    }

        }
    };  

Explaination why it gives null data :

Keep it mind that Google will store data from their side only when you are trying to purchase one time purchase product. But Whenever you purchased consumable item google play store will not be managed it's product purchased detail and other things in the Google play console. That's why we have to call consumeAsync() method. when we purchased item, Google play store keep record item has been purchased for the one time and allow you to purchased second time.

更多信息: android: Inapp billing: Error response: 7:Item Already Owned

但是,在这里您尝试将产品作为单次购买进行购买,因此您一定不需要在 onIabPurchasedFinishListener 中调用 consumeAsync() 方法。

希望能解决您的问题。

关于android - inventory.getPurchase() 总是返回 null,尽管已经购买,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19512417/

相关文章:

iphone - SKPayments 完成交易调用两次

ios - 如何在指定时间 iOS 测试自动续订订阅是否过期

java - 仅返回 SQLite Select 语句中的最后一个值

android - 如何在android中计算LDPI,MDPI,HDPI,XXHDPI,XXXHDPI的dp

android - 验证 android inapp 购买后谷歌发送的订单 ID

android - 应用计费中未在亚马逊中调用的回调

android - 获取有效订阅应用内结算 Android

android - 应用内结算返回空签名

android - 构建 APK 时 MPAndroidChart Android Studio 错误

Android Recycler+CardView with Icon and Spinner - 排序问题