ApplePayManager.swift 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. //
  2. // ApplePayManager.swift
  3. // Pods
  4. //
  5. // Created by Mac 3 on 2025/1/20.
  6. //
  7. import StoreKit
  8. class ApplePayManager: NSObject {
  9. static let shared = ApplePayManager()
  10. private var completion: ((Bool, String?) -> Void)?
  11. var appleGoodId = ""
  12. var appleAccountToken = ""
  13. var isCheck: Bool = false
  14. // 是否正在恢复
  15. var isPaying: Bool = false
  16. // 是否正在恢复
  17. var isRestoring: Bool = false
  18. override init() {
  19. super.init()
  20. SKPaymentQueue.default().add(self)
  21. }
  22. deinit {
  23. SKPaymentQueue.default().remove(self)
  24. }
  25. }
  26. extension ApplePayManager {
  27. @available(iOS 15.0.0, *)
  28. func check(appleId: String) async -> Bool {
  29. print("检查自动续费订单及是否存在试用资格")
  30. SKPaymentQueue.default().add(self)
  31. self.isCheck = true
  32. do {
  33. // 获取产品信息
  34. let productIds = [appleId]
  35. let products = try await Product.products(for: Set(productIds))
  36. // 检查第一个产品的试用资格
  37. if let product = products.first {
  38. return await product.subscription?.isEligibleForIntroOffer ?? false
  39. }
  40. return false
  41. } catch {
  42. print("Error checking trial eligibility: \(error)")
  43. return false
  44. }
  45. }
  46. // 开始支付
  47. func startPay(appleId: String, token: String, complete: ((Bool, String?) -> Void)?) {
  48. self.isPaying = true
  49. self.isCheck = false
  50. // 支付前查询自动续费的订单,将订单置为支付状态
  51. let transactions = SKPaymentQueue.default().transactions
  52. if transactions.count > 0 {
  53. for tran in transactions {
  54. if tran.transactionState == .purchased {
  55. SKPaymentQueue.default().finishTransaction(tran)
  56. }
  57. }
  58. }
  59. appleGoodId = appleId
  60. appleAccountToken = token
  61. completion = complete
  62. self.submitIAP()
  63. }
  64. func restoreAction(complete: ((Bool, String?) -> Void)?) {
  65. // 支付前查询自动续费的订单,将订单置为支付状态
  66. let transactions = SKPaymentQueue.default().transactions
  67. if transactions.count > 0 {
  68. for tran in transactions {
  69. if tran.transactionState == .purchased {
  70. SKPaymentQueue.default().finishTransaction(tran)
  71. }
  72. }
  73. }
  74. self.isPaying = false
  75. self.isCheck = false
  76. self.isRestoring = false
  77. self.completion = complete
  78. print("开始恢复订阅")
  79. SKPaymentQueue.default().restoreCompletedTransactions()
  80. }
  81. }
  82. extension ApplePayManager: SKPaymentTransactionObserver {
  83. // 提交内购
  84. func submitIAP() {
  85. if SKPaymentQueue.canMakePayments() {
  86. let payment = SKMutablePayment()
  87. payment.productIdentifier = self.appleGoodId
  88. payment.applicationUsername = self.appleAccountToken
  89. payment.quantity = 1
  90. SKPaymentQueue.default().add(payment)
  91. }
  92. }
  93. // 恢复订阅
  94. func restoreOrder(transaction: SKPaymentTransaction) {
  95. if isRestoring { return }
  96. if let receiptUrl = Bundle.main.appStoreReceiptURL {
  97. let receiptData = try? Data(contentsOf: receiptUrl)
  98. if let receiptString = receiptData?.base64EncodedString(options: .endLineWithLineFeed) {
  99. debugPrint("receiptString = \(String(describing: receiptString))")
  100. if let completion = self.completion {
  101. isRestoring = true
  102. completion(true, receiptString)
  103. }
  104. }
  105. }
  106. }
  107. func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
  108. print("监听AppStore支付状态 updatedTransactions")
  109. // if !self.isPaying { return }
  110. DispatchQueue.main.async {
  111. for tran in transactions {
  112. switch tran.transactionState {
  113. case .purchased:
  114. print("商品已苹果支付成功")
  115. if self.isPaying {
  116. if let receiptUrl = Bundle.main.appStoreReceiptURL {
  117. let receiptData = try? Data(contentsOf: receiptUrl)
  118. if let receiptString = receiptData?.base64EncodedString(options: .endLineWithLineFeed), let completion = self.completion {
  119. completion(true, receiptString)
  120. }
  121. }
  122. } else {
  123. if let completion = self.completion {
  124. completion(false, "")
  125. }
  126. }
  127. SKPaymentQueue.default().finishTransaction(tran)
  128. case .purchasing:
  129. print("正在购买中,商品已添加进列表")
  130. case .restored:
  131. print("恢复订阅")
  132. self.restoreOrder(transaction: tran)
  133. SKPaymentQueue.default().finishTransaction(tran)
  134. case .failed:
  135. SKPaymentQueue.default().finishTransaction(tran)
  136. if let completion = self.completion {
  137. completion(false, "")
  138. }
  139. case .deferred:
  140. print("未确定")
  141. if let completion = self.completion {
  142. completion(false, "")
  143. }
  144. default:
  145. if let completion = self.completion {
  146. completion(false, "")
  147. }
  148. break
  149. }
  150. }
  151. }
  152. }
  153. func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error) {
  154. print("恢复购买失败\(error.localizedDescription)")
  155. }
  156. }