安卓应用内购买,遗失的购买

10

我正在使用谷歌的In-App Billing来为我的Android应用程序收费。

我使用了谷歌的"In-App Billing"文档中提供的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黑客软件?有什么方法可以防止这种情况发生吗?


您想简要查看您的订单历史记录吗? - KishuDroid
如果你要点名某个黑客技巧,你可能需要提供一个链接来描述它以及确切的内容,而不是假设每个人都知道它是什么 :) - JoxTraex
请参阅 https://github.com/soomla/android-store/issues/47 或谷歌搜索“Google Play应用内购买黑客”或“Freedom黑客”。 - James
嗯,我觉得这里有一些解决方案,https://dev59.com/smEh5IYBdhLWcg3w1mbs,我会尝试这些并看看它们是否有效。 - James
仍然没有在Google Play上阻止欺诈行为的好运,我已经尝试了一切,但每天仍然会有欺诈性购买。 - James
3个回答

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

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


你的意思是在onQueryInventoryFinished中必须检查“hasPurchase”,即使isFailure为false,仍然没有购买吗? - James
很奇怪,因为你甚至会双重检查付款是否已完成,所以你使用的代码没有问题。你知道吗,你收到的升级报告来自不同的用户?也许grantUpgrade()方法只是针对一个用户被多次调用了? - Chris Sherlock
你知道账号数字的含义吗?GPA。1234和1234.5678的区别。 - James
@James:请查看以下链接以了解这些数字的含义:https://dev59.com/xVwZ5IYBdhLWcg3wVO1U - KishuDroid
嗯,也许得到免费购买的用户正在使用自由黑客,有什么方法可以防止这种情况发生? - James
显示剩余6条评论

2
Purchase premiumPurchase = inventory.getPurchase(SKU);

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

if(mIsPremium){
    ...
}

1
谷歌Play商店会为您跟踪购买记录,因此您不应该认为只是因为购买成功了,该商品就会一直保留。用户有可能会对购买进行退款。因此,每次启动时都需要查询用户的库存并相应地调整您的授权。您需要进行这个检查,以支持期望在切换到新设备或卸载/重新安装应用程序时拥有授权的用户。

对于即时购买,检查未来是否仍有购买并没有帮助,因为他们已经获得了该物品。如果您无法信任应用内购买,则很难使用它。 - James
您可以使用托管购买,一旦被使用就无法退款。不确定它是否支持您的用例,但可能会有所帮助。 - Jschools

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接