Apple的VerificationController.m无法验证沙盒应用内购买收据的签名

时间:2016-04-12 12:23:37

标签: ios in-app-purchase

我使用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版吗?

4 个答案:

答案 0 :(得分:3)

我已经看了“版本3”签名,我已经成功地对其进行了逆向设计。

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

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

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

答案 1 :(得分:1)

看起来Apple在服务器端检查中折旧了iOS6样式收据: https://forums.developer.apple.com/thread/44603

现在似乎直播仍然有效,但我们应该转向新格式

请参阅链接了解详情。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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