2011-09-29 106 views
4

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

是否有任何方式(API)用于OSX应用程序购买的此类验证?

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

或者可能有来自苹果的一些计划,以支持OSX联机验证...

回答

7

(编辑整理2012年9月11)

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

我用我的Apple DTS票据之一来查询StoreKitGuide文档中所做的声明。它说...

“OS X支持此 章和本地验证方法中描述的两个服务器验证方法...”

我得到回复苹果说...

“来检查应用程序内购买的产品适用于Mac的步骤 应用程序所使用的相同的iOS应用程序。不同的是,你将被赋予您的基本64位编码的应用收据(而非的内容交易收据属性)到收据数据字段。为您的应用程序检索完整的Mac App Store收据,然后使用base64编码对其进行编码。使用名为receipt-data的单个密钥创建JSON对象,并将编码后的收据分配给它。按照“应用内购买编程指南”中的“使用应用程序商店验证收据”部分所述进行操作。

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

所以经过一些失败的尝试,我还是设法得到需要提醒的是由苹果的服务器返回的收据数据不包含“该工作该GUID”,因此哈希没有收到数据绑定到任何特定的硬件

这可以在Mac上很容易地使用这些步骤进行测试:

  1. 查找Mac应用程序收到文件(这是在你的应用程序包中,一旦你运行了应用程序并输入你的(te st)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属性,我看不到任何方式让我的服务器验证收据是真实的。如果其他人有任何其他经验,请让我们知道!

**添加2011-10-7 ** 任何拥有苹果开发者账号也可以阅读这在苹果开发者论坛: https://devforums.apple.com/message/548411#548411

+0

马修,是你永远能够找到一种方法来验证收据在服务器上购买应用程序中的消耗品?我也需要这样做,一直在努力寻找解决方案 – JonF

+1

嗨乔恩,对不起,我没有看到这个评论更快。不,我仍然无法验证MAS耗材。 Mine将提供在线服务,但我现在选择不提供它作为应用程序内购买选项,而是使用Fastspring作为支付网关,将签名通知发送给我的服务器。希望有所帮助。 –

+0

@MathewWaters嗨,是否有可能/允许使用易耗品来模仿mac osx中的应用程序订阅中的不更新。如果没有,它是否允许将应用重定向到webview /浏览器进行支付? – Nitin