如何使用RMStore或Apple API获取最后的收据数据?

时间:2015-08-11 20:14:56

标签: ios objective-c in-app-purchase receipt rmstore

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

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

  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] - 那些获得RECURL等于的方法吗?两者都不像我期望的那样工作。
  6. [NSData dataWithContentOfURL:receiptURL] - 这是我遇到的主要问题。在我上面提到的函数组合的不同尝试之后,此方法始终返回具有相同transactionID的收据。这让我觉得我需要在运行#5,#6之前刷新现金以获得最后一张收据,但目前尚不清楚如何做到这一点。
  7. 所以,RMStore wiki看起来很不错,但我总是希望这个库能让我有机会不完全了解幕后发生的事情。不幸的是,对于RMStore,我必须研究Apple在应用程序购买API中的运作方式。如果提供函数调用的结果,这可以解决,但我无法在任何地方找到它(!)

    有人可以查看我提供的功能列表,并帮助我按正确的顺序排列,让我在购买后获取最后一张收据来解决我的问题吗?

1 个答案:

答案 0 :(得分:0)

我的问题有两个答案:

  1. 代码:

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

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

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