Ali*_*ium 22 android in-app-purchase in-app-billing google-play-services
我已经让IAB v3工作了,我能够购买一个托管项目.但是,为了继续开发和测试,我想退还购买,所以我可以尝试再次购买相同的产品.我登录了Google Checkout商家帐户并成功退款.但是,该应用程序仍然认为用户已购买该项目.我退款已经有好几周了,所以这不是延误问题.
基本上,在我的QueryInventoryFinishedListener实施中,inventory.hasPurchase(SKU_REMOVE_ADS)即使在退款之后总是返回true(SKU_REMOVE_ADS是我销售的商品的SKU).在退款处理完毕后,我原以为它会返回false.
如果您查看IAB参考的"处理退款"部分,它会说您的应用需要收听IN_APP_NOTIFY消息.但是,IN_APP_NOTIFY的文档特定于应用内结算的v2.它似乎不是v3中可用的东西,因为它没有在v3参考中的任何地方提到过,也不能在他们用来演示IAB v3 的示例TrivialDrive应用程序中找到它的任何参考.
那么IAB的v3支持退款/取消购买吗?有没有人试过它并让它工作?
Car*_*arl 33
就Google Play而言,消耗品和非消耗品之间确实没有区别; 这种区别完全基于您在应用程序中实现的内容.因此,即使您正在测试的SKU是非消耗品(例如,永久性的高级升级),出于测试目的,您可以将其视为消耗品并将其消耗,以便可以再次购买.
一种方便的方法是在应用程序中设置临时测试菜单(例如,通过在测试期间将菜单项添加到应用程序的主选项菜单中),然后让该项目的处理程序调用IabHelper实例的consumeAsync()方法您要再次测试购买的SKU.这将消耗该项目,从而使其立即可用于从您的设备重新购买.
当然,您仍然希望从Google Checkout退还购买款项,这样您就不会花费自己的钱来测试您的应用.
我想补充一点,如果你正在测试使用这样的静态值,consumeAsync()似乎也适用于重置测试SKU android.test.purchased.
关于更新购买状态以反映退款,我个人经历过(并且其他开发人员发布了许多类似的报告)通过Checkout手动启动退款(例如,从TrivialDrive应用程序购买测试)需要数天才能生成在更改产品的购买状态(到INAPP_PURCHASE_STATE_REFUNDED).
(知道苦难喜欢公司,其中一些额外的报告可以在这个讨论主题中找到:https: //plus.google.com/+AndroidDevelopers/posts/R8DKwZDsz5m)
至少部分原因是Google Play在设备上缓存了购买数据.
根据我的经验,重新启动设备有时会导致Google Play从GP服务器刷新其缓存.因此,重启后也可能会检测到因Checkout取消或退款而导致的更改.
似乎这么长的周转期对你没有好处,因为你无法知道用户什么时候会重启.但话又说回来,你知道每台设备最终会重新启动,所以如果你担心收到退款的用户最终会被阻止使用退款的IAB产品,那么延迟几天可能并不重要,只要它最终发生.
当然,请记住,缓存将在重新启动时刷新的这一概念没有记录和轶事(就像迄今为止的大量IAB3和TrivialDrive行为一样).民间传说,他们称之为.
触发更新的另一件事是用户尝试购买产品.购买一旦启动,系统就必须确保产品尚未拥有,因此它会更新Google Play缓存.根据我的个人经验,这一直是发生的.但同样,这是不检查退款一种非常实用的方法,因为这将会导致显示购买对话框的不速之客,还告诉用户"您已拥有此,"(如果他们的错误信息做到拥有它).
如果这确实派上用场是在用户支付的IAB项目上她的设备之一,然后试图访问是由同一个帐户拥有其用于购买不同的设备上该项目.在这种情况下,购买信息通常尚未被缓存.但您可以在购买对话框中添加一个小注释,如果该商品已经购买,尝试重新购买应该可以在现有设备上免费使用.有时需要两次(用户启动的)购买尝试才能最终获得IabHelper.BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED响应.是的,有点麻烦,但我认为从人的角度来说,它将适用于消息的正确突出显示和确认对话框的辩护措辞,告诉他们他们拥有该项目等等:-)).
作为一个实际问题,你可以看到谷歌怎么可能不希望世界上每一个IAB的应用程序的每个实例来访问它的服务器每个应用程序的购买数据被访问时,特别是考虑到他们建议开发商做什么有一个检查每次启动应用程序时都会购买.这也是您的应用程序的性能问题 - 这就是缓存的全部内容.所以你需要知道更新缓存的触发器,我还没有找到一个正式记录的地方(除了我们在代码中假设).所以准备好把手伸到你面前,开始在黑暗中四处感受.
有关Google Play缓存的一些其他信息,请参阅此页面:
在什么条件下应用程序中的帐单版本3服务器更改在客户端设备上可用?
我会注意到,在您的帖子的代码段中,您正在调用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
}
}
Run Code Online (Sandbox Code Playgroud)
关于退款和取消订单的好消息是,两者都是AFAIK,完全由开发人员选择.因此,如果您发现获得这些内容的用户可以在此后长时间间隔内继续使用您的应用,并且如果您发现有很多用户正在利用此功能,那么您可以决定是否要继续提供退款所有情况.我最好的猜测是它不会成为问题; 即使一些获得退款的用户在此之后使用你的应用程序一段时间,这看起来并不是什么大问题.
用于测试的是您需要能够非常快速地重新购买,并且使用consumeAsync()肯定可以用于此目的.
| 归档时间: |
|
| 查看次数: |
7750 次 |
| 最近记录: |