// // KMInAppPurchaseManager.swift // PDF Master // // Created by lizhe on 2023/6/1. // import Cocoa import StoreKit import AuthenticationServices class KMInAppPurchaseManager: NSObject { public static let manager = KMInAppPurchaseManager() var availableProducts: [SKProduct] = [] override init() { super.init() // 注册购买交易观察者 SKPaymentQueue.default().add(self) } func fetchProducts() { let productIdentifiers: Set = ["com.yourapp.product1", "com.yourapp.product2"] let request = SKProductsRequest(productIdentifiers: productIdentifiers) request.delegate = self request.start() } func purchaseProduct(productIdentifier: String) { guard let product = availableProducts.first(where: { $0.productIdentifier == productIdentifier }) else { // 未找到匹配的产品 return } let payment = SKPayment(product: product) SKPaymentQueue.default().add(payment) } func startInAppPurchase() { let productIdentifier = "your_product_identifier" if SKPaymentQueue.canMakePayments() { if let product = availableProducts.first(where: { $0.productIdentifier == productIdentifier }) { let payment = SKPayment(product: product) SKPaymentQueue.default().add(payment) } else { // 未找到匹配的产品 } } else { // 用户无法进行内购 } } } extension KMInAppPurchaseManager: SKProductsRequestDelegate { func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { availableProducts = response.products // 处理产品信息 } func request(_ request: SKRequest, didFailWithError error: Error) { // 处理请求错误 } } extension KMInAppPurchaseManager: SKPaymentTransactionObserver { func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { for transaction in transactions { switch transaction.transactionState { case .purchased: // 购买成功,进行本地二次验证 validatePurchase(transaction: transaction) case .failed: // 购买失败,处理错误 handleError(transaction: transaction) case .restored: // 恢复购买,进行本地二次验证 validatePurchase(transaction: transaction) default: break } } } func validatePurchase(transaction: SKPaymentTransaction) { // 获取购买凭证 if let receiptURL = Bundle.main.appStoreReceiptURL, let receiptData = try? Data(contentsOf: receiptURL) { // 进行本地二次验证 if let parsedReceipt = parseReceipt(receiptData: receiptData), let purchase = parsedReceipt["in_app"] as? [[String: Any]], let matchingPurchase = purchase.first(where: { $0["transaction_id"] as? String == transaction.transactionIdentifier }) { // 验证购买凭证,进行相应的处理 if verifyPurchase(purchase: matchingPurchase) { // 购买凭证验证成功,进行购买成功的逻辑 SKPaymentQueue.default().finishTransaction(transaction) // ... } else { // 购买凭证验证失败,进行购买失败的逻辑 SKPaymentQueue.default().finishTransaction(transaction) // ... } } } } func handleError(transaction: SKPaymentTransaction) { // 处理购买失败的逻辑 SKPaymentQueue.default().finishTransaction(transaction) // ... } func verifyPurchase(purchase: [String: Any]) -> Bool { // 执行购买凭证验证的逻辑,例如验证产品标识符、购买日期等 // 如果验证成功返回 true,否则返回 false // ... return true } func parseReceipt(receiptData: Data) -> [String: Any]? { guard let receipt = try? JSONSerialization.jsonObject(with: receiptData, options: []) as? [String: Any] else { return nil } return receipt } }