| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- //
- // ApplePayManager.swift
- // Pods
- //
- // Created by Mac 3 on 2025/1/20.
- //
- import StoreKit
- class ApplePayManager: NSObject {
-
- static let shared = ApplePayManager()
-
- private var completion: ((Bool, String?) -> Void)?
-
- var appleGoodId = ""
-
- var appleAccountToken = ""
- var isCheck: Bool = false
- // 是否正在恢复
- var isPaying: Bool = false
- // 是否正在恢复
- var isRestoring: Bool = false
-
- override init() {
- super.init()
- SKPaymentQueue.default().add(self)
- }
-
- deinit {
- SKPaymentQueue.default().remove(self)
- }
- }
- extension ApplePayManager {
- @available(iOS 15.0.0, *)
- func check(appleId: String) async -> Bool {
- print("检查自动续费订单及是否存在试用资格")
- SKPaymentQueue.default().add(self)
- self.isCheck = true
- do {
- // 获取产品信息
- let productIds = [appleId]
- let products = try await Product.products(for: Set(productIds))
- // 检查第一个产品的试用资格
- if let product = products.first {
- return await product.subscription?.isEligibleForIntroOffer ?? false
- }
- return false
- } catch {
- print("Error checking trial eligibility: \(error)")
- return false
- }
- }
-
- // 开始支付
- func startPay(appleId: String, token: String, complete: ((Bool, String?) -> Void)?) {
-
- self.isPaying = true
- self.isCheck = false
-
- // 支付前查询自动续费的订单,将订单置为支付状态
- let transactions = SKPaymentQueue.default().transactions
- if transactions.count > 0 {
- for tran in transactions {
- if tran.transactionState == .purchased {
- SKPaymentQueue.default().finishTransaction(tran)
- }
- }
- }
-
- appleGoodId = appleId
- appleAccountToken = token
- completion = complete
-
- self.submitIAP()
- }
-
- func restoreAction(complete: ((Bool, String?) -> Void)?) {
-
- // 支付前查询自动续费的订单,将订单置为支付状态
- let transactions = SKPaymentQueue.default().transactions
- if transactions.count > 0 {
- for tran in transactions {
- if tran.transactionState == .purchased {
- SKPaymentQueue.default().finishTransaction(tran)
- }
- }
- }
-
- self.isPaying = false
- self.isCheck = false
- self.isRestoring = false
- self.completion = complete
-
- print("开始恢复订阅")
- SKPaymentQueue.default().restoreCompletedTransactions()
- }
- }
- extension ApplePayManager: SKPaymentTransactionObserver {
-
- // 提交内购
- func submitIAP() {
-
- if SKPaymentQueue.canMakePayments() {
-
- let payment = SKMutablePayment()
- payment.productIdentifier = self.appleGoodId
- payment.applicationUsername = self.appleAccountToken
- payment.quantity = 1
- SKPaymentQueue.default().add(payment)
- }
- }
-
- // 恢复订阅
- func restoreOrder(transaction: SKPaymentTransaction) {
-
- if isRestoring { return }
-
- if let receiptUrl = Bundle.main.appStoreReceiptURL {
- let receiptData = try? Data(contentsOf: receiptUrl)
- if let receiptString = receiptData?.base64EncodedString(options: .endLineWithLineFeed) {
- debugPrint("receiptString = \(String(describing: receiptString))")
-
- if let completion = self.completion {
- isRestoring = true
- completion(true, receiptString)
- }
- }
- }
- }
-
- func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
-
- print("监听AppStore支付状态 updatedTransactions")
-
- // if !self.isPaying { return }
-
- DispatchQueue.main.async {
- for tran in transactions {
- switch tran.transactionState {
-
- case .purchased:
- print("商品已苹果支付成功")
-
- if self.isPaying {
- if let receiptUrl = Bundle.main.appStoreReceiptURL {
- let receiptData = try? Data(contentsOf: receiptUrl)
- if let receiptString = receiptData?.base64EncodedString(options: .endLineWithLineFeed), let completion = self.completion {
- completion(true, receiptString)
- }
- }
- } else {
- if let completion = self.completion {
- completion(false, "")
- }
- }
-
- SKPaymentQueue.default().finishTransaction(tran)
- case .purchasing:
- print("正在购买中,商品已添加进列表")
- case .restored:
- print("恢复订阅")
- self.restoreOrder(transaction: tran)
- SKPaymentQueue.default().finishTransaction(tran)
- case .failed:
- SKPaymentQueue.default().finishTransaction(tran)
- if let completion = self.completion {
- completion(false, "")
- }
- case .deferred:
- print("未确定")
- if let completion = self.completion {
- completion(false, "")
- }
- default:
- if let completion = self.completion {
- completion(false, "")
- }
- break
- }
- }
- }
- }
-
- func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error) {
- print("恢复购买失败\(error.localizedDescription)")
- }
- }
|