Как реализовать проверку квитанции об автоматическом продлении подписки iOS для приложения iOS

Я хочу опубликовать приложение для iOS с автоматическим продлением подписки. Хотя информации по этому поводу очень много, многое уже устарело, поэтому я расскажу, чего я уже достиг.

  1. Я работаю в Swift 2.0, поэтому ни один объективный код на C мне не поможет.

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

  3. Мне удалось найти квитанцию ​​на устройстве (не уверен, что их несколько), используя следующий код

    func checkForReceipt() {
        let receiptUrl = NSBundle.mainBundle().appStoreReceiptURL
    
        let fileExists = NSFileManager.defaultManager().fileExistsAtPath(receiptUrl!.path!)
    
        if fileExists {
    
            let receiptData = NSData(contentsOfURL: receiptUrl!)
    
            //Now what do I do to decode the data and validate the receipt
    
        } else{
            requestReceipt()
        }
    }
    

Однако я не могу понять, как расшифровать квитанцию, чтобы затем определить срок годности и другие шаги проверки, чтобы убедиться, что квитанция действительна.

Я должен сказать, что очень расстраивает то, что что-то очень важное и полезное для разработчиков становится настолько трудным для отслеживания и поиска. Любая помощь приветствуется и, надеюсь, будет полезна многим другим.


person gbotha    schedule 23.11.2015    source источник


Ответы (1)


Вот ссылка Я нашел полезным

Обратитесь к нему, если мой код был непонятен

Ниже приведен функциональный код, который я использовал для проверки статуса подписки моего ar-iap.

Читайте ниже дополнительную информацию о каждом соответствующем * найденном в качестве комментария.

func checkForReceipt() {
    let receiptUrl = NSBundle.mainBundle().appStoreReceiptURL

    let fileExists = NSFileManager.defaultManager().fileExistsAtPath(receiptUrl!.path!)

    if fileExists {

        let receiptData = NSData(contentsOfURL: receiptUrl!)

        let receiptToString = receiptData!.base64EncodedStringWithOptions([])
        let dict = ["receipt-data" : receiptToString, "password" : "YOUR SHARED SECRET"] //**
        do {
            let request = try NSJSONSerialization.dataWithJSONObject(dict, options: []) as NSData!
            let storeURL = NSURL(string:"https://sandbox.itunes.apple.com/verifyReceipt")! //***
            let storeRequest = NSMutableURLRequest(URL: storeURL)
            storeRequest.HTTPMethod = "POST"
            storeRequest.HTTPBody = request

            let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
            let dataTask = session.dataTaskWithRequest(storeRequest, completionHandler: { (data: NSData?, response: NSURLResponse?, connection: NSError?) -> Void in
                do {
                    let jsonResponse: NSDictionary = try (NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary)!
                    //****
                    let expDate: NSDate = self.expirationDateFromResponse(jsonResponse)!
                    print(expDate)
                } catch {
                     //handle NSJSONSerialization errors
                }

            })
            dataTask.resume()
        } catch {
            //handle NSJSONSerialization errors
        }
    } else {
        requestReceipt()
    }
}

** Вы можете получить общий секрет из своей учетной записи iTunes Connect: перейдите в «Мои приложения»> «yourappname»> «Возможности»> «Просмотреть общий секрет»> «Создать общий секрет», затем вставьте сгенерированный секрет в поле пароля в dict.

*** не забудьте изменить storeURL на "https://buy.itunes.apple.com/verifyReceipt "при переходе к производству

**** expirationDateFromResponse (jsonResponse: NSDictionary) -> NSDate? - это функция, которая считывает ответ Apple json и возвращает дату истечения срока действия ar iap

person MrByte11    schedule 08.01.2016
comment
Обратите внимание на следующий комментарий в документации Apple, ссылка на которую приведена выше: Важно: не вызывайте конечную точку App Store / verifyReceipt из своего приложения. Вместо этого вы захотите либо а) отправить квитанцию ​​на свой собственный серверный бэкэнд для проверки, который, в свою очередь, будет вызывать / verifyReceipt на сервере Apple, или б) проверять квитанцию ​​локально с помощью OpenSSL / ASN.1, как описано здесь: developer.apple.com/library/archive/release/archive/ - person Frederik; 09.08.2018