Mac App Store应用内购买的在线收据验证

问题描述 投票:5回答:1

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

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

我只找到了this snippet about in-app validation for Mac,而且看来苹果公司没有提供任何用于在线验证的API。

或者也许苹果有一些计划支持OS X的在线验证?

macos validation in-app-purchase
1个回答
8
投票

我的应用EasyBooks提供了一个用户每年需付费的在线组件。将其作为非消耗性类型提供是没有意义的,因为它只能真正用作消耗性(但是在iOS中实际上是非重复订阅)。我想提供此应用程序内,我想我终于有了解决方案...

我使用一张Apple DTS票证查询了StoreKitGuide文档中的声明。它说...

“ OS X支持本文档中描述的两种服务器验证方法章节和本地验证方法...“

我收到苹果的回复说...

“验证Mac应用内购买产品的步骤应用程序与iOS应用程序相同。所不同的是,您将把以64为基数的应用程序收据(而不是transactionReceipt属性的内容)分配给收据数据字段。检索应用程序的完整Mac App Store收据,然后使用base64编码对其进行编码。用一个名为回执数据的键创建一个JSON对象,并将编码后的回执分配给它。按照《应用内购买编程指南》中的“通过应用商店验证收据”中所述进行操作。

注意:在“应用程序购买中”收据包含在相关的Mac应用程序的收据中。您必须检查与您的应用相关联的收据,以验证其中包含的应用内购买收据的有效性。这样做还可以使您在应用程序中启用适当的功能。“

因此,在经过几次失败的尝试之后,我确实设法解决了这一警告,即苹果服务器返回的收据数据不包含“ GUID哈希”,因此不将收据数据绑定到任何特定硬件。 >

可以使用以下步骤很容易地在Mac上对其进行测试:

  1. 查找Mac应用程序收据文件(运行应用程序并输入(测试)Apple ID和密码后,该文件位于应用程序的捆绑包中。

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

  3. ] >>
  4. 再次在命令行上,curl -d '{ "receipt-data": "<your b64 string here>" }' https://sandbox.itunes.apple.com/verifyReceipt

  5. 这将以格式返回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应用程序,其中包含可在应用程序内购买的易耗品和非易耗品的组合。易耗品是一项服务,由我的Web服务器来完成。在StoreKit委托方法paymentQueue:updatedTransactions:

中,我使用transactionReceipt属性,它是一个NSData对象。我将此编码为base64并将其发送到服务器。在服务器上,我将收据传递给Apple的服务器进行验证。

但是对于Mac OS,SKPaymentTransaction没有任何transactionReceipt属性,因此我们无法以相同方式验证收据。

我们可以

生产非消耗性产品,这可能会对您有所帮助。在Mac OS上进行应用内购买时,收据会在应用捆绑包中更新。然后可以解析收据文件以查找每个应用程序内收据,这些都存储在主捆绑包的收据文件中。有关更多信息,请参见http://developer.apple.com/library/mac/#releasenotes/General/ValidateAppStoreReceipt/_index.html

当我使用非消耗性产品时,这对我来说很好用,但是我有一个消耗品,并且它已not更新为应用程序的收据文件。没有transactionReceipt属性,我的服务器看不到任何方法来验证收据是真实的。如果其他人有其他经验,请告诉我们!

拥有Apple开发人员帐户的任何人都可以在Apple开发人员论坛上阅读有关此内容的信息:https://devforums.apple.com/message/548411#548411

© www.soinside.com 2019 - 2024. All rights reserved.