但是,我开始觉得像this StackOverflow user.
完成交易后,我想发送给用户在应用程序中购买耗材的服务器.但是,连接可能会在此时失败(服务器关闭或用户丢失连接).
在这种情况下,我正在考虑在可以再次进行连接后立即发送收据.但是,从I have read the receipt contains all in app purchases和我不能只发送最后一个购买的物品的收据.
如何确保用户的购买与服务器同步?
解决方法
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
在消费品购买之前,直到它与服务器同步.这样,每次设置观察付款队列时,交易将再次发送给您的观察员.无论是已经交付但未被同步的购买,还是新的购买,您都需要管理应用程序.
一旦与服务器同步了事务.你可以调用-finishTransaction:.请参阅文档中的“完成交易”:
编辑
所以用户由苹果收费,而苹果向您发送一个代表该事务的SKPaymentTransaction对象.如果该事务的transactionState属性是SKPaymentTransactionStatePurchased,那么这意味着苹果已经处理了付款,用户已经收费.
从paymentQueue收到此SKPaymentTransaction对象后,您将内容传递给用户,并将事务与服务器同步.一旦这两个成功完成,您将调用-finishTransaction.调用-finishTransaction告诉StoreKit你已经成功完成了你需要做的一切. -finishTransaction是一个同步调用,您将责任转交给StoreKit,您不必担心自己如何传回iTunes / Apple,StoreKit可以为您处理所有这些.
在你完成你需要做的一切之前,你不应该调用-finishTransaction.如果出现问题(设备电池死机,互联网连接丢失,应用程序崩溃),您的观察员在队列中注册后,您将从付款队列中提供相同的SKPaymentTransaction,并可以尝试再次与您的服务器同步.这将持续发生,直到你调用-finishTransaction.
有一种情况,用户永远无法与您的服务器同步,从不再次连接到互联网.这是无法控制的,在这一点上,苹果有责任决定是否向用户收费.
同样值得注意的是,用户可以联系苹果并要求退款.