在应用程序内购买工作在沙箱环境中,但在应用程序商店版本金额从用户帐户借记,但内容未解锁。
我不认为在编码方面有问题。否则,它将无法在沙箱环境中工作。我认为有可能交易收据为零。
当我再次点击购买时,它显示“您已经订阅”。但是,它仍然没有解锁应用程序的内容。即使我点击恢复购买,但它也不起作用。我很惊讶为什么一切都能在沙箱环境中工作。
订阅类型:自动续费。内容解锁:音频、视频和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.
}
}发布于 2018-02-07 15:35:24
请在验证收款queue.finishTransaction(交易)后完成交易
苹果还建议“在完成交易之前下载所有苹果托管的内容。交易完成后,其下载对象将不能再被使用。”
https://stackoverflow.com/questions/48034951
复制相似问题