iOS的IAP收据验证

3
我正在开发一个客户端/服务器应用程序,使用苹果的IAP和StoreKit框架购买订阅。
我们希望客户端(iPhone或iPad)使用StoreKit框架通过他们的iTunes账户向苹果进行初始订阅购买,然后将收据传递给我们的服务器,该服务器将验证它,然后更新用户的账户状态。我们还希望服务器负责管理订阅的状态(检查自动续订、取消等)。所有这些都使用iOS 7风格的appleReceipts,而不是当前已弃用的iOS 6风格的交易收据。
苹果的文档说要将收据和秘密代码一起POST到以下URL以在沙盒中验证收据。

https://sandbox.itunes.apple.com/verifyReceipt

到目前为止,一切都按照预期运作。

让我感到困惑的是响应。苹果文档中说,响应应该有最多4个字段。如果您正在验证iOS 7风格的应用程序收据,则只应该期望前两个字段。如果它是iOS 6样式的订阅交易收据,则应该看到所有4个字段。

1)状态(有效为0,否则为某个错误代码)

2)收据(发送的收据的JSON表示形式)

3)latest_receipt(仅返回自动续订订阅的iOS 6样式交易收据。最近续订的Base64编码交易收据。)

4)latest_receipt_info(与上述相同的JSON格式)

问题1:即使我正在验证iOS 7风格的应用程序收据,我仍然看到了所有4个字段。文档中说不应该发生这种情况。

https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-CH104-SW1

问题2: 我们希望服务器通过轮询此API并使用客户端传递的原始应用程序收据来处理用户订阅状态。 latest_receipt_info字段似乎包含一个不断更新的交易列表,而receipt字段是原始副本,没有更新的交易信息。

我的问题: 那么似乎服务器获取有关更新交易的唯一方法是查看latest_receipt_infolatest_receipt字段,但根据文档,这些字段不应出现在响应中。

这是Apple文档中的错误吗?还是获取最新交易的唯一方法是让客户端在SKPayementTransactionObserver通知时发送更新的AppReceipts?

编辑 - 根据下面的评论添加了步骤和一些代码。

1)使用SKPaymentQueue购买autoRenewSubscription产品:

 SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];
    payment.applicationUsername = [self hashedValueForAccountName:[UserAccount sharedInstance].subscriberKey];
    [[SKPaymentQueue defaultQueue] addPayment:payment];

2) 支付完成后,我会通过我的SKPaymentTransactionObserver接收回调,并将文件发送到以下URL:

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

我将使用以下python代码验证收据

import itunesiap
import base64

file = "/path/to/receipt/sandboxReceipt"
f = open(file)
encoded = base64.b64encode(f.read())

with itunesiap.env.current().clone(use_sandbox=True):  # additional change for current environment.
    response = itunesiap.verify(encoded,"mysecretkey")

响应包含一个字典。 该字典具有以下字段

"latest_receipt" = base64 encoded receipt here
"latest_receipt_info" = a JSON representation of the latest receipt
"receipt" = a JSON representation fo the receipt I sent for verification

文档显示,前两个字段仅适用于自动续订的 iOS 6 样式交易收据。

“仅适用于自动续订的 iOS 6 样式交易收据。”

  1. 既然我正在验证 iOS 7 样式的应用程序收据,为什么它们会出现在这里?
  2. 如果这些字段不应该存在,那么我如何获取最新的交易信息?

请展示你所看到和尝试的代码。 - sschale
@sschale 我已经编辑了原始帖子并附上了一些示例代码。谢谢 - habs93
苹果文档中的措辞含糊不清。仅适用于自动续订订阅的iOS 6样式交易收据。这意味着该字段始终存在于使用appStoreReceiptURL的iOS 7收据中,但仅出现在已弃用的交易样式收据中,这些收据是针对自动续订订阅的。即,如果购买不是订阅,则它们不会出现在iOS 6交易收据上。 - Marc Greenstock
@MarcGreenstock 谢谢你的评论,非常有帮助。 - habs93
@MarcGreenstock 如果您将您的评论发布为答案,我会标记它为已接受。 - habs93
说实话,我不同意被接受的答案。"仅适用于iOS 6风格的交易收据..." 对我来说意味着对于iOS 7+的收据,这些字段不应该存在 - 然而它们确实存在。 - winna
2个回答

5

苹果文档中的措辞含糊不清。只有在iOS 6风格的自动续订订阅的情况下才会返回收据。这意味着,对于使用appStoreReceiptURL的iOS 7收据,该字段始终存在,但仅适用于已弃用的交易样式的收据,即针对自动续订订阅。也就是说,如果购买不是订阅,则它们不会出现在iOS 6交易收据上。


1
@deathpote 我已经添加了一个澄清请求 https://forums.developer.apple.com/message/179326 - Marc Greenstock
1
@deathpote。我想我们都同意文档很烂 :) 因此,我的公司与苹果支持团队联系。经过两周的来回提供示例请求和应用程序,苹果代表承认文档不仅含糊不清,而且还是错误的。我们还得到了详细信息,尽管iOS 6数据已被弃用,但在至少未来12个月内不会被删除 - 这是直接来自iTunes工程团队的消息(据说)。 - winna
@MarcGreenstock,我刚从苹果方面得到了关于这个问题的最新消息,如果你仍然对此感兴趣: 所有包含自动续订订阅的收据现在都包括有关客户订阅状态的实时信息。 其中包括 Subscription Auto-Renew Status: 表示客户的订阅是否会在当前订阅期结束时续订。(来源:https://itunespartner.apple.com/en/apps/news/45333106)PS:我没有查看API,不知道它是否已经可用。 - deathpote
latest_receipt文档已更新,现在更易理解: “仅适用于包含自动续订订阅的收据。对于iOS 6风格的交易收据,这是最近续订的base-64编码收据。对于iOS 7风格的应用程序收据,这是最新的base-64编码应用程序收据。” https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-CH104-SW4 - deathpote
1
@deathpote 谢谢。我想我们可以安全地说,歧义问题已经解决了。latest_receiptlatest_receipt_info将会保留。API的更新效果很好,我已经在生产中进行了测试和实施,并对额外的细节感到非常满意。状态通知更新Webhook非常棒。我甚至在设备将收据发送到我的API之前就获得了购买信息。 - Marc Greenstock
显示剩余7条评论

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接