KMInAppPurchaseManager.swift 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. //
  2. // KMInAppPurchaseManager.swift
  3. // PDF Master
  4. //
  5. // Created by lizhe on 2023/6/1.
  6. //
  7. import Cocoa
  8. import StoreKit
  9. import AuthenticationServices
  10. class KMInAppPurchaseManager: NSObject {
  11. public static let manager = KMInAppPurchaseManager()
  12. var availableProducts: [SKProduct] = []
  13. override init() {
  14. super.init()
  15. // 注册购买交易观察者
  16. SKPaymentQueue.default().add(self)
  17. }
  18. func fetchProducts() {
  19. let productIdentifiers: Set<String> = ["com.yourapp.product1", "com.yourapp.product2"]
  20. let request = SKProductsRequest(productIdentifiers: productIdentifiers)
  21. request.delegate = self
  22. request.start()
  23. }
  24. func purchaseProduct(productIdentifier: String) {
  25. guard let product = availableProducts.first(where: { $0.productIdentifier == productIdentifier }) else {
  26. // 未找到匹配的产品
  27. return
  28. }
  29. let payment = SKPayment(product: product)
  30. SKPaymentQueue.default().add(payment)
  31. }
  32. }
  33. extension KMInAppPurchaseManager: SKProductsRequestDelegate {
  34. func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
  35. availableProducts = response.products
  36. // 处理产品信息
  37. }
  38. func request(_ request: SKRequest, didFailWithError error: Error) {
  39. // 处理请求错误
  40. }
  41. }
  42. extension KMInAppPurchaseManager: SKPaymentTransactionObserver {
  43. func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
  44. for transaction in transactions {
  45. switch transaction.transactionState {
  46. case .purchased:
  47. // 购买成功,进行本地二次验证
  48. validatePurchase(transaction: transaction)
  49. case .failed:
  50. // 购买失败,处理错误
  51. handleError(transaction: transaction)
  52. case .restored:
  53. // 恢复购买,进行本地二次验证
  54. validatePurchase(transaction: transaction)
  55. default:
  56. break
  57. }
  58. }
  59. }
  60. func validatePurchase(transaction: SKPaymentTransaction) {
  61. // 获取购买凭证
  62. if let receiptURL = Bundle.main.appStoreReceiptURL,
  63. let receiptData = try? Data(contentsOf: receiptURL) {
  64. // 进行本地二次验证
  65. if let parsedReceipt = parseReceipt(receiptData: receiptData),
  66. let purchase = parsedReceipt["in_app"] as? [[String: Any]],
  67. let matchingPurchase = purchase.first(where: { $0["transaction_id"] as? String == transaction.transactionIdentifier }) {
  68. // 验证购买凭证,进行相应的处理
  69. if verifyPurchase(purchase: matchingPurchase) {
  70. // 购买凭证验证成功,进行购买成功的逻辑
  71. SKPaymentQueue.default().finishTransaction(transaction)
  72. // ...
  73. } else {
  74. // 购买凭证验证失败,进行购买失败的逻辑
  75. SKPaymentQueue.default().finishTransaction(transaction)
  76. // ...
  77. }
  78. }
  79. }
  80. }
  81. func handleError(transaction: SKPaymentTransaction) {
  82. // 处理购买失败的逻辑
  83. SKPaymentQueue.default().finishTransaction(transaction)
  84. // ...
  85. }
  86. func verifyPurchase(purchase: [String: Any]) -> Bool {
  87. // 执行购买凭证验证的逻辑,例如验证产品标识符、购买日期等
  88. // 如果验证成功返回 true,否则返回 false
  89. // ...
  90. return true
  91. }
  92. func parseReceipt(receiptData: Data) -> [String: Any]? {
  93. guard let receipt = try? JSONSerialization.jsonObject(with: receiptData, options: []) as? [String: Any] else {
  94. return nil
  95. }
  96. return receipt
  97. }
  98. }