|
@@ -66,6 +66,8 @@ class KMInAppPurchaseManager: NSObject {
|
|
|
return self.updatePurchaseState()
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ var orderId: String?
|
|
|
|
|
|
deinit {
|
|
|
SKPaymentQueue.default().remove(self)
|
|
@@ -91,14 +93,14 @@ class KMInAppPurchaseManager: NSObject {
|
|
|
self.request?.start()
|
|
|
}
|
|
|
|
|
|
- func purchaseProduct(productIdentifier: String, completion: @escaping KMPurchaseCompletion) {
|
|
|
+ func purchaseProduct(productIdentifier: String, orderId: String = "", completion: @escaping KMPurchaseCompletion) {
|
|
|
self.purchaseProductCompletion = completion
|
|
|
+ self.orderId = orderId
|
|
|
if SKPaymentQueue.canMakePayments() {
|
|
|
if let product = availableProducts.first(where: { $0.productIdentifier == productIdentifier }) {
|
|
|
print("\("购买产品") + \(productIdentifier)")
|
|
|
let payment = SKMutablePayment(product: product)
|
|
|
- let uuid: String = GetHardwareUUID() ?? ""
|
|
|
- payment.applicationUsername = uuid
|
|
|
+ payment.applicationUsername = orderId
|
|
|
SKPaymentQueue.default().add(payment)
|
|
|
} else {
|
|
|
// 未找到匹配的产品
|
|
@@ -184,7 +186,9 @@ extension KMInAppPurchaseManager: SKPaymentTransactionObserver {
|
|
|
print("服务器返回数据")
|
|
|
let hasPurchased = false
|
|
|
let hasFailed = false
|
|
|
- for transaction in transactions {
|
|
|
+ if transactions.count > 0 {
|
|
|
+ let transaction = transactions.first!
|
|
|
+ // for transaction in transactions {
|
|
|
switch transaction.transactionState {
|
|
|
case .purchased:
|
|
|
// 购买成功,进行本地二次验证
|
|
@@ -202,6 +206,7 @@ extension KMInAppPurchaseManager: SKPaymentTransactionObserver {
|
|
|
default:
|
|
|
break
|
|
|
}
|
|
|
+ // }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -229,6 +234,28 @@ extension KMInAppPurchaseManager: SKPaymentTransactionObserver {
|
|
|
*/
|
|
|
func sendReceiptToServer(receiptData: Data, transaction: SKPaymentTransaction) {
|
|
|
// 构建请求
|
|
|
+ let receiptString = receiptData.base64EncodedString(options: [])
|
|
|
+ let tempOrderId = self.orderId
|
|
|
+ print(receiptString)
|
|
|
+ KMRequestServerManager.manager.parseVerification(applePayProductId: PRODUCT_1, orderId: tempOrderId!, receipt: receiptString) { [unowned self] success, result in
|
|
|
+ if success, let data = result?.result {
|
|
|
+ // 处理服务器返回的验证结果
|
|
|
+ //解析数据
|
|
|
+ KMLightMemberUserInfo.parseData(data: data) { tData in
|
|
|
+ KMLightMemberManager.manager.reloadUserInfo()
|
|
|
+ self.handleAction(state: .verSuccess)
|
|
|
+ }
|
|
|
+ } else if result?.error != nil {
|
|
|
+ // 处理网络请求错误
|
|
|
+ // ...
|
|
|
+ self.handleAction(state: .failed)
|
|
|
+ }
|
|
|
+ SKPaymentQueue.default().finishTransaction(transaction)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ func sendReceiptToAppleServer(receiptData: Data, transaction: SKPaymentTransaction) {
|
|
|
+ // 构建请求
|
|
|
// let url = URL(string: "https://your-server.com/verify-receipt")!
|
|
|
// let requestContents = ["receipt-data" : receipt.base64EncodedString()]
|
|
|
let receiptString = receiptData.base64EncodedString(options: [])
|
|
@@ -298,6 +325,33 @@ extension KMInAppPurchaseManager: SKPaymentTransactionObserver {
|
|
|
return true
|
|
|
}
|
|
|
|
|
|
+ func parseAppleVerificationResult(data: Data) -> Bool {
|
|
|
+ // 解析服务器返回的验证结果
|
|
|
+ // 如果验证成功返回 true,否则返回 false
|
|
|
+ // ...
|
|
|
+ let receipt: [String: Any] = self.parseReceipt(receiptData: data) ?? [:]
|
|
|
+ print(receipt)
|
|
|
+ let status: Int = receipt["status"] as! Int
|
|
|
+ if status == 21007 {
|
|
|
+ self.handleAction(state: .verFailed)
|
|
|
+// [self verifyPurchaseWithPaymentTransaction:transaction isTestServer:YES];
|
|
|
+ } else if status == 0 {
|
|
|
+ //保存票据信息
|
|
|
+ UserDefaults.standard.set(receipt, forKey: "kInAppPurchaseReceipt")
|
|
|
+ UserDefaults.standard.synchronize()
|
|
|
+
|
|
|
+ let state = self.verifyPurchase(purchase: receipt)
|
|
|
+ if state == .subscription {
|
|
|
+ self.handleAction(state: .verSuccess)
|
|
|
+ } else {
|
|
|
+ self.handleAction(state: .verFailed)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ self.handleAction(state: .verFailed)
|
|
|
+ }
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
func handleError(transaction: SKPaymentTransaction) {
|
|
|
// 处理购买失败的逻辑
|
|
|
SKPaymentQueue.default().finishTransaction(transaction)
|
|
@@ -345,6 +399,46 @@ extension KMInAppPurchaseManager: SKPaymentTransactionObserver {
|
|
|
return .unknow
|
|
|
}
|
|
|
|
|
|
+ func verifyApplePurchase(purchase: [String: Any]) -> KMPurchaseManagerState {
|
|
|
+ // 执行购买凭证验证的逻辑,例如验证产品标识符、购买日期等
|
|
|
+ // 如果验证成功返回 true,否则返回 false
|
|
|
+ // ...
|
|
|
+ /**
|
|
|
+ "expires_date" = "2023-06-27 09:28:20 Etc/GMT";
|
|
|
+ "expires_date_ms" = 1687858100000;
|
|
|
+ "expires_date_pst" = "2023-06-27 02:28:20 America/Los_Angeles";
|
|
|
+ "in_app_ownership_type" = PURCHASED;
|
|
|
+ "is_in_intro_offer_period" = false;
|
|
|
+ "is_trial_period" = false;
|
|
|
+ "original_purchase_date" = "2023-06-27 07:27:22 Etc/GMT";
|
|
|
+ "original_purchase_date_ms" = 1687850842000;
|
|
|
+ "original_purchase_date_pst" = "2023-06-27 00:27:22 America/Los_Angeles";
|
|
|
+ "original_transaction_id" = 2000000357748210;
|
|
|
+ "product_id" = "com.pdftechnologies.pdfreader.mac.yearly.001";
|
|
|
+ "purchase_date" = "2023-06-27 08:28:20 Etc/GMT";
|
|
|
+ "purchase_date_ms" = 1687854500000;
|
|
|
+ "purchase_date_pst" = "2023-06-27 01:28:20 America/Los_Angeles";
|
|
|
+ quantity = 1;
|
|
|
+ "transaction_id" = 2000000357808638;
|
|
|
+ "web_order_line_item_id" = 2000000030580071;
|
|
|
+ */
|
|
|
+
|
|
|
+ let receipt: [String: Any] = purchase["receipt"] as? [String : Any] ?? [:]
|
|
|
+ let in_app: [NSDictionary] = receipt["in_app"] as? [NSDictionary] ?? []
|
|
|
+ let request_date_ms: Int = Int(receipt["request_date_ms"] as? String ?? "0") ?? 0
|
|
|
+ for item in in_app {
|
|
|
+ let expires_date_ms: Int = Int(item["expires_date_ms"] as? String ?? "-1") ?? -1
|
|
|
+ let product_id: String = item["product_id"] as? String ?? ""
|
|
|
+ let now_date_ms: Int = Int(NSDate().timeIntervalSince1970) * 1000
|
|
|
+ if product_id == PRODUCT_1 &&
|
|
|
+// expires_date_ms > request_date_ms &&
|
|
|
+ expires_date_ms > now_date_ms {
|
|
|
+ return .subscription
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return .unknow
|
|
|
+ }
|
|
|
+
|
|
|
func parseReceipt(receiptData: Data) -> [String: Any]? {
|
|
|
guard let receipt = try? JSONSerialization.jsonObject(with: receiptData, options: []) as? [String: Any] else {
|
|
|
return nil
|