Files
featherVoice/QXLive/Manager/QXIAPManager.m

317 lines
12 KiB
Mathematica
Raw Normal View History

2025-12-24 15:39:46 +08:00
//
// QXIAPManager.m
// QXLive
//
// Created by on 2025/12/24.
//
#import "QXIAPManager.h"
#import <StoreKit/StoreKit.h>
#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <AdSupport/AdSupport.h>
#import <AFNetworking/AFNetworking.h>
@interface QXIAPManager()<SKPaymentTransactionObserver,SKProductsRequestDelegate,SKRequestDelegate>
2025-12-26 19:04:08 +08:00
@property (nonatomic,strong)NSString*orderNo;
2025-12-24 15:39:46 +08:00
@end
@implementation QXIAPManager
+ (instancetype)sharedInstance{
static dispatch_once_t pred;
static QXIAPManager *manager = nil;
dispatch_once(&pred, ^{
manager = [[self alloc] init];
});
return manager;
}
/*
*/
2025-12-26 19:04:08 +08:00
-(void)buyGoodsWithId:(NSString*)productId orderNo:(NSString*)orderNo{
self.orderNo = orderNo;
2025-12-24 15:39:46 +08:00
//productId
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
if ([SKPaymentQueue canMakePayments]) { //app
if (productId.length) {
2025-12-26 19:04:08 +08:00
showLoadingInView(KEYWINDOW);
2025-12-24 15:39:46 +08:00
NSLog(@"%@商品正在请求中...",productId);
NSArray *product = [[NSArray alloc] initWithObjects:productId, nil];
NSSet *set = [NSSet setWithArray:product];
SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
productsRequest.delegate = self;
[productsRequest start];
}
} else { //
NSLog(@"没有购买权限");
}
}
/*
*/
- (void)resumeInAppPurchase {
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}
#pragma mark SKProductsRequestDelegate
- (void)productsRequest:(nonnull SKProductsRequest *)request didReceiveResponse:(nonnull SKProductsResponse *)response {
2025-12-26 19:04:08 +08:00
2025-12-24 15:39:46 +08:00
NSArray *product = response.products;
if (response.invalidProductIdentifiers.count) {
2025-12-26 19:04:08 +08:00
dispatch_async(dispatch_get_main_queue(), ^{
hideLoadingInView(KEYWINDOW);
});
2025-12-24 15:39:46 +08:00
NSLog(@"商品请求错误,error:%@", response.invalidProductIdentifiers);
2025-12-26 19:04:08 +08:00
showToast(@"商品请求错误");
2025-12-24 15:39:46 +08:00
if (self.subscriptionFailurreCompletionHandler) {
self.subscriptionFailurreCompletionHandler();
}
return;
} else {
SKPayment *payment = [SKPayment paymentWithProduct:product[0]];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
}
- (void)paymentQueue:(nonnull SKPaymentQueue *)queue updatedTransactions:(nonnull NSArray<SKPaymentTransaction *> *)transactions {
2025-12-26 19:04:08 +08:00
dispatch_async(dispatch_get_main_queue(), ^{
hideLoadingInView(KEYWINDOW);
});
2025-12-24 15:39:46 +08:00
// NSInteger i = 0;
for (SKPaymentTransaction *tran in transactions) {
// if(i != transactions.count - 1){
// i++;
// continue;
// }
switch (tran.transactionState) {
case SKPaymentTransactionStatePurchasing://
break;
case SKPaymentTransactionStatePurchased://
{
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
if (tran.originalTransaction) {
// ,originalTransaction
if (tran.originalTransaction.transactionIdentifier) {
[self saveOrderId:tran.originalTransaction.transactionIdentifier];
}
} else {
//
if (tran.transactionIdentifier) {
[self saveOrderId:tran.transactionIdentifier];
}
}
[self vertifyReceipt:^(BOOL success) {
if(success){
2025-12-26 19:04:08 +08:00
if (self.subscriptionSuccessCompletionHandler) {
self.subscriptionSuccessCompletionHandler();
}
[[NSNotificationCenter defaultCenter] postNotificationName:noticeAlipayResult object:nil];
2025-12-24 15:39:46 +08:00
}else{
2025-12-26 19:04:08 +08:00
if (self.subscriptionFailurreCompletionHandler) {
self.subscriptionFailurreCompletionHandler();
}
2025-12-24 15:39:46 +08:00
}
}]; //
NSLog(@"交易完成,正在校验凭证....");
}
break;
case SKPaymentTransactionStateFailed://
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
2025-12-26 19:04:08 +08:00
if (self.subscriptionFailurreCompletionHandler) {
self.subscriptionFailurreCompletionHandler();
}
2025-12-24 15:39:46 +08:00
break;
case SKPaymentTransactionStateRestored://
NSLog(@"已经购买过该商品");
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
if (tran.originalTransaction) {
if (tran.originalTransaction.transactionIdentifier) {
[self saveOrderId:tran.originalTransaction.transactionIdentifier];
}
} else {
if (tran.transactionIdentifier) {
[self saveOrderId:tran.transactionIdentifier];
}
}
self.subscriptionFailurreCompletionHandler();
break;
default:
break;
}
}
}
//
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {
if (queue.transactions.count > 0) {
for (SKPaymentTransaction *tran in queue.transactions) {
NSString *originalTransactionID = tran.originalTransaction.transactionIdentifier;
if (originalTransactionID) {
[self saveOrderId:originalTransactionID];
break;
}
}
[self getReceiptState:^(BOOL success) {
if(success){
self.restoreSuccessCompletionHandler();
}else{
self.restoreFailurreCompletionHandler();
}
}];
} else {
self.restoreFailurreCompletionHandler();
}
}
//
- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error {
self.restoreFailurreCompletionHandler();
}
/*
*/
- (void)saveOrderId:(NSString*)orderId{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:orderId forKey:@"orderId"];
[defaults synchronize];
}
- (Boolean)getWhetherSubscrid{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *orderId = [defaults objectForKey:@"orderId"];
return orderId != nil;
}
/*
*/
- (NSString *)getReceipt {
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
if ([[NSFileManager defaultManager] fileExistsAtPath:[receiptURL path]]){
NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL];
NSString *encodeReceiptStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
return encodeReceiptStr;
} else {
return nil;
}
}
/*
*/
- (void)vertifyReceipt:(void (^)(BOOL success))completion {
NSLog(@"~~~正在检验。。。");
2025-12-26 19:04:08 +08:00
NSString *payment_token = [self getReceipt];
// NSString *password = @"秘钥";
2025-12-24 15:39:46 +08:00
2025-12-26 19:04:08 +08:00
// NSString *urlString = [NSString stringWithFormat:@"https://sandbox.itunes.apple.com/verifyReceipt"];
// AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//
// NSDictionary *parameters = @{
// @"apple_receipt": receipt,
// @"password": @"a24591f9614b4814b1a77f8ffda41afc"
// };
//
// [manager POST:urlString parameters:parameters headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// //
// NSLog(@"弹窗提示用户请求成功");
// if (responseObject) {
// NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
// if ([string isEqualToString:@"success"] || [string isEqualToString:@"订单已存在"]) {
// dispatch_async(dispatch_get_main_queue(), ^{
// completion(YES);
// });
// }else if ([string isEqualToString:@"failure"] || [string isEqualToString:@"fail"]){
// dispatch_async(dispatch_get_main_queue(), ^{
// completion(NO);
// });
// }
// }
//
// } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
// //
// NSLog(@"请求失败:%@", error.localizedDescription);
// dispatch_async(dispatch_get_main_queue(), ^{
// completion(NO);
// });
// }];
showLoadingInView(KEYWINDOW)
[[QXRequset shareInstance] postWithUrl:@"api/Payment/notify_apple" parameters:@{@"order_no":self.orderNo?:@"",@"payment_token":payment_token?:@""} needCache:NO success:^(id responseObject) {
dispatch_async(dispatch_get_main_queue(), ^{
hideLoadingInView(KEYWINDOW);
completion(YES);
});
} fail:^(NSError *error, NSString *msg, NSURLSessionDataTask *task) {
2025-12-24 15:39:46 +08:00
dispatch_async(dispatch_get_main_queue(), ^{
2025-12-26 19:04:08 +08:00
hideLoadingInView(KEYWINDOW);
2025-12-24 15:39:46 +08:00
completion(NO);
2025-12-26 19:04:08 +08:00
showToast(msg);
2025-12-24 15:39:46 +08:00
});
}];
}
- (void)getReceiptState:(void (^)(BOOL success))completion {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *order_id = [defaults objectForKey:@"orderId"];
if(!order_id){
dispatch_async(dispatch_get_main_queue(), ^{
completion(NO);
});
return;
}
NSString *urlString = [NSString stringWithFormat:@"https://订单状态地址"];
NSString *bundleID = [[NSBundle mainBundle] bundleIdentifier];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
NSDictionary *parameters = @{
@"bundle_id": bundleID,
@"order_id": order_id
};
[manager GET:urlString parameters:parameters headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"订单状态获取");
if (responseObject) {
NSError *error = nil;
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:&error];
if([dictionary[@"status"] boolValue]){
dispatch_async(dispatch_get_main_queue(), ^{
completion(YES);
});
}else{
dispatch_async(dispatch_get_main_queue(), ^{
completion(NO);
});
}
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
//
NSLog(@"请求失败:%@", error.localizedDescription);
dispatch_async(dispatch_get_main_queue(), ^{
completion(NO);
});
}];
}
@end