Apple 内购 2022-03-01

//
//  RechargeManager.swift
//  FastMeow
//
//  Created by caoyicheng on 2022/2/26.
//

import UIKit
import StoreKit

private let RechargeInstance = RechargeManager()

class RechargeManager: NSObject, SKPaymentTransactionObserver, SKProductsRequestDelegate {
    
    typealias RechargeManagerSuccessBlock = ( _ receipt: Data, _ transationId: String) -> Void
    typealias RechargeManagerFailseBlock = () -> Void

    
    var successBlock: RechargeManagerSuccessBlock!
    var failseBlock: RechargeManagerFailseBlock!
    
    var productID: String!
    var orderID: String!
    
    // MARK: ======================================生命周期========================================
    
    class var share: RechargeManager {
        
        let obj = RechargeInstance
        obj.initAction()
        return obj
    }
    
    // MARK: 初始化
    @objc func initAction() {
        
        SKPaymentQueue.default().add(self)
        
    }
    
    // MARK: 开始内购
    func startPurchWithID(productID: String,
                          orderID: String,
                          success: @escaping RechargeManagerSuccessBlock,
                          failse: @escaping RechargeManagerFailseBlock) {
        
        if SKPaymentQueue.canMakePayments() {
            
            self.productID = productID
            self.orderID = orderID
            self.successBlock = success
            self.failseBlock = failse
            let request = SKProductsRequest.init(productIdentifiers: [productID])
            request.delegate = self
            request.start()
            
        } else {
            failse()
            print("购买失败-未授权")
        }
        
    }
    
    // MARK: 交易结束
    func completeTransaction(transaction: SKPaymentTransaction) {
        
        let recepitURL = Bundle.main.appStoreReceiptURL
        do {
            
            let receipt = try Data(contentsOf: recepitURL!)
            let transationID = transaction.transactionIdentifier ?? ""
            
            self.toServiceVerifyPurchaseWithPaymentTransaction(transaction: transaction,
                                                               productId: self.productID,
                                                               orderId: self.orderID,
                                                               payload: receipt,
                                                               transationID: transationID)
            
        } catch {
            
            // 交易失败
            self.failseBlock()
            SKPaymentQueue.default().finishTransaction(transaction)
            print("购买失败-查看本地交易URL为null")
        }
        
        
    }
    
    // MARK: 向服务器验证交易
    @objc func toServiceVerifyPurchaseWithPaymentTransaction(transaction: SKPaymentTransaction, productId: String, orderId: String, payload: Data, transationID: String) {
        
        
        let requestUrl = Utils.Base_Url + Utils.api_iosPayApplePay
        
        let dic = ["payload" : payload.base64EncodedString(),      // 校验体(base64字符串)
                   "payOrderId" : orderId,              // 支付订单Id
                   "productId" : productId,             // 产品ID
                   "transactionId" : transationID       // 内购支付返回的交易ID
        ]
        
        Alamofire.request(requestUrl,
                          method: .post,
                          parameters: dic,
                          encoding: URLEncoding.default,
                          headers: NetWorkManager.share.setHeader()).responseData { (response) in
            
            
            print("😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍")
            print("请求地址:")
            print(requestUrl)
            print("请求参数:")
            print(dic)
            print("响应数据:")
            print(JSON(response.result.value as Any))
            
            
            if response.error == nil {
                
                let resposeModel = ResposeModel.deserialize(from: JSON(response.result.value).dictionaryValue)
                if resposeModel!.code == "200" {
                    
                    print("购买成功")
                    self.successBlock(payload, transationID)
                    SKPaymentQueue.default().finishTransaction(transaction)
                    
                } else {
                    
                    print("购买失败")
                }
                
            } else {
                
                // 请求失败
                print("请求失败")
            }
        }
        
    }
    
    // MARK: ======================================代理方法========================================

    
    
    // MARK: 请求查看存在的产品
    func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
        
        let products = response.products
        if products.count == 0 {
            
            print("没有商品")
            self.failseBlock()
            return
        }
        
        var product: SKProduct?
        for item in products {
            
            if item.productIdentifier == self.productID {
                product = item
                break
            }
        }
        
        if product != nil {
            
            print("购买产品信息:")
            print(product!.description)
            print(product!.localizedTitle)
            print(product!.localizedDescription)
            print(product!.price)
            print(product!.productIdentifier)
            
            let payment = SKPayment.init(product: product!)
            // payment.applicationUsername = ""
            SKPaymentQueue.default().add(payment)
        } else {
            
            self.failseBlock()
        }
    }
    
    
    // MARK: 交易状态
    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        
        for transtion in transactions {
            
            
            if transtion.transactionState == .purchased {

                // 购买成功
                self.completeTransaction(transaction: transtion)
                print("购买成功")

            } else if transtion.transactionState == .purchasing {

                // 正在购买
                print("正在购买")

            } else if transtion.transactionState == .restored {

                // 恢复
                SKPaymentQueue.default().finishTransaction(transtion)
                print("购买恢复")

            } else if transtion.transactionState == .failed {

                // 购买失败
                self.failseBlock()
                SKPaymentQueue.default().finishTransaction(transtion)
                print("购买失败")

            } else {
                
                print("其他")
                self.failseBlock()
                SKPaymentQueue.default().finishTransaction(transtion)
            }
            
        }
    }
    
}




©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 参考文章https://www.jianshu.com/p/2247f3b36be3[https://www.ji...
    CYC666阅读 1,377评论 3 3
  • 三月你好!许多人在这一天这个早上 的朋友圈都会打这样的一招呼,我也是。早上如约起床,嗯,是的,坚持了快一周,5点闹...
    花儿素阅读 467评论 0 1
  • 三月第一天市场继续缩量,其中上证50放量风巽震荡走高略乐观,国证2000三高及创业板火丽火丽虽乐观但成交量不足感觉...
    忘川秋水阅读 149评论 0 1
  • 前两天看到一个新闻,大致意思是作者斥责了那些对这次俄乌战争的调侃,包括什么收养乌美女诸如此类。 作者发完文还被那些...
    柿子树下的可达鸭阅读 143评论 0 2
  • 写作,是一场美丽的邂逅!春光旖旎,“草长莺飞二月天,拂堤杨柳醉春烟”的美景在文人笔下有了生机! 夏日绚烂...
    云淡风轻可可阅读 381评论 0 0

友情链接更多精彩内容