4

来自 StoreKit 指南:

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

这在我正在开发的应用程序中提出了一个巨大的问题。我们已从发布商处获得大量内容的许可,以通过应用内购买进行销售。他们要求每次我们出售这种内容的一部分(即用户向我们付款)时,我们的服务器都会调用他们服务器上的 API 来报告交易。这是出于会计目的,最终用于根据我们与他们的协议确定我们在月底向他们支付的费用。

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

如果在这种情况下(“你得到了报酬”与“你没有得到报酬”),来自 StoreKit 的支付回调不能被认为是一种有效的记账机制,那么还有哪些关于交易流量的实时洞察?如果我们告诉他们我们必须在月底后等待 45 天才能从 iTunes Connect 中获得真实支付的美元金额,我认为与我们合作的出版商不会高兴。

4

3 回答 3

6

我最近研究了同样的问题。就我而言,我想使用移动应用跟踪来实现准确的收入跟踪,以跟踪不同客户获取活动产生的收入。

幸运的是,有办法做到这一点。应该注意的是,SKPaymentTransactionStatePurchasedvs.SKPaymentTransactionStateRestored完全取决于启动操作,例如您是启动恢复还是(重新)购买,所以这不起作用。

相反,起作用的是检查SKPaymentTransaction.originalTransaction哪些将!= nil用于恢复重新购买。不幸的是,后者是未定义的行为(docs)。不过,我认为空检查足够公平。

另一种选择是验证交易的交易收据,SKPaymentTransactionStatePurchased并检查original_transaction_id返回的验证收据中的属性是否与transaction_id.

于 2013-06-08T10:02:25.673 回答
4

坏消息是:在当前的 iOS 版本 (4.3.x) 中,无法区分购买和重新购买非消耗性产品。

为了缓解这种情况,我建议做两件事:

第一的

购买成功后,product identifier将购买的产品存储NSUserDefaults在设备上。然后,您可以向用户隐藏已经购买的产品,从而处理重新购买的情况。

NSUserDefaults用户同步他的设备时,iTunes 会对其进行备份。因此,当用户获得新设备时,您存储的购买信息不会丢失。

第二

将收据数据与设备 ID 一起存储在您的服务器上。分析收据的产品标识符和设备 ID。

如果您收到另一张具有相同产品标识符和设备 ID 组合的收据,则假设重新购买。至少这可以让你覆盖大部分的重新购买案例。

假设一个普通的 iPhone 用户每 1-2 年更换一次设备,你至少会涵盖大部分的重新购买案例,也许苹果将来会解决这个问题。

于 2011-04-21T11:21:06.150 回答
1

我有一个解决方案,

  1. 将产品配置为消耗品。这将解决问题 - (他们要求每次我们出售此内容的一部分(即用户向我们付款))。

  2. 接下来,您需要在产品购买选项中实现逻辑。在某种程度上,一旦用户购买了产品,购买选项就需要删除,否则用户可能会碰巧去购买,并且在同一设备中再次丢失相同产品的现金。您可以为此目的使用 NSUserdefaults。

谢谢,

于 2011-07-04T07:52:56.030 回答