Android:InAppBilling

Android:InAppBilling,android,sharedpreferences,in-app-billing,Android,Sharedpreferences,In App Billing,我正在开发一个具有IAB的应用程序,当通过OnConsumeFinishedListener完成购买时,它将通过SharePreference保存用户已为附加功能付费的信息(该功能不会耗尽) 用户可以再次购买相同的产品 代码: 问题: 我看到用户可以取消他们的购买。这样,通过Sharepreference保存用户为附加功能付费的信息将有漏洞吗?用户可以先购买,使sharepreference变为true,然后取消采购订单 这样,如何才能改进流程?检查库存似乎是不可能的,因为附加功能在IAB流程中

我正在开发一个具有IAB的应用程序,当通过OnConsumeFinishedListener完成购买时,它将通过SharePreference保存用户已为附加功能付费的信息(该功能不会耗尽)

用户可以再次购买相同的产品

代码: 问题: 我看到用户可以取消他们的购买。这样,通过Sharepreference保存用户为附加功能付费的信息将有漏洞吗?用户可以先购买,使sharepreference变为
true
,然后取消采购订单


这样,如何才能改进流程?检查库存似乎是不可能的,因为附加功能在IAB流程中已被消耗。

您有一个可以多次购买的非消耗性项目,这似乎有点奇怪。一般来说,可以多次购买的物品是可消费品


要回答您的问题,IAB购买不能像应用程序购买一样取消,15分钟退款窗口将被删除,并且购买不可退款,除非他们与您联系,并且您决定手动退款

非常感谢您的及时回复!“购买”实际上是一种捐赠+附加功能,用户可以根据自己的意愿多次捐赠,如果他已经捐赠,共享参考将成为现实。在您的回复中,这意味着IAB不同于付费应用程序,IAB中的订单不能取消,因此在这方面,以这种方式保存标志没有漏洞?我很好奇,并一直在想,是否会有任何情况下,用户尚未支付的旗帜成为现实。你有什么建议吗?除非你的代码中有一个bug,否则用户不能在没有实际购买的情况下模拟购买。一旦购买,它是永久性的,除非您选择退款,否则无法退款。希望有帮助。
    // Called when consumption is complete
    IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() 
    {
        public void onConsumeFinished(Purchase purchase, IabResult result) 
        {
            Log.d(TAG, "Consumption finished. Purchase: " + purchase + ", result: " + result);
            if (mHelper == null) return;
            if (result.isSuccess()) 
            {
                Toast.makeText(InAppBillingActivity.this, "Thank you!!", Toast.LENGTH_SHORT).show();    
                if ((purchase.getSku().equals(ITEM_SKU10))) {countQ(10);}

        buy10Button.setEnabled(true);

            } 
            else 
            {
                // handle error
            }
            Log.d(TAG, "End consumption flow.");
        }
    };

    public void countQ(int Q) 
    {
        SharedPreferences settings = this.getSharedPreferences("MyApp",0);
        if (Q==10) 
        {

            SharedPreferences settings1 = this.getSharedPreferences("MyApp",0);
            SharedPreferences.Editor e1 = settings1.edit();
            e1.putBoolean("userpaid", true);
            e1.commit();                        
        }