支付队列 - 交易失败

Iva*_*van 0 in-app-purchase ios swift swift3

我正在构建具有应用内购买功能的应用。该应用程序有 6 种产品在售(均为消耗品)。

该应用程序能够使用以下代码识别可购买的产品(来自 iTunes Connect):

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


    //Apple Store
    appleStoreProducts = [productID, product5ID, product25ID, product100ID, product500ID, product1000ID]
    SKPaymentQueue.default().add(self)
    self.getProductInfo()
}

func getProductInfo() {
    if SKPaymentQueue.canMakePayments() {

        for product in appleStoreProducts {
         let request = SKProductsRequest(productIdentifiers: NSSet(objects: product) as! Set<String>)
        request.delegate = self
        request.start()
        }
    } else {
        // Tell user that In-App Purchase is disabled in settings

        print("In-App Purchase is disabled in settings")
    }
}

func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {

    var products = response.products

    if (products.count != 0) {
        let newProduct = products[0]
        switch newProduct.localizedTitle {
        case "DOLLAR":
            product = newProduct
        case "five dollars":
            product2 = newProduct
        case "twenty five":
            product3 = newProduct
        case "one hundred dollars":
            product4 = newProduct
        case "thousand dollars":
            product5 = newProduct
        default:
            print("none of the above")
        }

        print("titile : \(newProduct.localizedTitle) \n description: \(newProduct.localizedDescription)")
    }
    else {
        print("Product not found")
    }

    let invalids = response.invalidProductIdentifiers

    for product in invalids {
        print("Product not found: \(product)")
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以单击一个按钮来购买其中一件商品,例如:

  @IBAction func productOne(_ sender: Any) {
    let payment = SKPayment(product: product!)
    SKPaymentQueue.default().add(payment)
}
Run Code Online (Sandbox Code Playgroud)

当调用 paymentQueue 方法时,接下来出现我的问题:

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

    for transaction in transactions {

        switch transaction.transactionState {

        case SKPaymentTransactionState.purchased:
        //  self.pointsBought()
            SKPaymentQueue.default().finishTransaction(transaction)

        case SKPaymentTransactionState.failed:
             SKPaymentQueue.default().finishTransaction(transaction)
            print("transaction failed")
        default:
            print("ESTDO:  \(transaction.transactionState)")
            break
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

当我单击一次按钮时,此方法会被调用两次。第一次 transactionState 既不是“已购买”也不是“失败”,因此它调用默认选项。第二次结果是“失败”。但是,我不知道我做错了什么。

相关信息:我正在使用 iOS 设备(iphone 6)运行应用程序我在我的 iphone 中使用(应用程序的)开发者帐户

mat*_*att 5

您未能涵盖所有情况。您需要涵盖所有这些,并且您需要finishTransaction为某些情况打电话。这是正确updatedTransactions方法的格式:

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for t in transactions {
        switch t.transactionState {
        case .purchasing, .deferred: break // do nothing
        case .purchased, .restored:
            let p = t.payment
            if p.productIdentifier == whatever {
                // ... do stuff ...
                queue.finishTransaction(t)
            }
        case .failed:
            queue.finishTransaction(t)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)