0

我正在测试应用内购买功能并停留在收据验证步骤中。我的收据验证是自定义的,并且基于我在服务器端进行的检查数量(调用我的服务器 API),其中之一是 transactionID 唯一性以确认付款的条件。因此,使用 RMStore 我成功获得了收据,并且 addPayment 函数将唯一交易返回到成功块。之后,我正在运行 verifyTransaction 并在成功块内调用receiptURL。不幸的是,看起来我总是使用receiptURL获得相同的收据,当我将它发送到我的服务器时,它会以错误响应我事务ID已经存在于数据库中并且事务ID不是唯一的。此错误表明即使我进行新付款,我也会发送相同的收据。请注意,我使用的是消耗品。

有人可以向我展示我在下面提供的功能的正确工作流程吗(?):

  1. [RMStore productRequest] - 我在 init 函数中直接调用它。
  2. [RMStore addPayment] - 这是我需要了解的后果的开始。
  3. [[[RMStore defaultStore].transactionPersistor consumeProductOfIdentifier:pID] -- 我需要调用这个函数吗?每次付款时,Apple 都会向我发送唯一的 transactinID,调用此函数没有任何影响。
  4. [[[RMStore] defaultStore].receiptVerificator verifyTransaction:transaction] -- 我需要调用交易验证吗?
  5. [RMStore receiptURL] 或 [[NSBundle mainBundle] appStoreReceiptURL] - 这些方法可以让receiptURL 相等吗?两者都不像我预期的那样工作。
  6. [NSData dataWithContentOfURL:receiptURL] - 这是我遇到的主要问题。经过我上面提到的功能组合的不同尝试后,该方法总是返回具有相同事务ID的收据。这让我觉得在运行#5、#6 之前我需要刷新现金才能获得最后一张收据,但目前尚不清楚如何做到这一点。

所以,RMStore wiki 看起来不错,但我一直期望这个库会给我一个机会,让我不完全了解幕后发生的事情。不幸的是,对于 RMStore,我必须调查 Apple in app purchase API 的工作原理。如果将提供函数调用的结果,则可以解决此问题,但我无法在任何地方找到它(!)

有人可以查看我在上面提供的功能列表并帮助我将它们按正确顺序排列是什么让我解决了在购买后获得最后一张收据的问题?

4

1 回答 1

0

我的问题有两个答案:

  1. 编码:

    NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];

    工作正常(即它返回正确的收据正文),但由于某种原因,Apple 可以返回两个(甚至数组 [])付款,其中第一个 transactionID 可以与您之前得到的相同。正如我的服务器开发人员所说,这是意外行为。因此,当我收到收据并将收据发送到服务器时,它只读取第一个 transactionID,这可能与您之前获得的相同。结果,服务器返回 FALSE 作为验证结果(看起来您尝试支付两次)。因此,由于不清楚为什么 Apple 会在收据中向我发送两个或更多交易记录,但作为解决方法,我要求服务器端开发人员检查收据中的所有交易是否有任何唯一的 transactionID。需要更多调查来了解 Apple 的行为,但这可能需要更多时间。我没有找到答案,现在继续。

  2. 与 RMStore 工作流相关的内容 我意识到实际上我们只有两个最重要的函数:addPayment 和 verifyTransaction。addPayment 函数将隐式调用 verifyTransaction。您应该重载 verifyTransaction 并在里面调用 serverAPI 验证函数。因此,如果验证成功,则转到 addPayment 的成功块并执行成功付款所需的操作。如果没有 - 做其他事情。我的错误是在 addPayment 成功块内调用 verifyTransaction 意味着调用它两次。

于 2016-02-25T12:56:23.067 回答