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

2024-02-21

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

这个回应是否正确

Yes

如果正确,验证哪个ID

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

读这个苹果文档 https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Subscriptions.html#//apple_ref/doc/uid/TP40008267-CH7-SW8以便正确理解。

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

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

由于过期和续订率加快, 订阅可能会在系统尝试续订之前过期 认购,在认购期间留下一个小间隔。这样的 由于多种原因,生产中也可能出现失误—— 确保您的应用程序正确处理它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 应用内购买上的收据验证返回多笔交易 的相关文章

随机推荐

  • 无法运行从 spring-boot jersey 生成的 jar

    我无法使用带有 jersey 项目的 spring boot 运行生成的 jar 文件 我遇到的例外是 Error starting Tomcat context Exception org springframework beans fa
  • 如果验证后我决定将元素移回原处,如何将 jquery-uidraggable 恢复为 true?

    我正在寻找一种方法 如果某些内容未验证 则从恢复状态触发事件 例如 如果元素不存在 它将从另一个列表中创建它 但如果它已经存在 则应该转到 else 并将元素返回到其原来的位置 catalog ul droppable tolerance
  • 如何在 Java 中使用 Scala 单例对象?

    我有一个需要在 Java 类中使用的 Scala 对象 这是 Scala 对象 object Person val MALE m val FEMALE f 如何在 Java 中使用这个 Scala 对象 到目前为止 我已尝试以下操作但没有成
  • 使用私有 git 存储库来阅读文档

    我安装了 read the docs 以从需要用户 密码身份验证的私有 git 存储库上的项目开始生成文档 手动导入项目时 如何输入用户名和密码以允许阅读文档克隆存储库 非常感谢 最大限度 我最近遇到了同样的问题 这里还有一个这样的问题为什
  • DataGrid 选项卡导航跳过列

    我在 WPF 中有一个带有模板列的数据网格 网格中的几列是只读的 其他焦点变为可编辑 而不是出现标签 文本框 复选框等 我想要实现的是 当我在网格的列中进行切换时 只读列将被跳过 有人知道如何实现这一目标吗 谢谢 弗拉丹 不 不工作 这是完
  • 如何实现自定义 UIDynamicBehavior 操作

    我一直在寻找一个示例 展示如何在 UIKit 动态中实现自定义 UIDynamicBehavior 所有教程和示例仅展示如何使用基元 碰撞 重力 附件 推动 捕捉等 组装 UIDynamicBehavior 在我的应用程序中 一些视图在屏幕
  • 在 Commodore 64 中绘制屏幕边框

    我的好奇心已经持续了 25 年 我很想了解其中的奥秘 在 Commodore 64 中 6569 VIC 无法寻址边界 您所能做的就是在中心区域 光标移动的区域 绘制像素 边框总是统一的 尽管你可以用 poke 53280 改变它的颜色 如
  • 在Mac OS上使用GCC为MS-DOS编译C程序(DOSBox)

    我在Mac OS X上的Snow Leopard下运行GCC 4 2 1 我想用它来编译我15年前写的一些旧的C C DOS游戏 以便我可以在下面运行它们DosBox http www dosbox com 为此 它们显然需要编译为 DOS
  • 两个列表,Python 中的比较速度更快

    我正在编写 python 2 7 脚本来比较两个列表 这些列表是通过读取文件内容从文件创建的 文件只是文本文件 没有二进制文件 文件 1 仅包含哈希值 某些明文单词的 MD5 和 文件 2 是 hash plain 列表具有不同的长度 从逻
  • Git 丢失更改[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 今天在使用 Git 的时候遇到了一些问题 我真的无法理解 我们的团队有一个私人 github 存储库 我从该共享存储库中提取了一些更改 完成
  • F# 中的受歧视联盟是什么以及 OOP 中我们有什么类型的替代方案

    我正在从 C 开始学习函数式编程 当然 由于我对 C 有着深入而详细的了解 我选择了我的第一个函数式语言 F 并尝试投入时间来学习它 现在我需要了解什么是受歧视的工会为什么它很重要以及为什么我们真正需要它 我确实做了很多研究 但导师 讲师
  • float() 的文字无效:0.000001,如何修复错误?

    我有一个包含 3 列数据的 csv 文件 我需要创建一个新的输出文件 其中包含原始文件第一列和第三列中的一组特定数据 第三列包含十进制值 我相信在这种情况下我已经使用了 python 的 float 功能 我尝试过以下代码 in file
  • 图神经网络中的梯度爆炸问题

    我有一个梯度爆炸问题 尝试了几天后仍无法解决 我在 TensorFlow 中实现了一个自定义消息传递图神经网络 用于根据图数据预测连续值 每个图表都与一个目标值相关联 图的每个节点由节点属性向量表示 节点之间的边由边属性向量表示 在消息传递
  • 存储后端如何影响 Datomic?

    我该如何选择 Datomic 的后端存储服务 选择 DynamoDB 而不是 Postgres 是一个偏好问题 还是每个选项都有不同的权衡 如果有 它们是什么 存储服务要求 Datomic 的存储服务一般应满足 3 个要求 实施键值存储语义
  • 如何计算三次贝塞尔曲线的控制点

    在执行三次贝塞尔曲线程序时我发现它使用端点为 10 10 0 和 0 1 0 其他控制点为 5 10 2 和 10 5 2 我不能了解他们是如何获得其他控制点的请帮我找到它们的任何公式或方法 Edit 如果你想让贝塞尔曲线平滑地通过N个点且
  • 构建 Cython 模块时如何覆盖 -DNDEBUG 编译标志

    我有一个 Cython 模块 通过调用 C 函数cdef extern C 函数有assert 声明 我想核实这些说法 但是 当我通过调用创建模块时python setup py build ext inplace GCC 总是被调用 DN
  • 背景:颜色在 IE8 中不起作用

    body background gray font family sans serif width 960px margin auto header background green border 10px solid black nav
  • 单词标记化与传统词形还原?

    我正在研究 NLP 预处理 在某些时候 我想实现一个上下文相关的词嵌入 作为辨别词义的一种方式 并且我正在考虑使用 BERT 的输出来实现这一点 我注意到 BERT 使用 WordPiece 标记化 例如 playing gt play i
  • Windows 7 64 位的 Moto G USB 调试问题

    我尝试搜索是否有任何建议 但找不到足够的建议 因此这个问题可以帮助我 我已经安装了 Motorola USB 驱动程序并启用了 USB 调试模式以及启用了 MTP 该设备在 Eclipse 中显示为可用状态不到一分钟 然后返回离线模式 我尝
  • iOS 应用内购买上的收据验证返回多笔交易

    沙盒模式下的应用内购买会返回同一产品 ID 上的多个交易 使用语言 Swift 4 0 func validateAppReceipt receipt Data let base64encodedReceipt receipt base64