App内购 Code 8步流程

作者: HunterDude | 来源:发表于2017-02-08 11:39 被阅读331次

注意: 本文,只写大体重要几个步骤,不是很详细。
仔细研究建议观看:
In-App Purchase for Developer
巧哥的(iOS应用内付费(IAP)开发步骤列表
Yi'mouleng
如何正确使用IAP
等等......

创建你的 SkpayManager

导入 StoreKit库

签订<SKPaymentTransactionObserver, SKProductsRequestDelegate>协议

SkpayManager:

1. 程序启动添加SKPay观察者,同时像后端请求产品列表信息
- (void)launch {
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [self requestProductList];
}
2. 程序结束后,移除SKpay观察者
- (void)terminate {
    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
3. 这时候已请求拿到我们服务端给的产品信息,购买页面可进行UI布局展示
UI展示
4. 进入购买页面,通过用户选择的产品ID,以及quantity进行购买
- (void)buyProductsWithId:(NSString *)productsId andQuantity:(NSInteger)quantity {

    self.productsId = productsId;
    self.quantity = quantity;
    if ([SKPaymentQueue canMakePayments]) {
        //允许程序内付费购买
        [self RequestProductData:@[self.productsId]];
    } else {
        [[ZToastManager ShardInstance] showtoast:@"您的手机没有打开程序内付费购买"];
    }
}
5. 然后通过用户选中的产品ID数组,SKProductsRequest 开始请求购买
- (void)RequestProductData:(NSArray *)productsIdArr {
    //请求对应的产品信息
    NSSet *nsset = [NSSet setWithArray:productsIdArr];
    SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];
    request.delegate = self;
    [request start];
}
6. SKProductsRequestDelegate 会接收到请求响应,在此回调中,发送购买请求
//收到的产品信息
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
    //收到产品反馈信息
    NSArray *myProduct = response.products;
//    NSLog(@"产品Product ID:%@", response.invalidProductIdentifiers);
//    NSLog(@"产品付费数量: %d", (int) [myProduct count]);
    // populate UI
    for (SKProduct *product in myProduct) {
//        NSLog(@"product info");
//        NSLog(@"  基本描述: %@", [product description]);
//        NSLog(@"  IAP的id: %@", product.productIdentifier);
//        NSLog(@"  地区编码: %@", product.priceLocale.localeIdentifier);
//        NSLog(@"  本地价格: %@", product.price);
//        NSLog(@"  语言代码: %@", [product.priceLocale objectForKey:NSLocaleLanguageCode]);
//        NSLog(@"  国家代码: %@", [product.priceLocale objectForKey:NSLocaleCountryCode]);
//        NSLog(@"  货币代码: %@", [product.priceLocale objectForKey:NSLocaleCurrencyCode]);
//        NSLog(@"  货币符号: %@", [product.priceLocale objectForKey:NSLocaleCurgegrencySymbol]);
//        NSLog(@"  本地标题: %@", product.localizedTitle);
//        NSLog(@"  本地描述: %@", product.localizedDescription);
        [self updateProductPriceWithId:product.productIdentifier andPrice:product.price];
        if ([[product.priceLocale objectForKey:NSLocaleCurrencyCode] isEqualToString:@"CNY"]) {
            self.CurrencyCode = @"¥";
        } else {
            self.CurrencyCode = [product.priceLocale objectForKey:NSLocaleCurrencySymbol];
        }
    }
    //发送购买请求
    for (SKProduct *prct in myProduct) {
        if ([self.productsId isEqualToString:prct.productIdentifier]) {
            SKMutablePayment *payment = nil;
            payment = [SKMutablePayment paymentWithProduct:prct];
            payment.quantity = self.quantity;
            [[SKPaymentQueue defaultQueue] addPayment:payment];
        }
    }
}
7. SKPaymentTransactionObserver 此协议会监听到购买结果,根据购买结果的不同,做出不同的逻辑。
#pragma mark - SKPaymentTransactionObserver

//----监听购买结果
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
    //交易结果
    for (SKPaymentTransaction *transaction in transactions) {
        switch (transaction.transactionState) {
            case SKPaymentTransactionStatePurchased: {
                //交易完成
                [self completeTransaction:transaction];
            }
                break;
            case SKPaymentTransactionStateFailed: {
                //交易失败
                [self hideHud];
                [self failedTransaction:transaction];
                [[ZToastManager ShardInstance] showtoast:@"交易失败"];
            }
                break;
            case SKPaymentTransactionStateRestored: {
                //已经购买过该商品
                [self hideHud];
                [self restoreTransaction:transaction];
                [[ZToastManager ShardInstance] showtoast:@"已经购买过该商品"];
            }
                break;
            case SKPaymentTransactionStatePurchasing: {
                //商品添加进列表
                NSLog(@"商品添加进列表");
            }
                break;
            case SKPaymentTransactionStateDeferred: {
                NSLog(@"SKPayment Transaction State Deferred");
            }
                break;
            default:
                break;
        }
    }
}

8. 购买成功之后,需将receipt 上传至自己的服务端
- (void)completeTransaction:(SKPaymentTransaction *)transaction {
    // Your application should implement these two methods.
    //NSString *product = transaction.payment.productIdentifier;
    [self verifyReceipt:transaction];
}

相关文章

  • App内购 Code 8步流程

    注意: 本文,只写大体重要几个步骤,不是很详细。仔细研究建议观看:In-App Purchase for Deve...

  • Apple内购审核总结

    内购流程 1 创建内购商品 我的APP-功能-选择对应的内购类型-订阅群组(群组说明)- 本地化信息 - 审核信息...

  • iOS内购流程文档-Lion

    iOS内购流程: iOS内购 什么时候用到呢? 虚拟产品就需要用到iOS内购;购买的商品,是在本app中...

  • 苹果APP内购

    内购?在App内购买非实物产品(如游戏币,电子书,视频等虚拟产品)需要走内购流程,苹果这里面抽走30%盈利。 内购...

  • iOS内购图文流程(2017)

    转载自[iOS内购图文流程(2017)] 什么是内购? 只要在iPhone App上购买的不是实物产品(也就是虚拟...

  • iOS 内购流程图

    一 、iOS 内购流程: 1. 用户iOS应用 用户选择产品 提交到App Store 2. App ...

  • 【2020年1月更新】苹果内购银行、税务信息后台配置

    2019最新iOS内购流程基本配置(不含代码部分) 1、登录https://appstoreconnect.app...

  • 2019最新iOS内购流程基本配置篇

    2019最新iOS内购流程基本配置(不含代码部分) 1、登录https://appstoreconnect.app...

  • 苹果内购丢单问题

    1.内购流程 1.APP调用Apple服务器接口创建订单,发起购买请求 2.内购的api完成购买,获取receip...

  • iOS内购

    内购其实真的不难,?不信你往下看 首先我们来总体看下内购的流程 资料填写 (协议,税务,银行业务,联系信息)App...

网友评论

    本文标题:App内购 Code 8步流程

    本文链接:https://www.haomeiwen.com/subject/ozyvittx.html