iOS应用内购买:消费类产品的服务器端收据验证

时间:2018-06-21 10:39:51

标签: ios in-app-purchase receipt-validation

我想为我正在开发的iOS应用实施应用内购买消耗品产品。我要按照documentation中的指示在服务器端验证收据:

  1. 应用启动交易询问苹果商店
  2. Apple Store返回收据到应用程序
  3. 该应用将收据发送到受信任的服务器
  4. 受信任的服务器通过HTTP POST将收据(基本64格式)发送到Apple Store
  5. Apple Store通过验证回复HTTP POST
  6. 如果验证响应正常,则可以启用购买

我担心以下情况:用户购买产品,苹果商店将收据发回给应用程序(步骤1,2)。然后,当应用尝试将收据发送到受信任的服务器时(步骤3),连接断开。在这种情况下,必须在第二次重试收据验证,但是,我有以下问题:

a)在这种情况下,用户是否已经为产品付款?
b)由于消费产品compare only at the time of the purchase的收据,应如何管理验证重试?我是否应该将收据保存在本地以便将来转发? 我可以简单地不将交易标记为“ 完成”吗?根据我阅读文档的了解,在这种情况下,StoreKit应该再次调用事务队列观察器(再次传递收据?),直到该事务标记为“完成”,对吗?

提前谢谢

1 个答案:

答案 0 :(得分:1)

a),在这种情况下,用户是否已经为产品付款?

PaymentTransaction观察器将告诉您 .Purchased (购买) .Purchasing.Failed 的状态。等等。

因此,从您的问题中我们可以假定用户的状态是.Purchased ,并且您已经收到付款。  现在,由于他们已收到收据,并且希望从实际购买中获得回执,因此他们将等待您在服务器上进行验证并解锁购买,因为他们已收到包含有关其购买数据的收据。

b)由于消耗品的收据仅在购买时进行比较,应如何管理验证重试?我是否应该将收据保存在本地以便将来转发?我可以简单地不将交易标记为“完成”吗?根据我阅读文档的了解,在这种情况下,StoreKit应该再次调用事务队列观察器(再次传递收据?),直到该事务标记为“完成”,对吗? >

您不需要将其存储在本地,在收据中存储着有关购买的信息。这将一直保留到您的PaymentObserver完成交易或收据再次刷新/更新为止。  您的应用将一直尝试与您的服务器进行验证,直到通常在用户再次启动该应用时,它收到有关收据的响应, 到那时,如果我们认为它是有效的,则启用您的产品,然后在此之后在SKPaymentQueue上完成交易。

在文档中提示

“消费产品的应用程序内购买收据会在购买时添加到收据中。它会保留在收据中,直到您的应用完成该交易为止。之后,下次更新收据时会将其从收据中删除。

https://developer.apple.com/library/archive/releasenotes/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html#//apple_ref/doc/uid/TP40010573-CH106-SW1

也: “例如,考虑用户在进入隧道之前立即在您的应用中购买商品的情况。您的应用无法传递购买的内容,因为没有网络连接。下次启动应用程序时,StoreKit会再次调用您的事务队列观察器,并在那时交付购买的内容。同样,如果您的应用程序无法将事务标记为已完成,则每次启动应用程序时,StoreKit都会调用观察程序,直到事务正确完成为止。”

我希望这会有所帮助,并希望它能回答您的问题。