Google Play应用内结算版本3是否支持退款?

我已经得到了IAB v3的工作,我能够为一个托pipe项目进行购买。 但是,要继续开发和testing,我想退还购买,所以我可以尝试再次进行相同的购买。 我login了Google Checkout商家帐户,并成功退还了购买。 但是,该应用程序仍然认为用户有购买的项目。 我已经过了几个星期的退款,所以这不是一个延迟问题。

基本上,在我的QueryInventoryFinishedListener实现中, inventory.hasPurchase(SKU_REMOVE_ADS)总是返回true,即使退款( SKU_REMOVE_ADS是我正在销售的商品的SKU)。 我希望在退款​​处理完成后,它会返回错误状态。

如果您查看IAB参考的“处理退款”部分 ,则表示您的应用需要监听IN_APP_NOTIFY消息。 但IN_APP_NOTIFY的文档特定于应用内结算的第2版。 它似乎没有在v3中提供的function,因为它在v3参考中没有提到任何地方,我也不能在他们用来演示IAB v3的示例TrivialDrive应用程序中find任何参考。

那么IAB的v3支持退款/取消购买? 有没有人试过,并得到它的工作?

Solutions Collecting From Web of "Google Play应用内结算版本3是否支持退款?"

就Google Play而言,消费品和非消费品之间确实没有区别; 这个区别完全取决于您在应用程序中实现的内容。 因此,即使您正在testing的SKU是非易耗品(例如,永久性溢价升级),但为了testing目的,您可以将其作为耗材处理并消耗,以便再次购买。

一个方便的方法是在你的应用程序中设置一个临时testing菜单(例如,在testing过程中在你的应用程序的主选项菜单中添加一个菜单项),然后让该项目的处理程序调用IabHelper实例的consumeAsync()方法您想要testing的SKU再次购买。 这将消耗该项目,从而使其立即可用于从您的设备重新购买。

当然,您仍然希望从Google Checkout退款,这样您就不会花费自己的钱来testing您的应用。

我会补充说,如果您正在使用这种静态值进行testing,那么consumeAsync()似乎也可以正常工作以重置testingSKU android.test.purchased。

关于更新购买状态以反映退款情况,我亲身体验过(通过其他开发者发布的许多类似报告),通过Checkout手动启动退款(例如,从TrivialDrive应用购买testing)需要几天的时间改变产品的购买状态(INAPP_PURCHASE_STATE_REFUNDED)。

(了解公司的不幸情况,有些额外的报告可以在这个讨论主题上find: https : //plus.google.com/+AndroidDevelopers/posts/R8DKwZDsz5m )

至less部分原因是Google Play在设备上caching了购买数据。

根据我的经验,重新启动设备有时会导致Google Play从GP服务器刷新caching。 因此,重启后也可能会检测到因取消订单或通过Checkout退款而导致的更改。

看起来如此漫长的周转时期对你来说并不好,因为你不知道用户什么时候会重启。 但是,再次,您知道每个设备最终都会重新启动,因此如果您担心收到退款的用户最终应该被阻止使用退款的IAB产品,那么几天的延迟可能并不重要,只要它最终发生。

当然,请记住,caching将在重新启动时刷新这一概念是没有文档记载的,也没有轶事(到目前为止,还有相当多的IAB3和TrivialDrive行为)。 民俗,他们称之为。

触发更新的另一件事是当用户试图购买产品时。 购买一旦启动,系统必须确保该产品尚未拥有,因此它会更新Google Playcaching。 以我个人的经验,这一直发生。 但是,这不是一个非常实用的方法来检查退款,因为这将涉及显示购买对话框被禁止,并且还告诉用户“你已经拥有这个”(如果他们拥有它)的错误信息。

在这种情况下 ,当用户在其中一个设备上支付IAB物品,然后尝试访问与用于购买它的同一个账户拥有的不同设备上的该物品时,这一点很方便。 这种情况下的购买信息通常还没有被caching。 但是,您可以在购买对话框中放一点便条,如果该商品已经被购买,试图重新购买的商品应该在本设备上提供,不收取额外费用。 有时需要两次(用户发起的)购买尝试才能最终获得IabHelper.BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED响应。 是的,有点klugy,但我认为在人性方面,它将适当突出显示的信息和确认对话的道歉措辞告诉他们,他们拥有该项目等:-))。

实际上,您可以看到Google在每次访问应用程序的购买数据时可能不希望每个IAB应用程序的每个实例都访问其服务器,尤其是考虑到他们build议开发人员检查每次应用程序启动时都会被购买。 这也是您的应用程序的性能问题 – 这就是caching的全部内容。 所以你需要知道更新caching的触发器,而且我还没有find一个正式logging的地方(除了我们假设的代码)。 所以准备把你的手放在你面前,在黑暗中开始感觉。

有关Google Play缓冲的其他信息,请参阅此页面:

在什么情况下在客户端设备上提供应用内结算版本3服务器更改?

我会注意到,在你的post的代码片段中,你正在调用inventory.hasPurchase(SKU_REMOVE_ADS),但是这只会告诉你,如果购买是在清单对象返回的购买清单中; 它不会告诉你该SKU的购买状态 。 我知道这是由TrivialDrive应用程序使用的方法,但该应用程序不处理退款和取消。 要检测退款和取消订单,您需要这样的东西:

 Purchase removeAdsPurchase = inventory.getPurchase(SKU_REMOVE_ADS); if(removeAdsPurchase != null) { int purchaseStateForRemoveAds = removeAdsPurchase.getPurchaseState(); if(purchaseStateForRemoveAds == 1) { //Do cancelled purchase stuff here } else if(purchaseStateForRemoveAds == 2) { //Do refunded purchase stuff here } } 

关于退款和取消订单的好消息是,两者都是AFAIK,完全由开发商select。 因此,如果您发现获得这些function的用户可以在此后很长时间内继续使用您的应用,并且如果您发现很多用户正在利用此function,则可以决定是否要继续提供退款所有情况。 我最好的猜测是,这不会是一个问题; 即使某些获得退款的用户在此后使用您的应用程序一段时间,也不会有什么大不了的。

这是为了testing,你需要能够重新尝试购买非常迅速,并使用consumeAsync()肯定是为此目的。

我build议你在开发阶段使用静态产品ID。

现在请确保您使用相同的Gmail IDtesting了您已经退款的应用程序? 为了testing退款情况,我认为你可以使用android.test.refunded作为产品ID。

如果这不起作用,那么你可以在第一次启动你的应用程序时,首先检查总购买物品可用物品 ,如果你在这两个调用中得到了相同的产品编号(这不应该是这种情况如果是这种情况,请把这个bug报告给谷歌),然后让API调用使相同的项目消耗。

自从发布这个问题之后,我就注意到我需要调用getPurchase(...).getPurchaseState()并检查它的值。 可能的值为0(购买),1(取消)或2(退款)。

然而,就我而言,即使该物品已退还,它仍然会重新调整为0。 我在这里发布这些信息以防别人帮忙。