【问题标题】:InApp purchase incomplete paymentInApp购买不完整支付
【发布时间】:2017-04-04 01:55:08
【问题描述】:

我已经做了一个 IAP 的演示,并且我已经在苹果帐户中注册了我的演示应用程序,我还添加了产品信息、描述、应用程序 ID、标题、价格层、沙盒帐户,用于测试支付过程为演示中描述。我现在面临两个问题:-

a) 就像弹出窗口第一次要求输入 apple-id/password 一样,我已经提供了这两个值。它将显示我是否要确认我的付款,并在该弹出窗口中显示产品名称和产品价格。单击“确定”后,我什至没有收到来自 Apple 的邮件,所以我如何证明我是否已成功付款。

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

    -(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”方法。但问题是我的委托方法没有被调用,在我点击“确定”购买产品后什么也没有发生。请分享您的想法。

【问题讨论】:

    标签: ios objective-c xcode in-app-purchase


    【解决方案1】:

    你好,按照给定的步骤,希望它有效-

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

    -(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)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;
        }
     }
    }
    

    如果您想要更多安全性,也可以Verify receipt from app store

    解决您的问题

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

    b.在尝试应用内购买之前,只需从“设置”->“iTunes 和 App Store”中注销 Apple id。点击apple id,然后点击注销。并且当您启动应用内购买时,请输入沙盒帐户凭据,并且不要在实际生产环境中登录沙盒帐户,因为它可能会使您的沙盒帐户失效。

    【讨论】:

    • 感谢您提供非常好的解释,因此我接受了您的回答。实际上,在此之前,我在另一个支付网关上工作,并且在沙箱环境中,我在付款后收到了一封测试电子邮件。支付网关的名称是 Telr Payment Gateway。 Pooja 岩石。
    猜你喜欢
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多