ios - InApp购买未完成付款

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

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

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

b) 我还想在购买产品时更改我的登录 ID。但是每次默认情况下都是使用我以前的 ID 并只显示密码框来输入密码。如何重置此设置?就像我尝试重置模拟器并再次在 iTunes 中的我的苹果 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 获取我的产品,我在委托(delegate)方法中得到响应,如果计数 >0,则将调用“purchaseProducts”方法。但问题是我的委托(delegate)方法没有被调用,在我点击“确定”购买产品后没有任何反应。请分享您的想法。

最佳答案

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

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

-(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 委托(delegate)方法中检查您的付款状态。并且在沙盒环境下不会扣除余额。输入沙盒帐户详细信息后,还要检查iTunes帐户是否可以登录?否则,您的 ID 可能未经过验证,因此请验证您的 ID。

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

关于ios - InApp购买未完成付款,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43187654/

相关文章:

objective-c - 没有正确使用 NSLock,但似乎仍然有效

ios - 适用于 iOS 的 Google Maps SDK 要求 GoogleMaps.bundle 成为“复制捆绑资源”下目标的一部分

xcode - 如何从组织者左侧菜单中删除应用程序

android - 在 iOS 上不接收通知 react-native-push-notification

ios - 向 MKUserTrackingBarButtonItem 添加操作

ios - 无法使用iOS Swift在Google map 上加载自定义图 block

ios - 字节缓冲区 NSData

ios - UIImagepickercontroller 不选择图像

ios - UIImage(从路径)到 NSData 导致崩溃

iphone - 如何将 UITableViewController 中选定行的数量传递/发送到另一个类?