ApplePayManager.swift 6.1 KB

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