【问题标题】:Online receipt validation for Mac App Store In-App PurchasesMac App Store 应用内购买的在线收据验证
【发布时间】:2011-09-29 13:28:42
【问题描述】:

对于 iOS 应用内购买,我们可以use an online API for validation,这意味着我们可以在自己的服务器上验证购买。

是否有任何方法 (API) 可以验证 OS X 的应用内购买?

我只找到了this snippet about in-app validation for Mac,而且Apple 似乎没有提供任何用于在线验证的API。

或者 Apple 是否有计划支持 OS X 的在线验证?

【问题讨论】:

    标签: macos validation in-app-purchase


    【解决方案1】:

    我的应用程序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 上轻松测试:

    1. 找到 Mac 应用收据文件(在您运行应用并输入您的(测试)Apple ID 和密码后,它就在您应用的捆绑包中。

    2. 在命令行中,base64 -i receipt 将对收据进行 base64 编码没有换行符(这很重要)

    3. 再次在命令行,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

    【讨论】:

    • Mathew,你有没有找到一种方法来验证服务器上的应用购买消耗品的收据?我也需要这样做,并且一直在努力寻找解决方案
    • 嗨乔恩,对不起,我没有早点看到这条评论。不,我仍然没有办法验证 MAS 消耗品。我的计划是提供在线服务,但我现在选择根本不将其作为应用内购买选项提供,而是使用 Fastspring 作为支付网关,向我的服务器发送签名通知。希望对您有所帮助。
    • @MathewWaters 嗨,是否可以/允许使用消耗品来模仿 mac osx 中的应用订阅中的非续订。如果不是,是否允许将应用重定向到 webview/浏览器进行支付?
    • 对不起@Nitin,我才看到你的评论。是的,事实上这就是我在 Easy Books for Mac 中所做的。请注意,消耗品不会像非消耗品一样恢复到其他设备。
    • @MathewWaters 嗨,有一种在 Mac OSX 中验证购买的方法吗?谢谢
    【解决方案2】:

    SwiftyStoreKit 很受欢迎:

    InAppReceipt 用于本地收据验证:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-04
      • 2011-10-12
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      相关资源
      最近更新 更多