123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- import Cocoa
- import StoreKit
- import AuthenticationServices
- class KMInAppPurchaseManager: NSObject {
- public static let manager = KMInAppPurchaseManager()
-
- var availableProducts: [SKProduct] = []
-
- override init() {
- super.init()
-
- SKPaymentQueue.default().add(self)
- }
-
- func fetchProducts() {
- let productIdentifiers: Set<String> = ["com.yourapp.product1", "com.yourapp.product2"]
- let request = SKProductsRequest(productIdentifiers: productIdentifiers)
- request.delegate = self
- request.start()
- }
-
- func purchaseProduct(productIdentifier: String) {
- guard let product = availableProducts.first(where: { $0.productIdentifier == productIdentifier }) else {
-
- return
- }
-
- let payment = SKPayment(product: product)
- SKPaymentQueue.default().add(payment)
- }
-
- func startInAppPurchase() {
- let productIdentifier = "your_product_identifier"
- if SKPaymentQueue.canMakePayments() {
- if let product = availableProducts.first(where: { $0.productIdentifier == productIdentifier }) {
- let payment = SKPayment(product: product)
- SKPaymentQueue.default().add(payment)
- } else {
-
- }
- } else {
-
- }
- }
-
- }
- extension KMInAppPurchaseManager: SKProductsRequestDelegate {
- func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
- availableProducts = response.products
-
- }
-
- func request(_ request: SKRequest, didFailWithError error: Error) {
-
- }
- }
- extension KMInAppPurchaseManager: SKPaymentTransactionObserver {
- func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
- for transaction in transactions {
- switch transaction.transactionState {
- case .purchased:
-
- validatePurchase(transaction: transaction)
- case .failed:
-
- handleError(transaction: transaction)
- case .restored:
-
- validatePurchase(transaction: transaction)
- default:
- break
- }
- }
- }
-
- func validatePurchase(transaction: SKPaymentTransaction) {
-
- if let receiptURL = Bundle.main.appStoreReceiptURL,
- let receiptData = try? Data(contentsOf: receiptURL) {
-
- if let parsedReceipt = parseReceipt(receiptData: receiptData),
- let purchase = parsedReceipt["in_app"] as? [[String: Any]],
- let matchingPurchase = purchase.first(where: { $0["transaction_id"] as? String == transaction.transactionIdentifier }) {
-
- if verifyPurchase(purchase: matchingPurchase) {
-
- SKPaymentQueue.default().finishTransaction(transaction)
-
- } else {
-
- SKPaymentQueue.default().finishTransaction(transaction)
-
- }
- }
- }
- }
-
- func handleError(transaction: SKPaymentTransaction) {
-
- SKPaymentQueue.default().finishTransaction(transaction)
-
- }
-
- func verifyPurchase(purchase: [String: Any]) -> Bool {
-
-
-
- return true
- }
-
- func parseReceipt(receiptData: Data) -> [String: Any]? {
- guard let receipt = try? JSONSerialization.jsonObject(with: receiptData, options: []) as? [String: Any] else {
- return nil
- }
-
- return receipt
- }
- }
|