首先引用 #import <StoreKit/StoreKit.h>

封装一个内购功能,这个在app 中可能多个地方用到

+ (instancetype)shareIAPManager;

//添加内购产品
- (void)addPurchWithProductID:(NSString *)product_id completeHandle:(IAPCompletionHandleBlock)handle;
复制代码

SKProductsRequestDelegate代理方法
交易结束后用到

- (void)completeTransaction:(SKPaymentTransaction *)transaction {

    NSString * productIdentifier = transaction.payment.productIdentifier;
    NSData *data = [productIdentifier dataUsingEncoding:NSUTF8StringEncoding];
    NSString *receipt = [data base64EncodedStringWithOptions:0];

    YMLog(@"%@",receipt);
    if ([productIdentifier length] > 0) {
        // 向自己的服务器验证购买凭证
        NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
        if (![[NSFileManager defaultManager] fileExistsAtPath:[receiptURL path]]) {
            // 取 receipt 的时候要判空,如果文件不存在,就要从苹果服务器重新刷新下载 receipt 了
            // SKReceiptRefreshRequest 刷新的时候,需要用户输入 Apple ID,同时需要网络状态良好
            SKReceiptRefreshRequest *receiptRefreshRequest = [[SKReceiptRefreshRequest alloc] initWithReceiptProperties:nil];
            receiptRefreshRequest.delegate = self;
            [receiptRefreshRequest start];
            return;
        }
        NSData *data = [NSData dataWithContentsOfURL:receiptURL];
        /** 交易凭证*/
        NSString *receipt_data = [data base64EncodedStringWithOptions:0];
        /** 事务标识符(交易编号)  交易编号(必传:防止越狱下内购被破解,校验 in_app 参数)*/
        NSString *transaction_id = transaction.transactionIdentifier;
        NSString *goodID = transaction.payment.productIdentifier;

        //这里缓存receipt_data,transaction_id 因为后端做校验的时候需要用到这两个字段
        YMLog(@"%@",receipt_data);
        YMLog(@"%@",transaction_id);

        [self retquestApplePay:receipt_data transaction_id:transaction_id goodsID:goodID];
    }
    [self verifyPurchaseWithPaymentTransaction:transaction isTestServer:NO];
}
复制代码

//private 提交订单数据到app 服务器校验

- (void)retquestApplePay:(NSString *)receipt_data transaction_id:(NSString *)transaction_id goodsID:(NSString *)goodsId;
复制代码

// 交易失败

- (void)failedTransaction:(SKPaymentTransaction *)transaction{
    if (transaction.error.code != SKErrorPaymentCancelled) {
        [self handleActionWithType:IAPPurchFailed data:nil];
    }else{
        [self handleActionWithType:IAPPurchCancel data:nil];
    }
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

#pragma mark -- 结束上次未完成的交易 防止串单
-(void)removeAllUncompleteTransactionBeforeStartNewTransaction{
    NSArray* transactions = [SKPaymentQueue defaultQueue].transactions;
    if (transactions.count > 0) {
        //检测是否有未完成的交易
        SKPaymentTransaction* transaction = [transactions firstObject];
        if (transaction.transactionState == SKPaymentTransactionStatePurchased) {
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            return;
        }
    }
}复制代码

IAPDemo链接:Demo

我的掘金:https://juejin.im/post/5dca8b526fb9a04a8e3be109

01-05 04:17