将附加数据附加到消耗品

Attach additional data to consumable

我正在构建一个允许购买数字商品的应用程序。由于我们有很多可用的物品,我们不能使用非消耗品,因此我们为不同的价格类别(2 欧元物品、3 欧元物品等)定义消耗品。

当用户想要购买特定商品时,我会获取该特定价格类别的消耗品,然后开始购买该消耗品。然后我想将收据发送到我的服务器,验证它,并解锁有问题的项目。

这里是我不确定如何实施的地方。要获取交易收据,我需要监听 PaymentQueue,因此我可以异步获取收据,并且没有实际购买的上下文。

如何将收据与用户购买的商品相关联?

据我所知,有两种选择:

  1. 将数据附加到我的购买,我可以从收据上读出。 这可能吗?那将是理想的情况。
  2. 存储用户开始购买的商品 ID 列表,当我从队列中收到收据(或许多收据)时,我只需查找商品 ID,然后将它们发送到我的服务器。购买完成后,我从列表中删除商品 ID。这是一个可行的解决方案吗?多个设备会不会有任何问题,一个设备虽然没有发起付款但会收到收据?

我刚刚在我的应用程序中遇到了同样的问题。以下是我的处理方式:

  1. Attach data to my purchase, that I can read out of the receipt. Is that possible? That would be the ideal scenario.

您可能已经发现,这是不可能的。

  1. Store a list of item ids the user started buying, and when I get a receipt (or many receipts) from my queue, I simply look up the item ids, and send them along to my server. When the purchase is finished, I remove the item id from my list. Is this a viable solution? Can there be any problem with multiple devices, where a device gets a receipt although it didn't initiate the payment?

这与我所做的非常相似。每当用户进行购买时,我都会创建自己的购买对象,并将其添加到用户默认值中的数组中。我的付款对象包含 App Store Connect 产品标识符以及我的应用特定产品信息。

当 PaymentQueue 收到收据时,我执行以下操作:

  1. 在用户默认值中查找具有匹配 product_identifier 的第一个付款对象。
  2. 从 PaymentQueue 中删除支付对象。请注意,PaymentQueue 可以接收一系列交易。
  3. 对于每个 object/transaction 对,发送到我的服务器进行验证和处理
  4. 如果一切顺利,完成交易
  5. 如果我这边出现问题,我会重新将支付对象添加到用户默认值并且不完成交易

我在 Sandbox 中测试时确实遇到了一些奇怪的行为,我会看到旧收据也出现在 PaymentQueue 中。在这种情况下,User Defaults 中没有匹配的对象,所以我还是完成了交易。