【问题标题】:iOS In-App Purchase (Consumable) - Server TimeoutiOS 应用内购买(消耗品)- 服务器超时
【发布时间】:2012-06-27 12:19:18
【问题描述】:

我对应用内购买的特定情况有疑问。

我们的应用中有一个用于购买硬币的消耗品:

  • 使用通过 IAP 购买 0.99 美元的硬币包
  • 我们向我们的服务器发送请求以记录购买并将硬币添加到他们的帐户(这些硬币在多个设备之间共享,我们的服务器在此处完成工作)
  • 完成 IAP 交易

问题是,如果对我们服务器的请求超时或失败,我们应该怎么做?用户花了钱,但永远不会得到硬币。如果他们在那个时候再次尝试购买,它会给他们一个错误,说购买尚未下载。

我看到了“恢复交易”选项,但不知道如何在此处应用它。我宁愿在应用程序的某个地方没有按钮。

别担心这个应用程序还没有发布,这个应用程序是用 MonoTouch 用 C# 编写的,但是欢迎使用 Objective-C 的答案。

【问题讨论】:

  • 也许会生成一个交易ID?如果应用程序检测到最近尝试了一笔交易并且您的服务器没有交易 ID 的记录,则将购买添加到服务器。从技术上讲,这将是“可破解的”,因此我建议使用种子随机数生成器,您可以验证它是由您创建的,而不是用户创建的。
  • 是否有“苹果建议”的方式来解决这个问题?我想我可以保存购买信息并在应用打开时恢复。
  • 感觉最近读到了这方面的东西,看看能不能找到。
  • Apple 建议使用 restoreCompletedTransactions 方法。我假设您在收到付款后存储交易已“完成”。
  • 我相信 restoreCompletedTransactions 方法不会起作用,因为您不想每次在新设备上安装程序时都向用户提供信用。将购买信息保存在设备上的某个位置,并尝试尽快将请求重新发送到您的服务器。

标签: c# objective-c ios xamarin.ios in-app-purchase


【解决方案1】:

恢复交易就可以了。它只是再次重新下载购买。看看这里的第五个帖子:

http://monogame.codeplex.com/discussions/359109

下面是实现它的代码:

InAppPurchaseManager > MySKPaymentObserver:

    public override void PaymentQueueRestoreCompletedTransactionsFinished (SKPaymentQueue queue)
        {
            foreach(SKPaymentTransaction transaction in queue.Transactions)
            {

                #if DEBUG
                Console.WriteLine("Restoring Transaction " + transaction.Payment.ProductIdentifier);
                #endif
                theManager.restoreTransaction(transaction);
            }
        }

以下是如何在游戏中调用代码:

 app = new InAppPurchaseManager ();
 app.LoadStore();
 SKPaymentQueue.DefaultQueue.RestoreCompletedTransactions();

【讨论】:

  • 这是否适用于购买消耗品?我不认为它会,听起来可以通过按下恢复按钮获得免费硬币。
【解决方案2】:

我所做的方法是在 NSUserDefaults 中保存失败的事务。因此,每次应用程序来自后台时,它都会检查任何失败交易的用户默认设置,然后再次重试。

我不确定它是否正确。但是,我想知道是否有更好的方法。

【讨论】:

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