首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iOS:在app购买Swift成功后如何获取交易id或收据数据

iOS:在app购买Swift成功后如何获取交易id或收据数据
EN

Stack Overflow用户
提问于 2021-06-20 20:15:26
回答 1查看 1.4K关注 0票数 1

我想知道,在一次成功的购买之后,我如何才能获得交易id或收据信息,这样我就可以发送到我的服务器并用于购买验证。同样在这个主题上,我想知道如果由于某种原因,在向服务器发送购买信息之前,连接被中断了,那么我将如何将通知链接到购买订阅的用户呢?

谢谢

因此,我想在下面开关的.purchased部分执行我的处理

代码语言:javascript
运行
复制
import Foundation
import StoreKit

class StoreManager: NSObject, ObservableObject, SKProductsRequestDelegate, SKPaymentTransactionObserver {
    
    //FETCH PRODUCTS
    var request: SKProductsRequest!
    
    @Published var myProducts = [SKProduct]()
    
    func getProducts(productIDs: [String]) {
        print("Start requesting products ...")
        let request = SKProductsRequest(productIdentifiers: Set(productIDs))
        request.delegate = self
        request.start()
    }
    
    func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
        print("Did receive response")
        
        if !response.products.isEmpty {
            for fetchedProduct in response.products {
                DispatchQueue.main.async {
                    self.myProducts.append(fetchedProduct)
                }
            }
        }
        
        for invalidIdentifier in response.invalidProductIdentifiers {
            print("Invalid identifiers found: \(invalidIdentifier)")
        }
    }
    
    func request(_ request: SKRequest, didFailWithError error: Error) {
        print("Request did fail: \(error)")
    }
    
    //HANDLE TRANSACTIONS
    @Published var transactionState: SKPaymentTransactionState?
    
    func purchaseProduct(product: SKProduct) {
        if SKPaymentQueue.canMakePayments() {
            let payment = SKPayment(product: product)
            SKPaymentQueue.default().add(payment)
        } else {
            print("User can't make payment.")
        }
    }
    
    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
            switch transaction.transactionState {
            case .purchasing:
                transactionState = .purchasing
            case .purchased:
                UserDefaults.standard.setValue(true, forKey: transaction.payment.productIdentifier)
                queue.finishTransaction(transaction)
                transactionState = .purchased
            case .restored:
                UserDefaults.standard.setValue(true, forKey: transaction.payment.productIdentifier)
                queue.finishTransaction(transaction)
                transactionState = .restored
            case .failed, .deferred:
                print("Payment Queue Error: \(String(describing: transaction.error))")
                queue.finishTransaction(transaction)
                transactionState = .failed
            default:
                queue.finishTransaction(transaction)
            }
        }
    }
    
    func restoreProducts() {
        print("Restoring products ...")
        SKPaymentQueue.default().restoreCompletedTransactions()
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-20 20:18:22

你可以试试这个-

代码语言:javascript
运行
复制
if let url = Bundle.main.appStoreReceiptURL, 
   let data = try? Data(contentsOf: url) {
      let receiptBase64 = data.base64EncodedString()
      // Send to server
}

更新

想知道,如果连接在接收字符串被发送到我的服务器之前被中断了,并且由于某种原因,用户会在我处理之前删除应用程序或其他东西,那么您会推荐什么呢?

  1. 为一个名为needsToSendPurchaseReceiptToServer的变量在UserDefaults中存储一个true值。在api调用成功完成后,
  2. 将此更新为false。如果API调用失败,请不要更新UserDefaults值。H 212H 113下次从后台启动/或恢复应用程序时,您将检查此标志,如果它仍然是d15,则尝试再次向服务器发送收据。H 216H 117应该不需要向用户提供任何通知。在此情况下多次失败时,H 119<>代码用户仍然应该能够通过Restore Purchase选项手动触发.
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68059703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档