我的应用程序EasyBooks 提供了一个用户每年付费购买的在线组件。将其作为非消耗性类型提供是没有意义的,因为它实际上只能作为消耗性使用(但它实际上是 iOS 中的非重复订阅)。我想在应用内提供这个,我想我终于有一个解决方案了......
我使用我的一张 Apple DTS 票证来查询 StoreKitGuide 文档中的声明。它说...
"OS X 同时支持本文描述的服务器验证方法
章节和本地验证方法..."
我收到了 Apple 的回复说...
“验证您的 Mac 应用内购买产品的步骤
应用程序与 iOS 应用程序相同。不同之处在于您会将 base 64 编码的应用收据(而不是 transactionReceipt 属性的内容)分配给收据数据字段。检索应用程序的完整 Mac App Store 收据,然后使用 base64 编码对其进行编码。使用一个名为receipt-data 的键创建一个JSON 对象,并将您的编码收据分配给它。按照 In-App Purchase Programming Guide 的使用 App Store 验证收据部分中的说明进行操作。
注意:应用内购买收据包含在相关 Mac 应用的收据中。您必须检查与您的应用关联的收据,以验证其中包含的应用内购买收据的有效性。这样做还可以让您在应用中启用适当的功能。”
因此,在一些失败的尝试之后,我确实设法让这个工作得到了警告,即 Apple 服务器返回的收据数据不包含“GUID 的哈希”,因此不会将收据数据与任何特定硬件联系起来。
这可以通过以下步骤在您的 Mac 上轻松测试:
找到 Mac 应用收据文件(在您运行应用并输入您的(测试)Apple ID 和密码后,它就在您应用的捆绑包中。
在命令行中,base64 -i receipt 将对收据进行 base64 编码没有换行符(这很重要)
再次在命令行,curl -d '{ "receipt-data": "<your b64 string here>" }' https://sandbox.itunes.apple.com/verifyReceipt
这会以格式返回 JSON 数据
{"status":0,
"environment":"Sandbox",
"receipt":{"adam_id":"0",
"bundle_id":"uk.co.geode.easybooks",
"application_version":"2.2.7",
"download_id":"0",
"in_app":[ {"quantity":"1",
"product_id":"uk.co.geode.easybooks.syncing",
"transaction_id":"1000000034508678",
"purchase_date":"2012-09-05 12:00:17 Etc/GMT",
"original_transaction_id":"1000000034508678",
"original_purchase_date":"2012-01-24 10:16:17 Etc/GMT"} ]}}
我尚未确认,但显然(根据 Apple 工程师的说法)任何消耗品类型的应用内购买将在首次购买时添加到收据中,但在任何进一步购买或恢复操作后删除。我想知道让应用程序中运行的代码在每次购买后复制收据文件是否是个好主意,以防万一我们自己的服务器在应用程序尝试验证收据时出现故障。否则用户可能会尝试恢复购买,但没有意识到这会删除任何消耗品收据。
希望对你有帮助。
(以下是原始评论)
我也有同样的问题。我在商店中有一个 iOS 应用程序,其中混合了可在应用程序内购买的消耗性和非消耗性产品。消耗品是一项服务,由我的网络服务器完成。在 StoreKit 委托方法 paymentQueue:updatedTransactions: 中,我使用了 transactionReceipt 属性,它是一个 NSData 对象。我将其编码为 base64 并将其发送到服务器。在服务器上,我将收据传递给 Apple 的服务器进行验证。
但对于 Mac OS,SKPaymentTransaction 上没有 transactionReceipt 属性,因此我们无法以相同的方式验证收据。
我们可以做非消耗品,这可能会对您有所帮助。在 Mac OS 上进行应用内购买时,收据会在应用程序包中更新。然后可以解析收据文件以查找每个应用内收据,这些收据都存储在主包的收据文件中。有关更多信息,请参阅http://developer.apple.com/library/mac/#releasenotes/General/ValidateAppStoreReceipt/_index.html
当我使用非消耗品时,这对我来说很好用,但我有一个消耗品,并且它没有更新到应用的收据文件中。如果没有 transactionReceipt 属性,我看不到服务器验证收据是否真实的任何方法。如果其他人有任何其他经验,请告诉我们!
拥有 Apple 开发者帐户的任何人也可以在 Apple 开发者论坛上阅读相关内容:
https://devforums.apple.com/message/548411#548411