【问题标题】:Apple's VerificationController.m failed verifying sandbox in-app purchase receipt's signatureApple 的 VerificationController.m 未能验证沙盒应用内购买收据的签名
【发布时间】:2016-08-03 01:27:06
【问题描述】:

我长期以来一直在使用 Apple 的示例在本地验证应用内购买收据,但它最近停止在沙盒模式下工作(在生产中工作)。

可能与 iOS 9.3.1 相关,或者他们在服务器端进行了一些更改, 尝试验证 transaction.transactionReceipt 时,失败并显示 -

AssertMacros: signature_blob_ptr->version == 2,  file: ../VerificationController.m
Transaction is invalid!

它有一个不同的version(3 而不是 2)并且证书的其余部分与以下结构匹配 -

struct signature_blob {
    uint8_t version;
    uint8_t signature[128];
    uint32_t cert_len;
    uint8_t certificate[];
}

知道如何验证 Apple 应用内购买收据的第 3 版吗?

【问题讨论】:

  • 您是否找到有关此问题的更多信息?我面临着完全相同的情况,除了我的生产应用程序也无法正常工作......谢谢
  • 接受的答案似乎反映了我的情况。

标签: ios in-app-purchase


【解决方案1】:

看起来 Apple 在其服务器端支票上贬低了 iOS6 风格的收据: https://forums.developer.apple.com/thread/44603

目前看来 live 仍然有效,但我们可能应该改用新格式

查看链接了解详情。

【讨论】:

    【解决方案2】:

    我遇到了你描述的同样的问题。当我在本地与 Apple 验证收据时,一切都在正常工作,然后停止使用无效收据。今天(2016 年 4 月 14 日)我安装了最新版本的 iOS(iOS 9.3.1)和新的 xCode 版本(7.3),验证再次生效。没有更改我的代码中的任何内容!

    【讨论】:

    • 这个问题发生在我使用 iOS 9.3 的用户身上,所以重新安装 xcode 可以解决我的问题,但不能解决他们的问题……你找到更多关于这个问题的信息了吗?谢谢
    【解决方案3】:

    我查看了“版本 3”签名,并成功对其进行了逆向工程。

    唯一的变化是签名长度,现在是 256 位,而不是 128。应该使用来自 https://developer.apple.com/legacy/library/releasenotes/StoreKit/IAP_ReceiptValidation/index.html 的代码按预期解压和验证 blob 的其余部分。

    签名证书现在是 Apple 最新的根证书,位于 https://www.apple.com/certificateauthority/。您将需要使用其中的公钥来验证版本 3 的 blob 中包含的签名证书。

    我建议在解压签名的其余部分之前先获取版本,这样您就可以同时支持版本 2 和 3。

    【讨论】:

    • 如你所说,我已经改变了,但对我不起作用。
    • @HardikShekhat 请具体说明。你得到什么错误?你试过什么?
    【解决方案4】:

    基本上苹果破坏了我所有的应用程序。无法更新它们,因为仅为新设备尺寸制作所有艺术品需要一到四天,而且它们卖得不好。不幸的是,我什至不能让它们免费,因为即使有免费的应用内购买,收据也会失败。

    自我提醒:永远不要让使用服务器端功能的应用再次超出我的控制范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 2017-05-25
      • 2014-02-25
      • 2010-11-20
      • 2011-10-12
      相关资源
      最近更新 更多