针对MAC的应用内购买的在线收据验证

时间:2011-09-29 13:28:42

标签: macos validation in-app-purchase

对于iOS的应用内购买,我们可以使用在线API进行验证 - http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/VerifyingStoreReceipts/VerifyingStoreReceipts.html 这意味着,我们可以在自己的服务器上验证购买。

对于OSX的应用内购买验证有没有办法(API)?

我发现只有关于Mac的应用内验证的这个代码段 - http://developer.apple.com/library/mac/releasenotes/General/ValidateAppStoreReceipt/_index.html#//apple_ref/doc/uid/TP40010573-CH1-SW23,似乎Apple没有为在线验证提供任何API。

或者可能是Apple有一些计划支持OSX的在线验证......

2 个答案:

答案 0 :(得分:7)

(2012年9月11日编辑)

My app提供用户每年支付的在线组件。将它作为非消耗类型提供是没有意义的,因为它只能作为消耗品使用(但它实际上是iOS中的非重复订阅)。我想在应用程序中提供这个,我想最终我有一个解决方案......

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

  

“OS X支持此处描述的服务器验证方法   章节和本地验证方法......“

我得到了Apple的回复说......

  

“验证Mac的应用程序内购买产品的步骤   应用程序与iOS应用程序使用的相同。不同之处在于,您将基本64位编码的应用收据(而不是transactionReceipt属性的内容)分配给receipt-data字段。检索应用程序的完整Mac App Store收据,然后使用base64编码对其进行编码。使用名为receipt-data的单个密钥创建一个JSON对象,并将编码的收据分配给它。按照“应用程序内购买编程指南”中的“使用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

  4. 格式返回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属性,我认为我的服务器无法验证收据是否为正版。如果其他人有任何其他经验,请告诉我们!

    ** 2011年10月5日新增** 拥有Apple开发者帐户的任何人也可以在Apple开发人员论坛上阅读此内容: https://devforums.apple.com/message/548411#548411

答案 1 :(得分:0)

SwiftyStoreKit 很受欢迎:

InAppReceipt 用于本地收据验证: