Что делать, если покупка iOS не прошла проверку? - PullRequest
0 голосов
/ 20 сентября 2019

У меня тот же вопрос, что и в этом посте: Что, если проверка квитанции о покупке iOS не удалась?

Я прочитал решение из этого поста, но у меня все еще есть пара вопросов

Он сказал If anything goes wrong in between step 1 to 5 your app still has access to the transaction in the SKPaymentQueue and can 'reprocess' it. Что я понимаю, что SKPaymentQueue сохранит мои транзакции подобно UserDefault, не так ли?

Так что, если я удалю свое приложение?Я потерял приложение транзакций?

1 Ответ

1 голос
/ 20 сентября 2019

SKPaymentQueue не будет сохранять транзакции в ваши UserDefaults.Однако в квитанции App Store сохраняется все, кроме покупок расходных материалов.И если шаг 5 не завершен, вы всегда можете повторить проверку квитанции от Apple, поскольку квитанция хранится на устройстве и переустанавливается при каждой переустановке приложения.

Используете ли вы какие-либо библиотеки, которые обрабатывают процесс оплаты?Основной процесс покупки выглядит следующим образом:


func makePurchase(product: SKProduct){
   let payment = SKPayment(product: product)
    SKPaymentQueue.default().add(payment)
}

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
            switch (transaction.transactionState) {
            case .purchased:
                SKPaymentQueue.default().finishTransaction(transaction)
                handlePurchased()
                break
            case .failed:
                SKPaymentQueue.default().finishTransaction(transaction)
                break
            case .restored:
                SKPaymentQueue.default().finishTransaction(transaction)
                handlePurchased()
                break
            case .deferred, .purchasing:
                break
            default:
                break
            }
        }
    }

func handlePurchased(){
    guard let receiptUrl = Bundle.main.appStoreReceiptURL else {   
       // refresh receipt using SKReceiptRefreshRequest          
       return
    }
    #if DEBUG
        let urlString = "https://sandbox.itunes.apple.com/verifyReceipt"
    #else 
        let urlString = "https://buy.itunes.apple.com/verifyReceipt"
    #endif
    let receiptData = try? Data(contentsOf: receiptUrl).base64EncodedString()
    let requestData = ["receipt-data" : receiptData ?? "", "password" : "YOUR_SHARED_SECRET", "exclude-old-transactions" : true] as [String : Any]
    var request = URLRequest(url: URL(string: urlString)!)
    request.httpMethod = "POST"
    request.setValue("Application/json", forHTTPHeaderField: "Content-Type")
    let httpBody = try? JSONSerialization.data(withJSONObject: requestData, options: [])
    request.httpBody = httpBody
    URLSession.shared.dataTask(with: request)  { (data, response, error) in
        DispatchQueue.main.async {
            if data != nil, let json = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) {
                    // parse your receipt data here, get expires date for subscription or whatever your in-app type is.
            } else {
                // Error occurred while validating receipt.
                // You can ask user to restore completed transactions. 
                // Or restore automatically
                // But make sure you don't make infinite loop
            }
        }
    }.resume()
}

Полный текст статьи о процессе оплаты и подтверждении получения вы можете получить здесь: https://blog.apphud.com/swift-tutorial-subscriptions/

Я являюсь автором этого блога.Речь идет об автообновляемых подписках, но процесс покупки и проверки такой же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...