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

7
对于iOS应用内购买,我们可以使用在线API进行验证,这意味着我们可以在自己的服务器上验证购买。
是否有任何适用于OS X应用内购买验证的方式(API)?
我只发现了有关Mac应用内验证的代码片段,似乎Apple没有提供任何在线验证的API。
或者,苹果是否有计划支持OS X的在线验证?
2个回答

9

我的应用EasyBooks提供一个在线组件,用户每年需要付费。将其设置为非消耗性类型没有意义,因为它只能作为可消耗品使用(虽然在iOS中它实际上是非重复订阅)。我想在应用内提供这个功能,我认为我终于有了解决方案...

我使用了我的一个苹果DTS票据来查询StoreKitGuide文档中的一项声明。它说...

"OS X支持本章描述的服务器验证方法和本地验证方法..."

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

“验证Mac应用程序内购买产品的步骤与iOS应用程序相同。不同之处在于您将分配您的base64编码的应用程序收据(而不是transactionReceipt属性的内容)到receipt-data字段。检索您的应用程序的完整Mac App Store收据,然后使用base64编码对其进行编码。创建一个名为receipt-data的单个键的JSON对象,并将编码的收据分配给它。按照In-App Purchase编程指南中的验证应用商店收据部分的说明进行操作。”
“注意:应用内购买收据包含在相关联的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"} ]}}

我还没有确认,但显然(根据苹果工程师)任何可消耗类型的应用内购买将在首次购买时添加到收据中,但在任何进一步购买或恢复操作后将被删除。我想知道是否有必要让应用程序的代码在每次购买后都复制一份收据文件,以防我们自己的服务器在应用程序尝试验证收据时宕机。否则用户可能会尝试恢复购买,却不知道这将删除任何可消耗产品收据。
希望这有所帮助。
(原始评论如下)
我有同样的问题。我有一个在应用商店中的iOS应用程序,其中混合了可消耗和非可消耗产品,可以在应用程序内购买。可消耗产品是一项服务,由我的Web服务器实现。在StoreKit委托方法paymentQueue:updatedTransactions:中,我使用transactionReceipt属性,它是一个NSData对象。我对此进行base64编码并将其发送到服务器。在服务器上,我将收据传递给苹果的服务器进行验证。
但对于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,你有找到一种验证服务器上应用内可消耗购买收据的方法吗?我也需要这样做,但一直在寻找解决方案。 - JonF
1
嗨Jon,抱歉我没能及时看到这个评论。不,我仍然没有验证MAS消耗品的方法。我的计划是为在线服务提供供应,但现在我选择不提供应用内购买选项,而是使用Fastspring作为支付网关,该网关会向我的服务器发送签名通知。希望这有所帮助。 - Mathew Waters
@MathewWaters 你好,是否可以/允许使用消耗品来模拟Mac OSX中的非可续订应用内订阅。如果不行,是否允许将应用重定向到Web视图/浏览器进行付款? - Nitin
抱歉@Nitin,我刚看到你的评论。是的,实际上这就是我在Mac版Easy Books中所做的。请注意,可消耗品不像非消耗品那样恢复到其他设备上。 - Mathew Waters
@MathewWaters 你好,有一种验证 Mac OSX 中购买的方式吗?谢谢。 - CReaTuS

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接