如何获取订阅的原始交易收据?

Posted

技术标签:

【中文标题】如何获取订阅的原始交易收据?【英文标题】:How to get the original transaction receipt for a subscription? 【发布时间】:2013-10-04 09:27:51 【问题描述】:

在我的应用程序中,我尝试实现“恢复购买”按钮,但我不知道如何获取订阅的最新购买收据。我只有一个 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

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

【问题讨论】:

为什么需要完整的收据?我认为购买日期可以满足您的需求。 因为我需要在我的服务器上验证收据以判断它是否处于活动状态。 我也遇到了同样的问题。我想得到最新的收据。如果交易处于待处理状态,我们会在收据中显示什么内容? 【参考方案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) 

目标-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 包含最新的编码收据,与值相同 对于请求中的收据数据,latest_receipt_info 包含所有 订阅的交易,包括初始购买 以及随后的续订,但不包括任何恢复。

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

更多详情请查看here。

【讨论】:

以上是关于如何获取订阅的原始交易收据?的主要内容,如果未能解决你的问题,请参考以下文章

如何从MKStoreKit获取交易ID和收据?

如何更新自动更新订阅收据

非续订订阅恢复

无法获取用户安装的原始应用程序版本(收据验证)?

PAYMENT.SALE.COMPLETED webhook 事件中的 PayPal 订阅 ID 和交易 ID 在哪里?如何获取他们的详细信息?

如何从PayPal API获取“订阅已取消”的信息 - GetTransactionDetails