2016-04-27 127 views
10

我正在使用Google的应用内结算功能进行我的Android应用。Android应用内结算,缺失购买

我使用了Google的IabHelper类,因为他们的账单看起来非常复杂。

我的问题是我想知道购买是否成功。我认为我正确地遵循了这个流程,但在我的日志中,我看到很多用户都升级了,但我的Google Play付款帐户从未显示其购买。 (即他们免费升级)。

我登录的GP订单ID,有时它的一些类似,

GPA.1234-5678-9123-1234

但有时它像,

1234567891234.1234567891234

通常我认为它的非GPA订单没有收取费用。

另外我认为你可以通过订单,然后取消它,并仍然得到升级?

您如何确保用户真正付费?

代码:

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { 
    public void onIabPurchaseFinished(IabResult result, final Purchase purchase) { 
     if (result.isFailure()) { 
      showMessage("Google Billing Purchase Error");     
      return; 
     } else if (purchase.getSku().equals(sku)) { 
      IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener = new IabHelper.QueryInventoryFinishedListener() { 
       public void onQueryInventoryFinished(IabResult result, Inventory inventory) { 
        if (result.isFailure()) { 
         showMessage("Google Billing Error"); 
         return; 
        } else { 
         if (inventory.hasPurchase(sku)) { 
          showMessage("Thank you for upgrading"); 
          grantUpgrade(); 
          // ** This line gets call, but no payment occurs. 
         } 
        } 
       } 
      }; 
      mHelper.queryInventoryAsync(mReceivedInventoryListener); 
     } 
    } 
}; 
mHelper.launchPurchaseFlow(this, sku, 10001, mPurchaseFinishedListener, ""); 

***更新检查 “inventory.hasPurchase(SKU)”,但仍然可以看到谁得到了升级,但不支付的用户。

**也许用户正在使用Freedom hack?无论如何,以防止这一点?

+0

您想查看订单历史吗? – KishuDroid

+0

如果你要发出特定的黑客攻击,你可能需要提供一个描述它的链接,而不是假设每个人都知道它是什么:) – JoxTraex

+0

查看https://github.com/soomla/android-store/issues/47或谷歌“Google Play应用内黑客”或“自由黑客” – James

回答

3
if (result.isFailure()) { 
    //If the user aborts or any other problems it will jump here 
    } 
    else { 
    //The user purchased some item, check out which it is 
    mIsPremium = inventory.hasPurchase(SKU_ANY_ITEM);   
    } 

因此,关于您的问题,此代码已经验证用户是否真的购买了该物品!

+0

除了没有。对于从未在Google付款中显示的购买行为执行“谢谢”行。 – James

+0

您的意思是您必须检查onQueryInventoryFinished中的“hasPurchase”,即isFailure可能是false,但仍然没有购买? – James

+0

如果是这样,如果他们购买了物品,或者是否有时间滞后,“购买”是否总是成立? – James

1

Google Play商店会跟踪您的购买情况,因此您不应该认为只是因为购买成功,该商品才会继续购买。用户可以为购买获得退款。出于这个原因,您需要在每次启动时查询用户的库存,并适当调整您的赠款。无论如何,您需要进行此项检查,以支持希望在切换到新设备或卸载/重新安装应用程序时获得授权的用户。

+0

对于即时购买检查他们是否仍然有购买在未来没有帮助,他们已经得到了该项目。如果你不能相信它,很难使用应用内购买。 – James

+0

您可以消费托管购买,这样一旦消费就不能退款。不知道它是否支持你的用例,但它可能有帮助。 – Jschools

2
Purchase premiumPurchase = inventory.getPurchase(SKU); 

boolean mIsPremium = (premiumPurchase != null 
      && verifyDeveloperPayload(premiumPurchase)); 

if(mIsPremium){ 
    ... 
}