Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios InApp采购未完成付款_Ios_Objective C_Xcode_In App Purchase - Fatal编程技术网

Ios InApp采购未完成付款

Ios InApp采购未完成付款,ios,objective-c,xcode,in-app-purchase,Ios,Objective C,Xcode,In App Purchase,我已经做了一个IAP的演示,我已经在apple帐户中注册了我的演示应用程序,我还添加了产品信息、说明、应用程序id、标题、priceTier、沙盒帐户,用于测试演示中描述的支付过程。我现在面临两个问题:- a) 就像第一次弹出窗口要求输入苹果id/密码一样,我已经提供了这两个值。它将显示我是否要确认我的付款,并在弹出窗口中显示产品名称和产品价格。点击“确定”后,我什么也没收到,甚至连苹果的一封邮件都没有,所以我如何证明我是否成功付款呢 b) 我还想在购买产品时更改我的登录id。但每次默认情况下,

我已经做了一个IAP的演示,我已经在apple帐户中注册了我的演示应用程序,我还添加了产品信息、说明、应用程序id、标题、priceTier、沙盒帐户,用于测试演示中描述的支付过程。我现在面临两个问题:-

a) 就像第一次弹出窗口要求输入苹果id/密码一样,我已经提供了这两个值。它将显示我是否要确认我的付款,并在弹出窗口中显示产品名称和产品价格。点击“确定”后,我什么也没收到,甚至连苹果的一封邮件都没有,所以我如何证明我是否成功付款呢

b) 我还想在购买产品时更改我的登录id。但每次默认情况下,它都会使用我以前的id,并显示密码框,仅用于输入密码。如何重置此设置?就像我尝试重新设置模拟器,并再次在iTunes的my apple a/c中添加新产品一样。因此,如果有人有任何想法,请随时提供帮助。在下面共享我的代码:-

    -(void)fetchAvailableProducts{
        if ([SKPaymentQueue canMakePayments])
        {
            SKProductsRequest *request = [[SKProductsRequest alloc]
                                          initWithProductIdentifiers:
                                          [NSSet setWithObject:kTutorialPointProductID]];
            request.delegate = self;

            [request start];
        }
        else

            NSLog(@"Please enable In App Purchase in Settings") ;
    }

    -(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
    {

        NSArray *products = response.products;
            if (products.count != 0)
        {
            _product = products[0];
            NSLog(@"procudt info is %@",_product.localizedTitle);

    //        _buyButton.enabled = YES;
    //        _productTitle.text = _product.localizedTitle;
    //        _productDescription.text = _product.localizedDescription;
            [self purchaseProducts];
        } else {
            //_productTitle.text = @"Product not found";
        }

        products = response.invalidProductIdentifiers;

        for (SKProduct *product in products)
        {
            NSLog(@"Product not found: %@", product);
        }
    }
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState) {
            case SKPaymentTransactionStatePurchased:
               [[SKPaymentQueue defaultQueue]
                 finishTransaction:transaction];
                 NSLog(@"Transaction complete");
                break;

            case SKPaymentTransactionStateFailed:
                NSLog(@"Transaction Failed");
                [[SKPaymentQueue defaultQueue]
                 finishTransaction:transaction];
                break;

            default:
                break;
        }
    }
}

首先,我只是使用我的产品id获取我的产品,我在委托方法中得到响应,如果计数>0,则将调用“purchaseProducts”方法。但问题是,我的委托方法没有被调用,在我点击“OK”购买产品后,什么也没有发生。请分享您的想法。

您好,请按照给定的步骤进行操作,希望能奏效-

首先检查用户是否可以付款-

-(void)checkForPayement{

//First check if user can make payments
if (![SKPaymentQueue canMakePayments]) {
    // Show the error that user can't make payments.
}else{
    // Make the product request on App Store
    SKProductsRequest *productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:IAP_PRODUCT_ID]];   // IAP_PRODUCT_ID is the product id which you got when you register the in-app-purchase
    productRequest.delegate = self;
    [productRequest start];
  }
}
如果产品可用,您将通过以下方法得到响应-

-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
if (response.products.count > 0) {
    SKProduct *validProduct = [response.products objectAtIndex:0];
    [self purchase:validProduct];
} else {
    // Product is not available so please cross check about the IAP_PRODUCT_ID
  }
}
-(void)request:(SKRequest *)request didFailWithError:(NSError *)error{  
    // Check here for the error
 }
如果请求失败,您将通过以下方法获得回调-

-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
if (response.products.count > 0) {
    SKProduct *validProduct = [response.products objectAtIndex:0];
    [self purchase:validProduct];
} else {
    // Product is not available so please cross check about the IAP_PRODUCT_ID
  }
}
-(void)request:(SKRequest *)request didFailWithError:(NSError *)error{  
    // Check here for the error
 }
开始购买

- (void)purchase:(SKProduct *)product{
SKPayment *payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}

您将在给定的方法中得到回调,您可以检查事务的状态-

-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions{
for (SKPaymentTransaction *transaction in transactions) {
    switch (transaction.transactionState) {
        case SKPaymentTransactionStatePurchasing:
            DDLogVerbose(@"Purchasing");
            break;

        case SKPaymentTransactionStateFailed:
            if (transaction.error.code == SKErrorPaymentCancelled) {
                // User has cancelled the transaction
            }
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            break;

        case SKPaymentTransactionStateRestored:

            DDLogVerbose(@"Restored");
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            break;

        case SKPaymentTransactionStatePurchased:
        {
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
           //  Payment has been done and you should provide the purchased content or you may verify the receipt also
            DDLogVerbose(@"Purchased");

        }
            break;

        default:
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            break;
    }
 }
}
-(void)paymentQueue:(SKPaymentQueue*)队列更新事务:(NSArray*)事务{
用于(SKPaymentTransaction*交易中的交易){
开关(transaction.transactionState){
案例SKPaymentTransactionStatePurchasing:
DDLogVerbose(@“采购”);
打破
案例SKPaymentTransactionState失败:
if(transaction.error.code==SKErrorPaymentCancelled){
//用户已取消交易
}
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
打破
案例SKPaymentTransactionStateRestored:
DDLogVerbose(@“还原”);
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
打破
案例SKPaymentTransactionStatesPurchased:
{
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
//付款已经完成,您应该提供购买的内容,或者您也可以验证收据
DDLogVerbose(@“购买”);
}
打破
违约:
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
打破
}
}
}
如果你想要更多的安全,那么你也可以

解决您的问题

a。在沙盒环境中测试应用内购买时,您将不会收到任何付款确认邮件,您可以在Storekit updatedTransactions委托方法中检查您的付款状态。在沙盒环境中不会扣除任何余额。在输入沙盒帐户详细信息后,还要检查iTunes帐户是否可以登录?如果没有,您的id可能无法验证,因此请验证您的id


b。在尝试应用内购买之前,只需从设置->iTunes&app Store注销apple id即可。点击apple id并单击注销。当您启动应用内购买时,请输入沙盒帐户凭据,不要在实际生产环境中登录沙盒帐户,因为这可能会使您的沙盒帐户无效。

您好,请按照给定的步骤操作,希望它能起作用-

首先检查用户是否可以付款-

-(void)checkForPayement{

//First check if user can make payments
if (![SKPaymentQueue canMakePayments]) {
    // Show the error that user can't make payments.
}else{
    // Make the product request on App Store
    SKProductsRequest *productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:IAP_PRODUCT_ID]];   // IAP_PRODUCT_ID is the product id which you got when you register the in-app-purchase
    productRequest.delegate = self;
    [productRequest start];
  }
}
如果产品可用,您将通过以下方法得到响应-

-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
if (response.products.count > 0) {
    SKProduct *validProduct = [response.products objectAtIndex:0];
    [self purchase:validProduct];
} else {
    // Product is not available so please cross check about the IAP_PRODUCT_ID
  }
}
-(void)request:(SKRequest *)request didFailWithError:(NSError *)error{  
    // Check here for the error
 }
如果请求失败,您将通过以下方法获得回调-

-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
if (response.products.count > 0) {
    SKProduct *validProduct = [response.products objectAtIndex:0];
    [self purchase:validProduct];
} else {
    // Product is not available so please cross check about the IAP_PRODUCT_ID
  }
}
-(void)request:(SKRequest *)request didFailWithError:(NSError *)error{  
    // Check here for the error
 }
开始购买

- (void)purchase:(SKProduct *)product{
SKPayment *payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}

您将在给定的方法中得到回调,您可以检查事务的状态-

-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions{
for (SKPaymentTransaction *transaction in transactions) {
    switch (transaction.transactionState) {
        case SKPaymentTransactionStatePurchasing:
            DDLogVerbose(@"Purchasing");
            break;

        case SKPaymentTransactionStateFailed:
            if (transaction.error.code == SKErrorPaymentCancelled) {
                // User has cancelled the transaction
            }
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            break;

        case SKPaymentTransactionStateRestored:

            DDLogVerbose(@"Restored");
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            break;

        case SKPaymentTransactionStatePurchased:
        {
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
           //  Payment has been done and you should provide the purchased content or you may verify the receipt also
            DDLogVerbose(@"Purchased");

        }
            break;

        default:
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            break;
    }
 }
}
-(void)paymentQueue:(SKPaymentQueue*)队列更新事务:(NSArray*)事务{
用于(SKPaymentTransaction*交易中的交易){
开关(transaction.transactionState){
案例SKPaymentTransactionStatePurchasing:
DDLogVerbose(@“采购”);
打破
案例SKPaymentTransactionState失败:
if(transaction.error.code==SKErrorPaymentCancelled){
//用户已取消交易
}
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
打破
案例SKPaymentTransactionStateRestored:
DDLogVerbose(@“还原”);
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
打破
案例SKPaymentTransactionStatesPurchased:
{
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
//付款已经完成,您应该提供购买的内容,或者您也可以验证收据
DDLogVerbose(@“购买”);
}
打破
违约:
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
打破
}
}
}
如果你想要更多的安全,那么你也可以

解决您的问题

a。在沙盒环境中测试应用内购买时,您将不会收到任何付款确认邮件,您可以在Storekit updatedTransactions委托方法中检查您的付款状态。在沙盒环境中不会扣除任何余额。在输入沙盒帐户详细信息后,还要检查iTunes帐户是否可以登录?如果没有,您的id可能无法验证,因此请验证您的id。