ApplePayManager.swift 5.5 KB

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