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

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

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

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

据我所知,有两种选择:

  • 将数据附加到我的购买中,以便我可以从收据中读出。那可能吗?那将是理想的情况。
  • 存储用户开始购买的商品ID的列表,当我从队列中获得收据(或许多收据)时,我只需查找商品ID,然后将其发送到我的服务器即可。购买完成后,我从列表中删除了商品ID。这是可行的解决方案吗?多台设备可能没有任何问题,即使没有启动付款,设备仍会收到收据?
  • 最佳答案

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



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



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

    当收款队列中有收据时,我将执行以下操作:

  • 在“用户默认值”中查找具有匹配product_identifier的第一个付款对象。
  • 从PaymentQueue中删除付款对象。请注意,PaymentQueue可以接收一系列交易。
  • 对于每个对象/事务对,发送到我的服务器以进行验证和处理
  • 如果一切顺利,请完成事务
  • 如果最后出了点问题,我将付款对象重新添加到“用户默认设置”,而不完成交易

  • 在沙盒中进行测试时,我确实出现了一些奇怪的行为,在该系统中,我也看到旧的收据也出现在PaymentQueue上。在这种情况下,“用户默认值”中没有匹配的对象,因此无论如何我都要完成交易。

    10-04 22:48