【问题标题】:iOS- In app purchase working proper in sandbox environment, Appstore version content not unlockediOS-在沙盒环境中正常运行的应用程序购买,Appstore 版本内容未解锁
【发布时间】:2017-12-30 14:42:00
【问题描述】:

在沙盒环境中进行应用内购买,但在 Appstore 版本中从用户帐户中扣除金额但内容未解锁。

我认为编码没有问题。否则,它将无法在沙盒环境中工作。我认为交易收据可能为零。

当我再次点击购买时,它显示“您已经订阅”。但是,它并没有解锁应用内容。即使我点击恢复购买,但它也不起作用。我很惊讶为什么一切都在沙盒环境中运行。

订阅类型:自动续订。 内容解锁:音频、视频和pdf教程。
我检查了后端日志。 API 从未执行过,我填写的唯一问题是,即使用户成功购买,我也没有收到应用商店收据。一切都在沙盒环境中完美运行。

代码:

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

        for transaction in transactions {

            switch transaction.transactionState {
            case .purchasing:
                handlePurchasingState(for: transaction, in: queue)
            case .purchased:
                handlePurchasedState(for: transaction, in: queue)
            case .restored:
                handleRestoredState(for: transaction, queue: queue)
            case .failed:
                handleFailedState(for: transaction, in: queue)
            case .deferred:
                handleDeferredState(for: transaction, in: queue)
            }
        }
    }

//On transaction state changed to purchased:
func handlePurchasedState(for transaction: SKPaymentTransaction, in queue: SKPaymentQueue) {
        print("User purchased product id: \(transaction.payment.productIdentifier)")
        print("User purchased product id: \(transaction)")
        queue.finishTransaction(transaction)
        self.completeTransaction(transaction:transaction)
    }

//In completeTransaction Method:
func completeTransaction(transaction:SKPaymentTransaction)
    {
        if let receiptURL = Bundle.main.appStoreReceiptURL,FileManager.default.fileExists(atPath: receiptURL.path)
        {
            let receipt:Data = try! Data(contentsOf: receiptURL)
            let jsonObjectString = receipt.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0))
            var strIdentifier:String = transaction.transactionIdentifier!

            if let identifier = transaction.original?.transactionIdentifier
            {
                strIdentifier = identifier
            }

        //API call to save receipt to validate later and unlock the content
        //In case API calling failed then I stored data and called API again on app home page.
        }
    }

【问题讨论】:

  • 我们需要更多细节:这是什么类型的 IAP,它解锁什么类型的内容并发布您的代码。通常解锁内容是您的应用程序的责任,所以我不排除编码问题!
  • 我已根据您的要求编辑了问题。请检查。谢谢。
  • 好的,那么您是否尝试过使用 refreshReceiptRequest 刷新收据,如this SO question的回答中所述
  • 是的,事实并非如此。我已将日志添加到代码中的任何位置,并将新版本上传到存储。现在我检查了日志,收据没有问题。当我进行购买时,调用支付队列委托方法并从帐户中扣除用户的金额。但是 transaction.transactionState 返回失败。为什么会这样?

标签: ios in-app-purchase


【解决方案1】:

验证收据后请完成交易 queue.finishTransaction(transaction)

Apple 还建议“在完成交易之前下载所有 Apple 托管的内容。交易完成后,其下载对象将无法再使用。”​​

https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/DeliverProduct.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-04
    • 2023-03-12
    • 2012-11-29
    • 2021-01-29
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    相关资源
    最近更新 更多