我想知道,在一次成功的购买之后,我如何才能获得交易id或收据信息,这样我就可以发送到我的服务器并用于购买验证。同样在这个主题上,我想知道如果由于某种原因,在向服务器发送购买信息之前,连接被中断了,那么我将如何将通知链接到购买订阅的用户呢?
谢谢
因此,我想在下面开关的.purchased部分执行我的处理
import Foundation
import StoreKit
class StoreManager: NSObject, ObservableObject, SKProductsRequestDelegate, SKPaymentTransactionObserver {
//FETCH PRODUCTS
var request: SKProductsRequest!
@Published var myProducts = [SKProduct]()
func getProducts(productIDs: [String]) {
print("Start requesting products ...")
let request = SKProductsRequest(productIdentifiers: Set(productIDs))
request.delegate = self
request.start()
}
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
print("Did receive response")
if !response.products.isEmpty {
for fetchedProduct in response.products {
DispatchQueue.main.async {
self.myProducts.append(fetchedProduct)
}
}
}
for invalidIdentifier in response.invalidProductIdentifiers {
print("Invalid identifiers found: \(invalidIdentifier)")
}
}
func request(_ request: SKRequest, didFailWithError error: Error) {
print("Request did fail: \(error)")
}
//HANDLE TRANSACTIONS
@Published var transactionState: SKPaymentTransactionState?
func purchaseProduct(product: SKProduct) {
if SKPaymentQueue.canMakePayments() {
let payment = SKPayment(product: product)
SKPaymentQueue.default().add(payment)
} else {
print("User can't make payment.")
}
}
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch transaction.transactionState {
case .purchasing:
transactionState = .purchasing
case .purchased:
UserDefaults.standard.setValue(true, forKey: transaction.payment.productIdentifier)
queue.finishTransaction(transaction)
transactionState = .purchased
case .restored:
UserDefaults.standard.setValue(true, forKey: transaction.payment.productIdentifier)
queue.finishTransaction(transaction)
transactionState = .restored
case .failed, .deferred:
print("Payment Queue Error: \(String(describing: transaction.error))")
queue.finishTransaction(transaction)
transactionState = .failed
default:
queue.finishTransaction(transaction)
}
}
}
func restoreProducts() {
print("Restoring products ...")
SKPaymentQueue.default().restoreCompletedTransactions()
}
}
发布于 2021-06-20 20:18:22
你可以试试这个-
if let url = Bundle.main.appStoreReceiptURL,
let data = try? Data(contentsOf: url) {
let receiptBase64 = data.base64EncodedString()
// Send to server
}
更新
想知道,如果连接在接收字符串被发送到我的服务器之前被中断了,并且由于某种原因,用户会在我处理之前删除应用程序或其他东西,那么您会推荐什么呢?
needsToSendPurchaseReceiptToServer
的变量在UserDefaults中存储一个true
值。在api调用成功完成后,false
。如果API调用失败,请不要更新UserDefaults值。H 212H 113
下次从后台启动/或恢复应用程序时,您将检查此标志,如果它仍然是d15,则尝试再次向服务器发送收据。H 216H 117应该不需要向用户提供任何通知。在此情况下多次失败时,H 119<>代码用户仍然应该能够通过Restore Purchase选项手动触发.
https://stackoverflow.com/questions/68059703
复制相似问题