iOS In-App-Purchase上的收据验证返回多个交易

时间:2018-02-15 11:28:25

标签: ios swift in-app-purchase swift4

沙盒模式下的应用内购买会在同一产品ID上返回多个交易。

使用的语言:Swift 4.0

func validateAppReceipt(_ receipt: Data) {
    let base64encodedReceipt = receipt.base64EncodedString()
    print(base64encodedReceipt)
    let requestDictionary = ["receipt-data":base64encodedReceipt]
    guard JSONSerialization.isValidJSONObject(requestDictionary) else {  print("requestDictionary is not valid JSON");  return }
    do {
        let requestData = try JSONSerialization.data(withJSONObject: requestDictionary)
        let validationURLString = "https://sandbox.itunes.apple.com/verifyReceipt"  // this works but as noted above it's best to use your own trusted server
        guard let validationURL = URL(string: validationURLString) else { print("the validation url could not be created, unlikely error"); return }
        let session = URLSession(configuration: URLSessionConfiguration.default)
        var request = URLRequest(url: validationURL)
        request.httpMethod = "POST"
        request.cachePolicy = URLRequest.CachePolicy.reloadIgnoringCacheData
        let task = session.uploadTask(with: request, from: requestData) { (data, response, error) in
            if let data = data , error == nil {
                do {
                    print(data)
                    let appReceiptJSON = try JSONSerialization.jsonObject(with: data)
                    print("success. here is the json representation of the app receipt: \(appReceiptJSON)")
                    self.getAppReceipt()
                } catch let error as NSError {
                    print("json serialization failed with error: \(error)")
                }
            } else {
                print("the upload task returned an error: \(error)")
            }
        }
        task.resume()
    } catch let error as NSError {
        print("json serialization failed with error: \(error)")
    }
}

响应:

Response:

问题:

  • 为什么我在同一个ID上获得多笔交易

  • 此回复是否正确

  • 如果正确,要验证哪个ID

我尝试了一些来自苹果和堆栈溢出的链接,但仍然对此有所怀疑。有人可以形容我所有这些。

2 个答案:

答案 0 :(得分:2)

我认为您已在应用购买中实施了自动续订。 你的回答是正确的。

为什么我在同一个ID上获得多笔交易

与每5分钟为自动续订产品执行的响应交易一样(沙盒环境在5分钟内更新产品,而不是在App Store中续订1个月)。

此回复是否正确

如果正确,需要验证哪个ID

您必须获取产品ID tfc.premium.subscription的所有交易,然后获取最后一个对象并将其用作最新/最后一笔交易。

请阅读此Apple Document以获得正确理解。

  

自动续订订阅的行为不同   测试环境和生产环境。

     

在测试环境中,订阅续订发生在   加速率和自动续订订阅最多续订   每天六次。这使您可以测试应用程序处理的方式   订阅续订,订阅失效和订阅历史记录   这包括差距。请参阅测试中的自动可续订订阅   iTunes应用程序内购买配置指南了解   测试的订阅持续时间。

     

由于加速到期和续订率,a   订阅可以在系统尝试续订之前到期   订阅,在订阅期内留下一小段失误。这样   由于各种原因,生产中也可能出现失误   确保您的应用正确处理它们。

答案 1 :(得分:0)

您正在使用自动续订订阅。每次自动续订或续订订阅都会有一张收据。

一般来说,如果订阅已续订5次,那么沙盒环境中将有5个收据,而实际环境中将有6个收据(生产环境,从AppStore下载)。因为还为从AppStore下载或购买的应用生成了收据。