iOS в квитанции о покупке приложения, пропущенные последние транзакции - PullRequest
0 голосов
/ 25 апреля 2019

Я могу читать квитанции для покупки в приложении (в песочнице). Я хочу проверить их для проверки отмененной подписки. Но проблема в том, что когда я подписываюсь на любой продукт, я получаю значение « транзакция_id », но когда я перезапускаю свое приложение и снова получаю квитанции, мое предыдущее значение « транзакция_ид » отсутствует. Я хочу, чтобы мой подписанный 'action_id ' всегда отображался в моем массиве квитанций.

Вот мой код:

func receiptValidation() {

    let receiptFileURL = Bundle.main.appStoreReceiptURL
    let receiptData = try? Data(contentsOf: receiptFileURL!)
    let recieptString = receiptData?.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
    let jsonDict: [String: AnyObject] = ["receipt-data" : recieptString! as AnyObject, "password" : "My-App-Shared-Secret" as AnyObject]
    do {
        let requestData = try JSONSerialization.data(withJSONObject: jsonDict, options: JSONSerialization.WritingOptions.prettyPrinted)
        let verifyReceiptURL = "https://sandbox.itunes.apple.com/verifyReceipt"
        let storeURL = URL(string: verifyReceiptURL)!
        var storeRequest = URLRequest(url: storeURL)
        storeRequest.httpMethod = "POST"
        storeRequest.httpBody = requestData

        let session = URLSession(configuration: URLSessionConfiguration.default)
        let task = session.dataTask(with: storeRequest, completionHandler: { [weak self] (data, response, error) in
            do {
                let jsonResponse = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers)
                print("=======>",jsonResponse)
                if let date = self?.getExpirationDateFromResponse(jsonResponse as! NSDictionary) {
                    print(date)
                }
            } catch let parseError {
                print(parseError)
            }
        })
        task.resume()
    } catch let parseError {
        print(parseError)
    }
}

func getExpirationDateFromResponse(_ jsonResponse: NSDictionary) -> Date? {

    if let receiptInfo: NSArray = jsonResponse["latest_receipt_info"] as? NSArray {

        let lastReceipt = receiptInfo.lastObject as! NSDictionary

        // Get last receipt
        print("LAST RECEIPT INFORMATION \n",lastReceipt)

        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss VV"
        formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") as Locale

        if let expiresDate = lastReceipt["expires_date"] as? String {
            print("\n   - DATE SUBSCRIPTION EXPIRES = \(expiresDate)")
            return formatter.date(from: expiresDate)
        }

        return nil
    }
    else {
        return nil
    }
}

Любая помощь будет оценена.

Спасибо

1 Ответ

0 голосов
/ 15 мая 2019

Я думаю, вам не следует полагаться на transaction_id для проверки отмененных подписок.

В соответствии с документацией Apple (ищите "action_id "), со временем она может измениться:

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

Вместо этого было бы лучше использовать самую последнюю версию expires_date из массива latest_receipt_info.
Сравните его с сегодняшней датой, чтобы проверить, истек ли срок действия подписки.


Это поле также может поддерживать ваш вариант использования: auto_renew_status

Как в (из проверочного ответа JSON Apple):

{
  "status": 0,
  "environment": "Sandbox",
  "receipt": {...},
  "latest_receipt_info": [{...}],
  "latest_receipt": "...",
  "pending_renewal_info": [
    {
      "auto_renew_product_id": "<yourAutoRenewProductID>",
      "original_transaction_id": "<transacionID>",
      "product_id": "<yourProductID>",
      "auto_renew_status": "1" <<=== This one here
    }
  ]
}

«1» - подписка будет возобновлена ​​в конце текущей подписки период.

"0" - клиент отключил автоматическое продление для своих подписки.

Имейте в виду:

Этот ключ присутствует только для автоматически обновляемых квитанций подписки, для активные или просроченные подписки. Значение для этого ключа не должно быть интерпретируется как статус подписки клиента. Вы можете использовать это значение для отображения альтернативного продукта подписки в вашем приложении, для Например, план подписки более низкого уровня, который клиент может понизить до их текущего плана.


Если вам ДЕЙСТВИТЕЛЬНО нужно знать оригинал transaction_id, тогда есть поле original_transaction_id. Снова от Apple:

Это значение одинаково для всех квитанций, сгенерированных для конкретная подписка. Это значение полезно для взаимосвязи несколько квитанций в стиле iOS 6 для одного и того же человека подписка клиента.

Но, исходя из того, что вы написали, это кажется слишком сложным. ¯\_(ツ)_/¯

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