美文网首页内购
iOS-内购注意

iOS-内购注意

作者: 精神病患者link常 | 来源:发表于2017-03-13 10:39 被阅读723次

    1、发送请求,注意请求ID

    NSString *productID = @"这是创建内购项目填写的ID";
    NSArray *product = [[NSArray alloc] initWithObjects: productID,nil];
    NSSet *nsset = [NSSet setWithArray:product];
    SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];
    request.delegate = self;
    

    2、 在监听购买结果后,一定要调用[[SKPaymentQueue defaultQueue] finishTransaction:tran];来允许你从支付队列中移除交易。

    //监听购买结果
    - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction{
        for(SKPaymentTransaction *tran in transaction){
            switch (tran.transactionState) {
                case SKPaymentTransactionStatePurchased:{
                    NSLog(@"交易完成");
                    // 发送到苹果服务器验证凭证,进行二次验证
                    [self verifyPurchaseWithProductionEnvironment];
                    [[SKPaymentQueue defaultQueue] finishTransaction:tran];
    
                }
                    break;
                case SKPaymentTransactionStatePurchasing:
                    NSLog(@"商品添加进列表");
    
                    break;
                case SKPaymentTransactionStateRestored:{
                    NSLog(@"已经购买过商品");
    
                    [[SKPaymentQueue defaultQueue] finishTransaction:tran];
                }
                    break;
                case SKPaymentTransactionStateFailed:{
                    NSLog(@"交易失败");
                    [[SKPaymentQueue defaultQueue] finishTransaction:tran];
                    [SVProgressHUD showErrorWithStatus:@"购买失败"];
                }
                    break;
                default:
                    break;
            }
        }
    }
    

    3、 沙盒环境测试appStore内购流程的时候,请使用没越狱的设备。
    请务必使用真机来测试,一切以真机为准。
    4、 项目的Bundle identifier需要与您申请AppID时填写的bundleID一致,不然会无法请求到商品信息。
    5、真机测试的时候,一定要退出原来的账号,才能用沙盒测试账号
    6、二次验证,请注意区分宏, 测试用沙盒验证,App Store审核的时候也使用的是沙盒购买,所以验证购买凭证的时候需要判断返回Status Code决定是否去沙盒进行二次验证,为了线上用户的使用,验证的顺序肯定是先验证正式环境,此时若返回值为21007,就需要去沙盒二次验证,因为此购买的是在沙盒进行的。

    //沙盒测试环境验证
    #define SANDBOX @"https://sandbox.itunes.apple.com/verifyReceipt"
    //正式环境验证
    #define AppStore @"https://buy.itunes.apple.com/verifyReceipt"
    /**
     *  验证购买,避免越狱软件模拟苹果请求达到非法购买问题
     *
     */
    -(void)verifyPurchaseWithProductionEnvironment{
        //从沙盒中获取交易凭证并且拼接成请求体数据
        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];
    
    /*
    注意:
    自己测试的时候使用的是沙盒购买(测试环境)
    App Store审核的时候也使用的是沙盒购买(测试环境)
    上线以后就不是用的沙盒购买了(正式环境)
    
    所以此时应该先验证正式环境,在验证测试环境
    
    正式环境验证成功,说明是线上用户在使用
    正式环境验证不成功返回21007,说明是自己测试或者审核人员在测试
    */
    
    //第一步,验证正式环境
     //创建请求到苹果官方进行购买验证(正式环境)
        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(@"购买成功!");
            //在此处对购买记录进行存储,可以存储到开发商的服务器端
        }else if([dic[@"status"] intValue]== 21007){
            //This receipt is from the test environment, but it was sent to the production environment for verification. Send it to the test environment instead.
            //购买凭证来自于测试环境,但是却发送到了正式环境,请改成测试环境(这种情况下可能是自己测试的,也可能是审核人员测试的)
    
            //第二步,验证测试环境
            [self verifyPurchaseWithTestEnvironment];
    
        }
    }
    
     //创建请求到苹果官方进行购买验证(测试环境)
    - (void)verifyPurchaseWithTestEnvironment {
        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(@"购买成功!");
            //在此处对购买记录进行存储,可以存储到开发商的服务器端
        }else{
            NSLog(@"购买失败,未通过验证!");
        }
    }
    
    

    相关文章

      网友评论

        本文标题:iOS-内购注意

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