繁体   English   中英

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

[英]Receipt validation on iOS In-App-Purchase returns multiple transaction

沙箱模式下的应用内购买会在同一产品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)")
    }
}

响应:

响应:

问题:

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

  • 这种反应是否正确

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

我尝试了苹果和堆栈溢出的一些链接,但仍然有理解这一点。 有人可以形容我所有这些。

我认为您已经在应用购买中实施了汽车可更新。 你的回答是正确的。

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

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

这种反应是否正确

如果正确,则验证哪个ID

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

阅读此Apple文档以获得正确理解。

自动更新订阅的行为在测试环境和生产环境之间有所不同。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM