首页 > 解决方案 > Mac App Store 收据 - 哈希不匹配。为什么?

问题描述

我正在尝试创建一个 Mac 应用程序,请对我温柔一点,因为这是我的第一次尝试!基本上将我在 iOS 上所做的事情转移到 Mac 上,它几乎已经准备好只剩下一部分了——App Store 验证以防止人们复制它。

我的几个 iOS 应用程序中运行了收据验证码,它们可以为我找到(用于应用程序内购买)。对于 Mac,我只想验证收据并希望这就足够了。这是我创建的代码的基础:

char buf[512] = "";
get_platform_uuid(buf, sizeof(buf));

NSString *uuidString = [NSString stringWithUTF8String:buf];
NSUUID *myUUID = [[NSUUID UUID] initWithUUIDString:uuidString];

unsigned char uuidBytes[16];
[myUUID getUUIDBytes:uuidBytes];

NSMutableData *input = [NSMutableData data];
[input appendBytes:uuidBytes length:16];
[input appendData:[receipt objectForKey:kReceiptOpaqueValue]];
[input appendData:[receipt objectForKey:kReceiptBundleIdentifierData]];

NSMutableData *hash = [NSMutableData dataWithLength:SHA_DIGEST_LENGTH];
SHA1([input bytes], [input length], [hash mutableBytes]);

NSLog(@"kReceiptHash: %@", [receipt objectForKey:kReceiptHash]);
NSLog(@"hash: %@", hash);

最后两个 NSLog 命令只是为了让我可以在调试期间记录它,但会比较哈希值。这是我知道两者都不正确的地方。“get_platform_uuid”是我发现的用于获取 Mac 的 UUID 的函数,它似乎工作正常。

我已经获取了整个“输入”变量并将信息插入其中并在 iOS 上运行它,我在 iOS 设备上做了同样的事情并在 Mac 上运行它。在这两种情况下,计算出的 Hash 是相同的;我认为计算很好。

但在 Mac 上,它仍然与收据哈希不同。该应用程序的 iOS 计算和收据哈希匹配。

我已经在 iTunes Connect 上设置了应用程序,它似乎选择了正确的捆绑标识符。我已在 Mac 上退出 App Store。我将应用程序从 Xcode 构建应用程序的位置复制到不同的目录以运行它。然后它要求我登录,我使用测试帐户进行登录。然后反复尝试重新运行应用程序并退出(我将其复制回调试文件夹,这会中断重新运行周期)。

我已经在 Apple Developer 站点中设置了用于 Mac 的开发和分发的证书,但我确信这是我对应用程序权限或我运行应用程序的方式不正确的东西。但是我就是想不通(而且我已经看了很长时间了!)。

我敢肯定这很傻,但作为一个孤独的开发者,我唯一的希望就是问你我做错了什么?

谢谢。

标签: macosapp-storereceipt-validation

解决方案


经过大量搜索,我找到了另一种构建和比较哈希值的方法。但这也需要修改才能在 Mac 上运行,因为它是相当旧的代码。我现在拥有的是这种方法和它之间的混合体。

我无法解释的是为什么旧代码可以在 iOS 上运行,但不能在 Mac 上运行,而且我不是一个足够优秀的程序员来研究原因。我所知道的是这种混合方法似乎有效。


推荐阅读