【发布时间】: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