在StoreKit /应用程序内购买中区分初始购买和免费“重新购买”

时间:2011-04-11 15:29:37

标签: ios in-app-purchase storekit

来自StoreKit指南:

如果用户尝试购买他们已购买的非消费产品或可续订订阅,您的应用程序将收到该项目的常规交易,而不是恢复交易。但是,不会再向该用户收取该产品的费用。您的应用程序应将这些交易视为与原始交易的交易相同。

这给我正在开发的应用程序带来了一个巨大的问题。我们已通过应用内购买向发布商许可了大量内容。他们要求我们每次出售这些内容(即用户向我们支付)时,我们的服务器会在其服务器上调用API来报告交易。这是出于会计目的,并且根据我们与他们的协议,最终用于确定我们在月底支付的金额。

我已经在SO和其他地方阅读了几个关于调用restoreCompletedTransactions的建议,并且在设备上保持了用户已经购买的内容的本地理解,因此不允许他们再次购买。这对我来说似乎应该能够在服务器端实现。但是,正如StoreKit指南所承诺的那样,我们从Apple服务器返回的收据与购买和重新购买完全相同。

如果来自StoreKit的付款回调在这种情况下无法被信任为有效的会计机制(“您已获得付款”与“您没有获得付款”),那么可以获得有关交易流量的其他实时见解?如果我们告诉他们我们必须在月底之后等待45天才能从iTunes Connect获得真正的付费美元金额,我认为我们正在合作的出版商会很高兴。

3 个答案:

答案 0 :(得分:6)

我最近遇到了同样的问题。就我而言,我希望使用Mobile App Tracking实现准确的收入跟踪,以跟踪不同客户获取广告系列产生的收入。

幸运的是,有一种方法可以做到这一点。应该注意的是,SKPaymentTransactionStatePurchasedSKPaymentTransactionStateRestored完全取决于启动操作,例如您是否已启动恢复或(重新)购买,因此无效。

正在检查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)

我有一个解决方案,

  1. 将产品配置为耗材。 这将解决问题 - (他们要求我们每次出售这些内容(即用户付钱给我们))。

  2. 接下来,您需要在产品购买选项中实施逻辑。在某种程度上,一旦用户购买产品,购买选项需要移除,否则用户可能会在同一设备中再次购买并丢失现金。 您可以将NSUserdefaults用于此目的。

  3. 感谢,