美文网首页iOSiOS大咖说
iOS苹果内购详细步骤

iOS苹果内购详细步骤

作者: 杰小冷_4957 | 来源:发表于2019-07-22 15:18 被阅读0次

    学而时习之,不亦悦乎,大家好,我是张杰。

    iOS开发支付模块分为两个部分:

    1、调取外部支付,例如支付宝、微信、银联等。

    2、苹果内购。

    什么是苹果内购呢?从技术层面来说就是走苹果自己的支付模式,例如现在的爱奇艺APP里面购买会员,QQ斗地主里面的充值QB等。有图便于理解:

    11563767294_.pic.jpg

    其中图标、价格、详情等都需要到https://developer.apple.com里面去设置。具体下面会讲到。

    下面我们分两块来讲:

    1、代码

    2、设置

    一、内购所需要写的代码是非常少的,主要难点在设置部分。

    1、引入头文件
    #import<StoreKit/StoreKit.h>
    
    2、设置代理
    @interface AppDelegate ()<WXApiDelegate,SKProductsRequestDelegate,SKPaymentTransactionObserver>
    
    3、开启内购检测
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    
    4、设置内购点击事件
    -(void)buy:(NSString *)buyID{
    self.productId = buyID;
    if ([SKPaymentQueue canMakePayments]) {
        [self requestProductData:self.productId];
    }else{
        NSLog(@"不允许程序内付费");
        [MBProgressHUD showGameAQHUDAddto:self.window text:@"不允许程序内付费"];
    }
    }
    
    5、请求商品,获取商品信息,以及代理
    -(void)requestProductData:(NSString *)productId{
    NSLog(@"--------请求对应的产品信息------------");
    [MBProgressHUD showGameAQHUDAddto:self.window text:@"请求对应的产品信息"];
    NSSet *nsset = [NSSet setWithObjects:productId, nil];
    _request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];
    _request.delegate = self;
    [_request start];
    }
    
    -(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
    NSLog(@"-------收到产品反馈消息----------");
    [MBProgressHUD showGameAQHUDAddto:self.window text:@"收到产品反馈消息"];
    NSArray *product = response.products;
    if ([product count] == 0) {
        NSLog(@"-----没有商品-------");
        [MBProgressHUD showGameAQHUDAddto:self.window text:@"没有商品"];
        return;
    }
    
    NSLog(@"productID:%@",response.invalidProductIdentifiers);
    NSLog(@"产品付费数量:%lu",(unsigned long)product.count);
    //     [MBProgressHUD showGameAQHUDAddto:self.window text:@"产品付费数量"];
    //    [MBProgressHUD showGameAQHUDAddto:self.window text:[NSString stringWithFormat:@"productID:%@",response.invalidProductIdentifiers]];
    SKProduct *prod = nil;
    for (SKProduct *pro in product) {
        NSLog(@"%@",pro.description);
        NSLog(@"%@",pro.localizedTitle);
        NSLog(@"%@",pro.localizedDescription);
        NSLog(@"%@",pro.price);
        NSLog(@"%@",pro.productIdentifier);
        
        if ([pro.productIdentifier isEqualToString:self.productId]) {
            prod = pro;
        }
    }
    if (prod != nil) {
        SKPayment *payment = [SKPayment paymentWithProduct:prod];
        NSLog(@"-------发送购买请求-------");
        [[SKPaymentQueue defaultQueue] addPayment:payment];
    }
    }
    
    -(void)request:(SKRequest *)request didFailWithError:(NSError *)error{
    NSLog(@"购买失败");
    }
    
    - (void)requestDidFinish:(SKRequest *)request{
    NSLog(@"反馈信息结束");
    }
    
    6、沙盒测试环境验证以及正式环境
    //沙盒测试环境验证
    #define SANDBOX @"https://sandbox.itunes.apple.com/verifyReceipt"
    //正式环境验证
    #define AppStore @"https://buy.itunes.apple.com/verifyReceipt"
    /**
     *  验证购买,避免越狱软件模拟苹果请求达到非法购买问题
     *
     */
    -(void)verifyPurchaseWithPaymentTransaction{
    //从沙盒中获取交易凭证并且拼接成请求体数据
    NSURL *receiptUrl=[[NSBundle mainBundle] appStoreReceiptURL];
    NSData *receiptData=[NSData dataWithContentsOfURL:receiptUrl];
    NSString *receiptString=[receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];//转化为base64字符串
    NSString *bodyString = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\"}", receiptString];//拼接请求数据
    NSData *bodyData = [bodyString dataUsingEncoding:NSUTF8StringEncoding];
    //创建请求到苹果官方进行购买验证
    NSURL *url=[NSURL URLWithString:AppStore];
    NSMutableURLRequest *requestM=[NSMutableURLRequest requestWithURL:url];
    requestM.HTTPBody=bodyData;
    requestM.HTTPMethod=@"POST";
    //创建连接并发送同步请求
    NSError *error=nil;
    NSData *responseData=[NSURLConnection sendSynchronousRequest:requestM returningResponse:nil error:&error];
    if (error) {
        NSLog(@"验证购买过程中发生错误,错误信息:%@",error.localizedDescription);
        return;
    }
    NSDictionary *dic=[NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingAllowFragments error:nil];
    NSLog(@"%@",dic);
    if([dic[@"status"] intValue]==0){
        NSLog(@"购买成功!");
        NSDictionary *dicReceipt= dic[@"receipt"];
        NSDictionary *dicInApp=[dicReceipt[@"in_app"] firstObject];
        NSString *productIdentifier= dicInApp[@"product_id"];//读取产品标识
        [MBProgressHUD showGameAQHUDAddto:self.window text:@"购买成功!"];
    //        [MBProgressHUD showGameAQHUDAddto:self.window text:[NSString stringWithFormat:@"购买成功--%@",dicInApp[@"product_id"]]];
        //如果是消耗品则记录购买数量,非消耗品则记录是否购买过
    //        NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
    //        if ([productIdentifier isEqualToString:@"123"]) {
    //            int purchasedCount=[defaults integerForKey:productIdentifier];//已购买数量
    //            [[NSUserDefaults standardUserDefaults] setInteger:(purchasedCount+1) forKey:productIdentifier];
    //        }else{
    //            [defaults setBool:YES forKey:productIdentifier];
    //        }
    //        //在此处对购买记录进行存储,可以存储到开发商的服务器端
        
        if ([productIdentifier isEqualToString:@"111111"]) {
            [self chongzhi:@"50"];
        }else if ([productIdentifier isEqualToString:@"22222"]) {
            [self chongzhi:@"108"];
        }else if ([productIdentifier isEqualToString:@"33333"]) {
            [self chongzhi:@"158"];
        }else if ([productIdentifier isEqualToString:@"44444"]) {
            [self chongzhi:@"208"];
        }
    }else if([dic[@"status"] intValue]==21007){
        [self verifyPurchaseWithPaymentTransactionSANDBOX];
    }else{
        NSLog(@"购买失败,未通过验证!");
    }
    }
    
    -(void)verifyPurchaseWithPaymentTransactionSANDBOX{
    //从沙盒中获取交易凭证并且拼接成请求体数据
    NSURL *receiptUrl=[[NSBundle mainBundle] appStoreReceiptURL];
    NSData *receiptData=[NSData dataWithContentsOfURL:receiptUrl];
    NSString *receiptString=[receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];//转化为base64字符串
    NSString *bodyString = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\"}", receiptString];//拼接请求数据
    NSData *bodyData = [bodyString dataUsingEncoding:NSUTF8StringEncoding];
    //创建请求到苹果官方进行购买验证
    NSURL *url=[NSURL URLWithString:SANDBOX];
    NSMutableURLRequest *requestM=[NSMutableURLRequest requestWithURL:url];
    requestM.HTTPBody=bodyData;
    requestM.HTTPMethod=@"POST";
    //创建连接并发送同步请求
    NSError *error=nil;
    NSData *responseData=[NSURLConnection sendSynchronousRequest:requestM returningResponse:nil error:&error];
    if (error) {
        NSLog(@"验证购买过程中发生错误,错误信息:%@",error.localizedDescription);
        return;
    }
    NSDictionary *dic=[NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingAllowFragments error:nil];
    NSLog(@"%@",dic);
    if([dic[@"status"] intValue]==0){
        NSLog(@"购买成功!");
        NSDictionary *dicReceipt= dic[@"receipt"];
        NSDictionary *dicInApp=[dicReceipt[@"in_app"] firstObject];
        NSString *productIdentifier= dicInApp[@"product_id"];//读取产品标识
        [MBProgressHUD showGameAQHUDAddto:self.window text:@"购买成功!"];
        [MBProgressHUD showGameAQHUDAddto:self.window text:[NSString stringWithFormat:@"购买成功--%@",dicInApp[@"product_id"]]];
        //如果是消耗品则记录购买数量,非消耗品则记录是否购买过
        //        NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
        //        if ([productIdentifier isEqualToString:@"123"]) {
        //            int purchasedCount=[defaults integerForKey:productIdentifier];//已购买数量
        //            [[NSUserDefaults standardUserDefaults] setInteger:(purchasedCount+1) forKey:productIdentifier];
        //        }else{
        //            [defaults setBool:YES forKey:productIdentifier];
        //        }
        //        //在此处对购买记录进行存储,可以存储到开发商的服务器端
        
        if ([productIdentifier isEqualToString:@"111111"]) {
            [self chongzhi:@"50"];
        }else if ([productIdentifier isEqualToString:@"22222"]) {
            [self chongzhi:@"108"];
        }else if ([productIdentifier isEqualToString:@"33333"]) {
            [self chongzhi:@"158"];
        }else if ([productIdentifier isEqualToString:@"44444"]) {
            [self chongzhi:@"208"];
        }
    }else if([dic[@"status"] intValue]==21007){
        
    }else{
        NSLog(@"购买失败,未通过验证!");
    }
    }
    

    代码部分已经结束。仅仅看代码已经能懂60%了。剩余不懂得看完设置就差不多了。

    设置部分

    设置部分需要做的是:
    1、税务等填写。
    2、沙河账号申请。
    3、商品和价格设置。
    4、Appstore显示。

    由于做的时候设置部分没有截图,下面提供两个补充文档:

    https://www.jianshu.com/p/bded03fdbec9

    https://www.jianshu.com/p/ebdeea271352

    如果有错误或者还有其他问题,可以联系我:zhangjieiossky@163.com,谢谢

    相关文章

      网友评论

        本文标题:iOS苹果内购详细步骤

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