iOS 的 IAP 收据验证
IAP receipt validation for iOS
我正在开发一个 client/server 应用程序,它使用 Apples IAP 和 StoreKit 框架来购买订阅。
我们希望客户(iPhone 或 iPad)使用 StoreKit 框架通过他们的 iTunes 帐户向苹果进行初始订阅购买,然后将收据传递给我们的服务器,这将对其进行验证,然后更新用户帐户状态。我们还希望服务器负责管理订阅状态(检查自动续订、取消等)。这都是使用 iOS 7 样式的 appleReceipts,而不是 iOS 6当前已弃用的样式交易收据。
Apple 的文档告诉 POST 以下 URL 以验证沙盒中的收据以及收据和密码
https://sandbox.itunes.apple.com/verifyReceipt
到目前为止..一切正常。
让我感到困惑的地方在于回复。 Apple 的文档说响应最多应该有 4 个字段。如果您正在验证 iOS 7 样式的应用程序收据,那么您应该只期望前 2 个。如果它是 iOS 6 样式的订阅交易收据,那么您应该期望看到所有 4 个。
1) 状态(0 表示有效,否则为一些错误代码)
2) 收据(JSON 表示已发送的收据)
3) latest_receipt(仅返回 iOS 6 种样式的自动续订订阅交易收据。最近续订的 base-64 编码交易收据。)
4) latest_receipt_info(同上JSON格式)
问题一:
即使我正在验证 iOS 7 样式的应用程序收据,我也会看到所有 4 个。文档说这不应该发生。
问题二:
我们希望服务器通过轮询 API 与客户端在首次购买后通过的原始应用收据来维护用户订阅状态。 latest_receipt_info
字段似乎包含不断更新的交易列表,而 receipt
字段是原始副本,没有更新的交易信息。
我的问题:
看来服务器获取有关更新事务的信息的唯一方法是查看 latest_receipt_info
或 latest_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];
到我的远程服务器。
3) 我正在使用以下 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
文档说前两个字段是
"Only returned for iOS 6 style transaction receipts for auto-renewable
subscriptions."
- 为什么他们会出现在这里,因为我正在验证 iOS 7 样式
应用收据?
- 如果这些字段不应该存在,我该如何
获取最新交易信息?
Apple 文档中的措辞含糊不清。 仅返回 iOS 6 种样式的交易收据自动续订订阅。这意味着该字段始终存在于 iOS 7 个使用 appStoreReceiptURL
的收据中,但仅存在于用于自动续订订阅的已弃用交易样式收据中。也就是说,如果购买不是订阅,它们不会出现在 iOS 6 个交易收据上。
您需要在您的 JSON 中包含 "password" 键以及 "receipt-data" 以验证收据,它的值将是 "shared secret key",您可以从中生成iTunes 帐户。有关更多详细信息,请参阅此 link 中的第三个标题。 https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html
我正在开发一个 client/server 应用程序,它使用 Apples IAP 和 StoreKit 框架来购买订阅。
我们希望客户(iPhone 或 iPad)使用 StoreKit 框架通过他们的 iTunes 帐户向苹果进行初始订阅购买,然后将收据传递给我们的服务器,这将对其进行验证,然后更新用户帐户状态。我们还希望服务器负责管理订阅状态(检查自动续订、取消等)。这都是使用 iOS 7 样式的 appleReceipts,而不是 iOS 6当前已弃用的样式交易收据。
Apple 的文档告诉 POST 以下 URL 以验证沙盒中的收据以及收据和密码
https://sandbox.itunes.apple.com/verifyReceipt
到目前为止..一切正常。
让我感到困惑的地方在于回复。 Apple 的文档说响应最多应该有 4 个字段。如果您正在验证 iOS 7 样式的应用程序收据,那么您应该只期望前 2 个。如果它是 iOS 6 样式的订阅交易收据,那么您应该期望看到所有 4 个。
1) 状态(0 表示有效,否则为一些错误代码)
2) 收据(JSON 表示已发送的收据)
3) latest_receipt(仅返回 iOS 6 种样式的自动续订订阅交易收据。最近续订的 base-64 编码交易收据。)
4) latest_receipt_info(同上JSON格式)
问题一: 即使我正在验证 iOS 7 样式的应用程序收据,我也会看到所有 4 个。文档说这不应该发生。
问题二:
我们希望服务器通过轮询 API 与客户端在首次购买后通过的原始应用收据来维护用户订阅状态。 latest_receipt_info
字段似乎包含不断更新的交易列表,而 receipt
字段是原始副本,没有更新的交易信息。
我的问题:
看来服务器获取有关更新事务的信息的唯一方法是查看 latest_receipt_info
或 latest_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];
到我的远程服务器。
3) 我正在使用以下 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
文档说前两个字段是
"Only returned for iOS 6 style transaction receipts for auto-renewable subscriptions."
- 为什么他们会出现在这里,因为我正在验证 iOS 7 样式 应用收据?
- 如果这些字段不应该存在,我该如何 获取最新交易信息?
Apple 文档中的措辞含糊不清。 仅返回 iOS 6 种样式的交易收据自动续订订阅。这意味着该字段始终存在于 iOS 7 个使用 appStoreReceiptURL
的收据中,但仅存在于用于自动续订订阅的已弃用交易样式收据中。也就是说,如果购买不是订阅,它们不会出现在 iOS 6 个交易收据上。
您需要在您的 JSON 中包含 "password" 键以及 "receipt-data" 以验证收据,它的值将是 "shared secret key",您可以从中生成iTunes 帐户。有关更多详细信息,请参阅此 link 中的第三个标题。 https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html