iOS应用内购买的收据验证返回多个交易

4

沙盒模式下的应用内购买会返回同一产品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

我已经尝试过苹果和stackoverflow的一些链接,但仍然对此有疑问。请有人能告诉我关于这些内容的所有信息。


嗨,我们需要在哪里实现这个函数? - NaveedUlHassan5
2个回答

3

我认为您已经在应用内实现了自动续订购买。您的响应是正确的。

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

如您所述,在测试环境中,每5分钟自动续订一次产品(而不是App Store中的1个月)。因此会有多个交易。

这个响应是否正确

是的。

如果正确,要验证哪个ID

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

阅读此苹果文档以获得更好的理解。

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

在测试环境中,订阅续订以加速的速度进行,自动续订订阅每天最多续订六次。这使您可以测试应用程序如何处理订阅续订、订阅中断以及包含间隙的订阅历史记录。请参阅iTunes Connect中应用内购买配置指南中有关测试订阅期限的内容。

由于加速的过期和续订速率,订阅可能会在系统尝试续订订阅之前过期,导致订阅期间出现小间隙。这种间隙也可能因多种原因在生产环境中发生,请确保您的应用程序正确处理它们。


谢谢您的回复。我的问题是,5分钟的间隔是沙箱的默认设置吗?如果是的话,我们能否增加持续时间? - Prajnaranjan Das
不,这是默认设置以在沙盒中检查自动续订行为。您无法增加此时间。 - technerd
我不确定确切的次数,但可能会更新将近6次。尝试通过此链接进行自动续订应用内购买测试时可能会有些棘手。 https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Subscriptions.html#//apple_ref/doc/uid/TP40008267-CH7-SW8 - technerd
非常有用。我一开始就读了那篇文章,但不知道苹果在狂热什么。 - pnizzle

0

您正在使用自动续订订阅。每次自动续订或订阅续订都会生成一个收据。

通常情况下,如果订阅已经续订了5次,则在沙盒环境中会有5个收据,在真实环境(从AppStore下载的生产环境)中会有6个收据。因为对于从AppStore下载或购买的应用程序也会生成一个收据。


感谢@Prateek Sujaina的回复。我明白了 :) - Prajnaranjan Das

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接