【问题标题】:How to use a single appStoreReceiptURL to verify multiple StoreKit transactions?如何使用单个 appStoreReceiptURL 来验证多个 StoreKit 交易?
【发布时间】:2016-01-05 21:57:35
【问题描述】:

我们正在使用服务器端验证来验证我们在应用程序中购买的 iTunes。当交易发送到 SKPaymentTransactionObserver 时,我们会从 appStoreReceiptURL 获取收据以进行验证。

if let receiptPath = NSBundle.mainBundle().appStoreReceiptURL?.path where
    NSFileManager.defaultManager().fileExistsAtPath(receiptPath),
    let receiptData = NSData(contentsOfURL:NSBundle.mainBundle().appStoreReceiptURL!) {
    return receiptData
}

但在某些情况下,比如我们在恢复购买时,接收到多个交易的方法:

public func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction])

使用相同的收据数据来验证每笔交易似乎很奇怪。单张收据是否包含有关每笔交易的数据?

【问题讨论】:

    标签: ios swift in-app-purchase storekit


    【解决方案1】:

    单张收据是否包含有关每笔交易的数据?

    是的。从appStoreReceiptURL 访问的收据是用户和应用的所有可持久交易的单一收据。

    Docs on In-app purchase receipt

    消费产品的应用内购买收据会在购买时添加到收据中。它会保存在收据中,直到您的应用完成该交易。在此之后,它会在下次更新收据时从收据中删除 - 例如,当用户进行另一次购买或您的应用显式刷新收据时。

    非消耗品、自动续订订阅、非续订订阅或免费订阅的应用内购买收据将无限期保留在收据中。

    即所有应用内购买(包括订阅续订和恢复购买以及已消费购买除外)都会创建新交易并存储在收据中。

    Docs on Working with Subscriptions:

    订阅成功续订后,Store Kit 将续订交易添加到交易队列中。您的应用会在启动时检查事务队列,并以与任何其他事务相同的方式处理续订。

    Docs on Restoring Purchased Products:

    恢复已完成的交易会为用户进行的每个已完成交易创建一个新交易。

    请注意,original transaction id 将与恢复购买和订阅续订相同。

    收据本质上是存储在设备上的文件,应用程序会在添加新交易时更新该文件。

    【讨论】:

    • 在相关说明中,我们如何跨设备跟踪自动续订订阅?也就是说,如果用户在 iPad 上购买了订阅,他们会在 iPhone 上获得更新的交易吗?还是他们必须恢复购买?
    • 您需要提供恢复购买选项(无论如何这是苹果的要求)。恢复后,新设备上的应用程序将有收据。
    • 示例:由于打开应用程序后的连接问题,我在队列中有 3 笔购买的交易(消耗品)。我遍历所有 3 个并向我的服务器发送请求以验证收据,其中收据来自 mainBundle().appStoreReceiptURL。问题是 AppStore 告诉我产品 ID 不正确。我做错了吗?
    猜你喜欢
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    相关资源
    最近更新 更多