问题标签 [receipt-validation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
267 浏览

ios - 当用户在 iOS 上恢复应用购买时,如何防止重放攻击/重复使用收据?

如果用户进行购买,为了防止重放攻击(用户重复使用旧收据来获取新内容),我会检查该交易标识符之前是否已使用过。如果是,拒绝。它工作得很好。

但是,当用户“恢复以前的购买”时,我该如何防止呢?预计该交易以前曾购买过,但我怎么知道收据来自该特定用户,而不是来自普通收据的重放攻击?

我可以将其链接到特定用户吗?当他们可以点击恢复来绕过它时,防止对购买的重放攻击似乎很愚蠢......

0 投票
1 回答
251 浏览

ios - Apple In-App Purchase收据版本3(突然出现而不是版本2)

我的应用程序中的收据验证最近开始中断。显然,在过去的 2-3 周内,Apple 已将 In-App Purchase 收据的版本号从2更改为3.

检查签名结构时:

…哪里是来自(从 iOS 7 开始弃用)对象signature_bytes的 JSON blob 中签名字符串的 Base64 解码值。transactionReceiptSKPaymentTransaction

…我硬编码了一张支票version == 2。现在我看到3.

在 App Store 上架了几年后,在过去的 2-3 周里,我们的应用开始收到用户报告新购买和“恢复”购买未能激活我们应用内容的报告。所以我认为这是苹果公司最近的一个变化。

谁能确认苹果做出了改变?提供更多细节?也许指向我关于这个新版本的购买收据的文档?

0 投票
3 回答
1669 浏览

ios - iOS 收据验证状态代码 21009:什么是 MZInAppCacheAccessException?

我正在使用 App Store 验证收据。在极少数情况下(~0.5‰),JSON 看起来像这样:

遗憾的是,Apple 并未在其状态代码表中提及此代码。

搜索异常名称时,只有一个网络范围内的引用,这是 Apple 开发者论坛上的一个指示性线程:什么是错误代码 21009?除了一些“我也是”的帖子外,还有一个苹果员工的回答说“在有“具体信息”时回复更多信息。

关于频率:线程的日期为 2016-03-15。我知道在这些日期发生的事情:

虽然这个例外似乎很少到可以忽略不计,但我希望能对此有所了解。

有没有人想出处理此异常的适当方法?(如重新验证)

这个异常实际上是什么意思?(什么是“jingle”、“commercelogic”和“MZInAppCache”?)

0 投票
1 回答
2294 浏览

ios - iOS App Receipt Validation - 调试时模拟器和设备上缺少收据

为什么我的应用在开发过程中会缺少收据?

我正在从 Xcode 7.3.1 运行我的 iOS (7, 8, 9) 应用程序。应用程序的收据似乎不见了。这个应用程序目前在 App Store 中发布,所以我有我的开发人员凭据和一个“沙盒”用户登录名。

模拟器

运行以下代码时:

iPhone 6s Plus 的 Simulator 9.3 中的结果:

file:///Users/Bourque/Library/Developer/CoreSimulator/Devices/7F32850A-CC1A-45A3-8ED6-95C75CD9DD44/data/Containers/Data/Application/46BDF021-D2A3-418E-91E1-61A15215942B/StoreKit/receipt

然而,当我导航到以第二个 UUID 命名的文件夹时,我没有找到任何StoreKit文件夹。

真实设备

为了在真正的 iOS iPod touch 上进行测试,我将该代码扩展为……</p>

…查看收据的位置。

…尝试加载这样的文件。

…验证文件是否存在。

运行时的结果。

网址:file:///private/var/mobile/Containers/Data/Application/21430192-6E3A-4929-B847-23FD525D804E/StoreKit/sandboxReceipt

网址内容:(空)

BAD 找不到 url 的收据:file:///private/var/mobile/Containers/Data/Application/21430192-6E3A-4929-B847-23FD525D804E/StoreKit/sandboxReceipt

file:///private/var/mobile/Containers/Data/Application/B1497F0D-95A7-4AD8-A9D5-7AF95663A04F/StoreKit/sandboxReceipt

0 投票
0 回答
476 浏览

ios - iOS 应用内购买收据额外有效载荷

在我的应用程序中,用户可以购买链接到他们在系统中的帐户,而不是苹果 ID。像往常一样,iOS 应用程序将 App Store 收据发送到服务器,服务器对其进行验证。我想知道,收据内的每笔交易都属于特定的用户帐户。一种方法是向收据进一步发送附加参数,例如:

收据数字签名验证确保里面的数据是有效的并且没有被黑客替换。如果参数(登录名和平台)将在收据内,验证将是完全安全的,有效的数字签名表明所有购买都是有效的并且属于帐户。否则,可以使用不同的登录名发送一张收据,并允许多个用户无需支付即可购买。为了防止这种情况,例如,可以对所有捆绑包(收据、登录、平台)进行额外签名并添加检查唯一对 transactionID、userId。我的问题是有什么方法可以将额外的交易参数放入收据,或者另一种常见的方式来存档收据购买和用户帐户之间的链接?

0 投票
0 回答
305 浏览

javascript - React Native/Swift - iAP 的收据验证

我正在尝试从我的手机中获取 iOS In App 购买收据,然后将其作为与 JavaScript 对象兼容的东西在 Swift 的回调中传回。这可能吗?Swift 中的对象是一个 NSData 类型,但是RCTJSONStringify() encountered the following error: Invalid type in JSON write (NSConcreteData)当我试图将这个对象传回以响应本机时,我得到了。

我也尝试编码为base64,然后window.atob(data)在另一边使用解码,但得到了各种奇怪的字符。

任何帮助将非常感激!

0 投票
0 回答
501 浏览

php - 在 PHP 服务器上验证并读取 iOS 收据

我已经阅读了很多关于 iOS 收据验证的讨论,但是我找不到一种方法来验证和读取 PHP 中的收据内容而不调用 Apple 服务器(这非常慢并且导致我的应用程序在打开前等待 4/5 秒)。

不幸的是,我对证书、SSL 和加密的一般知识很差,所以我需要这样的东西,在 PHP 中而不是在 Objective-C/Swift 中。有人能帮我吗?

0 投票
1 回答
130 浏览

ios - Live 中的应用内购买收据验证崩溃

我的应用程序的第一个版本在实时和沙盒中都运行良好。现在第二个版本在从 Appstore 下载后崩溃。第二个版本在沙盒模式下无论是开发还是临时都运行良好。应用程序上线了,现在它崩溃了

沙盒中运行良好

0 投票
0 回答
175 浏览

ios - 如果在 `main` 方法期间检查,如果没有收据存在,Receigen 生成的收据验证代码会崩溃

Receigen文档和其他来源建议尽快验证您的应用程序的收据,甚至在方法main的早期。

当我在方法中调用 Receigen 生成的代码main时,当应用程序没有 Receipt 时,我会遇到执行中断。

调用return UIApplicationMain在 Xcode 7.3.1 中显示此错误消息:

线程 1:EXC_BAD_ACCESS(代码=1,地址=0xe)

将此调用MyPrefix_CheckReceiptmain方法移到我的应用程序委托didFinishLaunchingWithOptions方法的顶部是一种解决方法。EXC_BAD_ACCESS当收据不存在时不会发生错误。

当用户通过 Mac 或 PC 上的 iTunes 应用程序从备份中恢复他们的应用程序时,可能会在现场没有收据。第一次在真正的硬件 iOS 设备上通过 Xcode 执行或从设备中删除应用程序后,开发中总是会出现没有收据的情况。

第二次运行没有出现这样的错误。我确认收据已从假的“沙盒”App Store 成功检索,并且在第二次运行时出现。

所以问题是:为什么 Receigen 代码在没有找到 Receipt 但只有在从该main方法进行验证调用时才会崩溃并崩溃?

0 投票
0 回答
63 浏览

ios - 为什么我的原始购买版本总是显示为 1.0?

我正在尝试使用以下代码提取用户的收据,以确定他们的原始购买版本是什么:

但是,我设置了一个 testflight beta 程序,并且正在测试的用户之前购买了 1.32 版本,但是,返回的值始终是 1.0 版本。