在应用购买中验证

时间:2010-01-18 19:49:11

标签: iphone in-app-purchase

我正在构建一个iPhone应用程序,应该通过In App Purchase来处理订阅。当我在我的应用程序中从Apple收到回执时,我想将收据保存在我自己的服务器上和我的服务器上,我还要验证Apple服务器的收据。与我的服务器建立此连接非常重要,因为这样可以保存稍后将需要的用户信息。

在我的SKPaymentTransactionObserver中,我现在尝试在SKPaymentTransactionStatePurchased上调用我的服务器。问题是,在SKPaymentTransactionStatePurchased上,似乎有一个标准的警告说“谢谢”并且购买已完成。由于应用程序需要一段时间才能联系我的服务器,因此在完成对我的服务器的调用之前会显示此标准警报,如果用户在此处退出应用程序会发生什么情况,他认为购买已完成,因为它已经完成了?我何时应该联系我的服务器?如果我想在完成对服务器的调用时为用户显示警报,我该怎么做?

这是我正在使用的代码:

//This is called on "SKPaymentTransactionStatePurchased"
- (void) completeTransaction: (SKPaymentTransaction *)transaction
{
    [self saveAndVerifyOnServer:transaction];
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

2 个答案:

答案 0 :(得分:2)

这是SKPaymentQueue关于finishTransaction方法的文档:

  

您的申请应该致电   finishTransaction:只有在它之后   成功处理了交易   并解锁了功能   由用户购买。

由此,我认为您需要在服务器上保存并验证交易,并且只有在确认时才调用finishTransaction方法。院长指出,您需要在用户验证之前满足用户退出的情况。

好消息是SKPaymentQueue会话持续存在,所以它会记住你还没有买完东西。这意味着下次添加事务观察器时,您可以立即在您的委托中进行调用。您可能需要对服务器进程进行编码,以便它可以重新启动事务。

答案 1 :(得分:0)

您可以立即将购买内容存储在应用中(仅限NSUserDefaults),直到您成功与服务器通信为止。

当您的服务器回复给您时,请从NSUserDefaults中删除密钥。

如果应用程序在服务器返回给您之前退出,则下次启动时密钥仍将在NSUserDefaults中,然后您可以发送购买。

萨姆

PS请记得致电[[NSUserDefaults standardUserDefaults] synchronize]以确保您的密钥被写入!

PPS您需要以某种方式防止多次购买。可能是应用程序生成的某种独特密钥。