【问题标题】:iOS In-app purchase: server side receipt validation for consumable productsiOS 应用内购买:消耗品的服务器端收据验证
【发布时间】:2018-11-30 15:58:01
【问题描述】:

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

  1. 向 Apple Store 请求应用启动事务
  2. Apple Store 应用程序回执收据
  3. 应用将收据发送到受信任的服务器
  4. 受信任的服务器通过 HTTP POST 向 Apple Store 发送收据(base 64 格式)
  5. Apple Store 通过验证回复 HTTP POST
  6. 如果验证响应正常,则可以启用购买

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

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

提前谢谢你

【问题讨论】:

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


    【解决方案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 会在您的应用每次启动时调用观察者,直到事务正确完成。”

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多