我使用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版吗?
答案 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)
苹果基本上打破了我的所有应用程序。无法更新它们,因为只需要为新设备尺寸制作所有艺术品需要一天或四天,而且他们不能很好地销售。不幸的是,我甚至无法让它们免费,因为即使免费的应用内购买,收据也会失败。
自我注意:永远不要让使用服务器端功能的应用再次超出我的控制范围。