2012-06-27 161 views
3

我对使用应用程序内购买的特定情况有疑问。iOS应用程序内购买(耗材) - 服务器超时

我们必须在我们的应用程序购买金币消耗:

  • 使用购买了$ .99硬币包与IAP
  • 我们发送请求到我们的服务器,记录购买和硬币增加他们的帐户(这些硬币是在多个设备之间共享,我们的服务器在这里所​​做的工作)
  • 的IAP完整的交易

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

我看到一个“恢复事务”选项,但不知道如何在这里应用它。我宁愿没有在应用程序某处的按钮。

不要担心,这个程序尚未发布,而这个应用程序是用C#与MonoTouch的,但Objective-C的答案是受欢迎的。

+0

也许生成一个交易ID?如果应用程序最近检测到事务已被尝试,并且您的服务器没有事务ID的记录,请将购买添加到服务器。从技术上讲,这将是“可破解的”,所以我建议使用可以验证的种子随机数生成器是由您创建的,而不是用户创建的。 – Dustin

+0

有没有“苹果建议”的方式去解决它?我想我可以保存购买信息并在应用程序打开时恢复。 – jonathanpeppers

+0

我觉得我最近读了一些东西,让我看看我能否找到它。 – Dustin

回答

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(); 
+1

这对消费品购买是否正常工作?我认为这不会,它听起来像可以通过按恢复按钮获得免费硬币。 – jonathanpeppers

1

我有办法ne是通过在NSUserDefaults中保存失败的事务。所以,每次应用程序都来自后台时,它会检查用户默认的任何失败的事务,然后再次重试。

我不确定它是否正确。但是,我想知道是否有更好的方法来做到这一点。