我已经让 IAB v3 正常工作,并且能够购买托管项目。但是,为了继续开发和测试,我想退款购买,以便我可以再次尝试进行相同的购买。我登录了我的 Google Checkout 商家帐户并成功为购买退款。但是,该应用程序仍然认为用户购买了该商品。我退款已经好几个星期了,所以这不是延迟问题。
基本上,在我的 QueryInventoryFinishedListener实现,inventory.hasPurchase(SKU_REMOVE_ADS)始终返回 true,即使在退款后也是如此(SKU_REMOVE_ADS 是我正在销售的商品的 SKU)。我期待它在退款处理后返回 false。
如果你看 'Handling Refunds' section of the IAB reference ,它表示您的应用需要监听 IN_APP_NOTIFY 消息。然而documentation for IN_APP_NOTIFY特定于应用内计费的 v2。它似乎不是 v3 中可用的东西,因为它没有在 v3 引用中的任何地方提及,我也无法在 sample TrivialDrive app 中找到它的任何引用。他们用来演示 IAB v3。
那么 IAB v3 是否支持退款/取消购买?有没有人尝试过并让它工作?
最佳答案
就 Google Play 而言,消耗品和非消耗品之间确实没有区别;这种区别完全取决于您在应用程序中实现的内容。因此,即使您正在测试的 SKU 是非消耗品(例如,永久高级升级),但出于测试目的,您可以将其视为消耗品并消耗它,以便再次购买。
一种方便的方法是在您的应用程序中设置一个临时测试菜单(例如,通过在测试期间将菜单项添加到您应用程序的主选项菜单上),然后让该项目的处理程序调用 IabHelper 实例的 consumerAsync() 方法您想再次测试购买的 SKU。这将消耗该项目,从而使其立即可用于从您的设备重新购买。
当然,您仍然希望通过 Google Checkout 为购买的商品退款,这样您就不会为了测试您的应用而花费自己的钱。
我想补充一点,如果您正在使用此类静态值进行测试,consumeAsync() 似乎也适用于重置测试 SKU android.test.purchased。
关于更新购买状态以反射(reflect)退款,我个人经历过(并且其他开发者发布了许多类似的报告)通过 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 响应。是的,有点笨拙,但我认为从人类的角度来看,它可以通过适当突出显示消息和确认对话框的道歉措辞告诉他们他们拥有该项目等:-))。
实际上,您可以看到 Google 可能不希望世界上每个 IAB 应用程序的每个实例在每次访问应用程序的购买数据时都访问其服务器,特别是考虑到他们建议开发人员检查每次启动应用程序时都会购买。这也是您的应用程序的性能问题 - 这就是缓存的全部意义所在。因此,您需要了解更新缓存的触发器,而且我还没有找到一个正式记录此内容的地方(我们推测,在代码中除外)。所以准备好 Handlebars 放在你面前,开始在黑暗中感受周围。
有关 Google Play 缓冲的一些其他信息,请参阅此页面:
Under What Conditions are In-App Billing Version 3 Server Changes Made Available on Client Devices?
我会注意到,在您帖子的代码 fragment 中,您正在调用库存.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
}
}
关于android - Google Play 应用内结算版本 3 是否支持退款?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15762370/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案