1

在我的应用程序中,我正在尝试实现“恢复购买”按钮,但我不知道如何获取订阅的最新购买收据。我只有一个 SKProduct,一个可自动更新的订阅。

我只需要获取最新的收据并将其发送到服务器进行验证。

我试过这个:

- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {
        for (SKPaymentTransaction *transaction in queue.transactions) {
            if (transaction.transactionState == SKPaymentTransactionStatePurchasing) {
                NSLog(@"Purchasing");
            }
            if (transaction.transactionState == SKPaymentTransactionStatePurchased) {
                NSLog(@"Purchasing");
            }
            if (transaction.transactionState == SKPaymentTransactionStateRestored) {
                NSLog(@"Restored");
            }
            if (transaction.transactionState == SKPaymentTransactionStateFailed) {
                NSLog(@"Failed");
            }
        }
}

但我得到了这个:

2013-10-04 12:21:48.994 App[5289:60b] Purchasing
2013-10-04 12:21:48.995 App[5289:60b] Purchasing
2013-10-04 12:21:48.996 App[5289:60b] Purchasing
2013-10-04 12:21:48.996 App[5289:60b] Purchasing
2013-10-04 12:21:48.997 App[5289:60b] Purchasing
2013-10-04 12:21:48.998 App[5289:60b] Purchasing
2013-10-04 12:21:48.999 App[5289:60b] Purchasing
2013-10-04 12:21:48.999 App[5289:60b] Purchasing
2013-10-04 12:21:49.000 App[5289:60b] Purchasing
2013-10-04 12:21:49.000 App[5289:60b] Restored
2013-10-04 12:21:49.001 App[5289:60b] Restored
2013-10-04 12:21:49.001 App[5289:60b] Restored

我只需要最新的收据。我怎么能得到那个?问题是,由于某种原因,用户购买了订阅,但未能在我的服务器上验证。为什么它失败了——我不知道。

4

1 回答 1

-1

以下是获取收据的方法:

迅速

获取收据数据 要从设备上的应用程序中获取收据数据,请使用 NSBundle 的 appStoreReceiptURL 方法来定位应用程序的收据,并将数据编码为 Base64。将此 Base64 编码的数据发送到您的服务器。

// Get the receipt if it's available
if let appStoreReceiptURL = Bundle.main.appStoreReceiptURL,
    FileManager.default.fileExists(atPath: appStoreReceiptURL.path) {

    do {
        let receiptData = try Data(contentsOf: appStoreReceiptURL, options: .alwaysMapped)
        print(receiptData)

        let receiptString = receiptData.base64EncodedString(options: [])

        // Read receiptData
    }
    catch { print("Couldn't read receipt data with error: " + error.localizedDescription) }
}

Objective-C

// Load the receipt from the app bundle.
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
if (!receipt) { 
    /* No local receipt -- handle the error. */ 
}
 
/* Read receiptData here... */

对于自动更新订阅项目,解析响应以获取有关当前活动订阅期的信息。验证订阅收据时,latest_receipt 包含最新的编码收据,与请求中的receipt-data 值相同,latest_receipt_info包含订阅的所有交易,包括初始购买和后续续订,但不包含包括任何恢复。

我相信这就是你所需要的。

有关更多详细信息,请查看此处

于 2018-10-19T08:07:49.480 回答