来自StoreKit指南:
如果用户尝试购买他们已购买的非消费产品或可续订订阅,您的应用程序将收到该项目的常规交易,而不是恢复交易。但是,不会再向该用户收取该产品的费用。您的应用程序应将这些交易视为与原始交易的交易相同。
这给我正在开发的应用程序带来了一个巨大的问题。我们已通过应用内购买向发布商许可了大量内容。他们要求我们每次出售这些内容(即用户向我们支付)时,我们的服务器会在其服务器上调用API来报告交易。这是出于会计目的,并且根据我们与他们的协议,最终用于确定我们在月底支付的金额。
我已经在SO和其他地方阅读了几个关于调用restoreCompletedTransactions的建议,并且在设备上保持了用户已经购买的内容的本地理解,因此不允许他们再次购买。这对我来说似乎应该能够在服务器端实现。但是,正如StoreKit指南所承诺的那样,我们从Apple服务器返回的收据与购买和重新购买完全相同。
如果来自StoreKit的付款回调在这种情况下无法被信任为有效的会计机制(“您已获得付款”与“您没有获得付款”),那么可以获得有关交易流量的其他实时见解?如果我们告诉他们我们必须在月底之后等待45天才能从iTunes Connect获得真正的付费美元金额,我认为我们正在合作的出版商会很高兴。
答案 0 :(得分:6)
我最近遇到了同样的问题。就我而言,我希望使用Mobile App Tracking实现准确的收入跟踪,以跟踪不同客户获取广告系列产生的收入。
幸运的是,有一种方法可以做到这一点。应该注意的是,SKPaymentTransactionStatePurchased
与SKPaymentTransactionStateRestored
完全取决于启动操作,例如您是否已启动恢复或(重新)购买,因此无效。
正在检查SKPaymentTransaction.originalTransaction
的工作是什么,!= nil
用于恢复和重新购买SKPaymentTransactionStatePurchased
。后者遗憾的是未定义的行为(docs)。虽然我认为空检是公平的。
另一种选择是使用original_transaction_id
验证交易的交易收据,并检查返回的,经过验证的收据中的transaction_id
属性是否与{{1}}匹配。
答案 1 :(得分:4)
坏消息是:在当前的iOS版本(4.3.x)中,没有办法区分购买和重新购买非消费品。
为了缓解这种情况,我建议两件事:
成功购买后,将所购买产品的product identifier
存储在设备上的NSUserDefaults
中。然后,您可以隐藏用户已购买的产品,从而处理重新购买的情况。
当用户同步他的设备时,iTunes会备份NSUserDefaults
。因此,当用户获得新设备时,您存储的购买信息不会丢失。
将收据数据与设备ID一起存储在服务器上。分析收据的产品标识符和设备ID。
如果您收到另一张具有相同产品标识和设备ID组合的收据,则假设重新购买。至少这可以让你涵盖大部分的重购案例。
假设一个普通的iPhone用户每1 - 2年更换一次设备,你至少会覆盖大部分的重购案例,也许苹果将在未来解决这个问题。
答案 2 :(得分:1)
我有一个解决方案,
将产品配置为耗材。 这将解决问题 - (他们要求我们每次出售这些内容(即用户付钱给我们))。
接下来,您需要在产品购买选项中实施逻辑。在某种程度上,一旦用户购买产品,购买选项需要移除,否则用户可能会在同一设备中再次购买并丢失现金。 您可以将NSUserdefaults用于此目的。
感谢,