iOS中的收据验证在沙盒测试期间返回不正确的信息

iOS中的收据验证在沙盒测试期间返回不正确的信息,ios,swift,Ios,Swift,我正在为我的应用程序执行收据验证,因为它是付费的,并且将免费进行应用内购买 我已经设置好服务器和所有东西,并且已经发送了收据数据。然而,当我得到响应时,不管发生什么,响应JSON总是说原始应用程序版本是1.0。我验证收据的想法是,如果您的原始应用程序版本在1.x之前,那么您可以自动解锁高级版本 然而,即使是全新的beta测试人员,他们之前从未安装过应用程序,JSON中的原始应用程序版本返回的值为1.0 我的服务器上的URL是https://sandbox.itunes.apple.com/ver

我正在为我的应用程序执行收据验证,因为它是付费的,并且将免费进行应用内购买

我已经设置好服务器和所有东西,并且已经发送了收据数据。然而,当我得到响应时,不管发生什么,响应JSON总是说
原始应用程序版本
1.0
。我验证收据的想法是,如果您的原始应用程序版本在1.x之前,那么您可以自动解锁高级版本

然而,即使是全新的beta测试人员,他们之前从未安装过应用程序,JSON中的
原始应用程序版本
返回的值为1.0

我的服务器上的URL是
https://sandbox.itunes.apple.com/verifyReceipt
。当我将其更改为生产URL时,得到了21007的响应(这意味着我应该更改为测试环境)


有人经历过吗?我高度怀疑它是否会神奇地开始在生产中返回正确的值,但它完全被破坏了,用于测试目的。它在TestFlight构建和直接从Xcode构建时都返回了错误的信息。

可能是沙盒问题

捕获生产回复并验证是否存在错误的AppVersion如何。(假设您已经有一个1.1+存储)如果是这样,这将是一个错误报告,但我怀疑该字段是否不正确


但是,如果该字段也不正确,那么验证上次我测试时正确的购买日期如何。

您在沙箱环境中得到的信息与以下内容一致:

原始应用程序版本

最初购买的应用程序版本

这对应于CbundLeverVersion的值(在iOS中)或 当 最初是购买的

在沙箱环境中,此字段的值始终为“1.0”

参考:

在沙盒环境中,此字段的值始终为
1.0
,而在生产环境中,它将是用户首次安装此应用时的
CbundLeverVersion

基于此,大多数人使用以下解决方案:

  • 它们将
    CbundLeverVersion
    aka
    Build
    (不是
    Version
    )更改为新样式
  • 选中此值以区分旧的付费应用程序和新的免费应用程序(使用iAP)

谈到了这个确切的场景,所以你所做的是苹果公司推荐的

摘录:

因此,对于今天商店里有付费应用程序的每个人,你想要 要实现向免费应用程序的过渡,并进行应用内购买, 以前这对你来说是一个很大的挑战,因为如果你 只需切换到一个免费的应用程序,在应用程序内购买,您的 客户将不得不再次购买所有的应用程序内购买, 但是他们已经付了钱,他们不会喜欢的

所以现在在收据中我们有了日期,当用户第一次 购买了你的应用程序,以及当时的版本

所以你可以用它来做一个真正明智的决定 关于授予此用户权限的功能和内容,因此如果 应用程序查看收据并进行检查,发现该用户购买了我的 在我切换到免费进行应用内购买之前, 如果他们购买了你的应用程序,请将其授权给他们 在你实现了免费应用内购买的过渡之后, 您知道,在功能和内容发布之前,不要太解锁它们 购买,然后用收据本身验证该交易

参考:


总结: 但您似乎已经在遵循这种方法。
唯一的问题是,在沙盒环境中,它总是
1.0
,因为每次安装都被视为新安装,没有结转信息。
所以在它投入生产之前你不能真正测试它,这很可怕

可行的解决办法: 那么如何测试以下场景呢

  • 付费时用户安装的应用程序
  • 免费后用户安装的应用程序
  • 嗯。。。我会使用
    环境
    原始应用程序版本
    。。。和2个测试飞行构建:

    案例1:用户在应用程序免费后安装应用程序,但之前已付费

    • 如果
      environment
      显示
      Sandbox
      ,那么我会将
      原始应用程序版本
      模拟为旧的应用程序版本号,并检查流程
    • 否则
      环境
      会显示
      生产
      ,我会从收据中取出
      原始应用程序版本
    • 提供TestFlight build,并附带说明案例的发行说明
    案例2:用户在应用程序免费后安装应用程序,但尚未付费

    • 如果
      environment
      显示
      Sandbox
      ,那么我会将
      原始应用程序版本
      模拟为新的应用程序版本号,并检查流程
    • 否则
      环境
      会显示
      生产
      ,我会从收据中取出
      原始应用程序版本
    • 提供TestFlight build,并附带说明案例的发行说明
    在任何一种情况下,我都会得到正确的收据,并注意,如果QA通过,两个TestFlight构建都是可发布的,只要我们的
    else
    条件保证有效:从收据中获取
    原始应用程序版本的部分



    PS:这个解决方案是我现在能想到的最好的

    好的,我终于把这个问题解决了。正如其他人之前在其他堆栈溢出线程中所述,