来自StoreKit指南:
如果用户试图购买他们已经购买的非消耗品或可再生订阅,您的应用程序将收到该项目的常规事务,而不是恢复事务。但是,该产品不会再次向用户收费。您的应用程序应该以与原始事务相同的方式对待这些事务。。
在我正在开发的应用程序中,这是一个很大的问题。我们已经从一家出版商那里获得了大量内容的许可,通过应用程序内购买进行销售。它们要求每次我们出售这部分内容(即用户付费给我们)时,我们的服务器都会在他们的服务器上调用API来报告事务。这是为了会计的目的,并最终用于确定多少我们支付在月底,根据我们与他们的协议。
我在SO和其他地方读到了一些关于频繁调用restoreCompletedTransactions的建议,以及在设备上保持对用户已经购买的内容的本地理解,这样他们就不能再购买它了。在我看来,这是应该能够在服务器端实现的东西。然而,正如StoreKit指南所承诺的那样,我们从苹果服务器获得的收入与购买和再购买完全相同。
如果在这种情况下,StoreKit的支付回调不能被信任为有效的会计机制(“您得到了报酬”与“您没有得到报酬”),那么还有其他关于交易流量的实时见解吗?我不认为与我们合作的出版商会高兴,如果我们告诉他们,我们必须等待45天后,月底,以获得真正的支付美元金额的iTunes连接。
发布于 2013-06-08 10:02:25
我最近也研究过同样的问题。在我的例子中,我希望使用Mobile App Tracking实现精确的收入跟踪,以跟踪来自不同客户获取活动的收入。
幸运的是,有办法做到这一点。应该注意的是,SKPaymentTransactionStatePurchased与SKPaymentTransactionStateRestored仅仅取决于激发动作,例如您是启动了恢复还是(再)购买,所以这是行不通的。
取而代之的是检查SKPaymentTransaction.originalTransaction,这将是用于恢复和再购买的!= nil。遗憾的是,后者是未定义行为(docs)。不过,我认为空头支票是公平的。
另一个选项是用SKPaymentTransactionStatePurchased验证事务--事务的接收,并检查返回的、经过验证的收据中的original_transaction_id属性是否与transaction_id匹配。
发布于 2011-04-21 11:21:06
坏消息是:在目前的iOS版本(4.3.x)中,没有办法区分非消费品的购买和再购买。
为了缓解这种情况,我建议两件事:
第一
购买成功后,将所购买产品的product identifier存储在设备上的NSUserDefaults中。然后,您可以对用户隐藏已经购买的产品,从而处理重新购买的情况。
当用户同步设备时,NSUserDefaults由iTunes备份。因此,当用户获得新设备时,所存储的购买信息不会丢失。
第二
将收据数据与设备ID一起存储在服务器上。分析收据的产品标识符和设备ID。
如果您收到另一份具有相同产品标识符和设备ID组合的收据,则假设重新购买。至少,这将使你能够涵盖大部分的再购买案件。
假设一个普通的iPhone用户每1-2年更换一次他的设备,你至少会覆盖大部分的再购买案例,也许苹果会在未来修复这个问题。
发布于 2011-07-04 07:52:56
我有一个解决办法
谢谢,
https://stackoverflow.com/questions/5623652
复制相似问题