InApp purchase get stuck in paymentQueue purchasing status.

Some of my users reported they can not completed the purchase . According to the logs and screen captures . Their purchase progress's last status are "purchasing"


    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {

....
....
              case .purchasing:
                  
                  // 处理正在购买的情况
                  //print("购买中");
                  AppDelegate.log.debug("paymentQueue purchasing");
                  LoadingAlert.shared.setText(text: "购买中".localized())

....

After this ,It neither entered any error branch nor prompted the user to confirm the purchase or enter a password, but simply stopped here. There are no other purchase-related logs, and the program is still running normally.

At the same time, other users are able to complete their purchases without any issues. However, there have been 4-5 users recently who reported problems with purchasing. What could be the possible reasons?

In my local environment, I repeated the test many times, including using sandbox users from different regions and real Apple IDs, and everything worked fine.

//
//  Payment.swift
//  RadialMenu
//
//  Created by pat on 2023/6/26.
//

import Foundation
import StoreKit

class Payment:NSObject,SKProductsRequestDelegate,SKPaymentTransactionObserver{

    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        
          
        
          for transaction in transactions {
              
              AppDelegate.log.debug("paymentQueue transaction product = \(transaction.payment.productIdentifier) state = \(transaction.transactionState)");
              
              
              //let productID = transaction.payment.productIdentifier
              
              switch transaction.transactionState {
              case .purchased,.restored:
                  
        
                  if(transaction.transactionState == .purchased){
                      
                      AppDelegate.log.debug("paymentQueue purchased");
                      
                      LoadingAlert.shared.setText(text: "已购买".localized())
                  }
                  
                  if(transaction.transactionState == .restored){
                      LoadingAlert.shared.setText(text: "已恢复".localized())
                      
                      AppDelegate.log.debug("paymentQueue restored");
                  }
                  
 
                  
                  //}
                  break;
              case .failed:
                  
                  AppDelegate.log.debug("paymentQueue failed ");
                  
                  
                  if let error = transaction.error as? NSError {
                           // 获取错误代码和描述
                           let errorCode = error.code
                           let errorDescription = error.localizedDescription
                           
                      AppDelegate.log.debug("paymentQueue Transaction failed with error code: \(errorCode), description: \(errorDescription)")
                           
        
                  }
                  
                  queue.finishTransaction(transaction)
                  
                  LoadingAlert.shared.hideModal();
                  // 处理购买失败的情况
                  // 提供错误信息给用户
                  //print("购买失败");
                  alertRetry();
                  

                  break;
              case .deferred:
                  
                  AppDelegate.log.debug("paymentQueue deferred");
                  LoadingAlert.shared.setText(text: "购买延迟".localized())
                  // 处理交易延迟的情况(仅限家庭共享)
                  break;
              case .purchasing:
                  
                  // 处理正在购买的情况
                  //print("购买中");
                  AppDelegate.log.debug("paymentQueue purchasing");
                  LoadingAlert.shared.setText(text: "购买中".localized())
                  break;
              @unknown default:
                  AppDelegate.log.debug("paymentQueue nknown default\(transaction.transactionState)");
                  break
              }
          }
      }

InApp purchase get stuck in paymentQueue purchasing status.
 
 
Q