问题标签 [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 回答
110 浏览

ios - 检查用于连接 App Store 服务器的 SSL 证书是否为 EV 证书?

Apple在此建议,在应用内购买的收据验证期间,我们:

检查用于连接 App Store 服务器的 SSL 证书是否为 EV 证书

在 iOS 上的 Objective-C 中究竟是如何做到这一点的?

0 投票
1 回答
306 浏览

c# - 在 beta 应用程序中购买 Windows Phone 8 inapp 会提供带有错误摘要的签名收据

我已经使用 MockIAP 库在 Windows Phone 8 应用程序中测试了应用内购买 - 一切正常。我还在我的服务器上测试了收据签名验证码(基于 Robert Richards 的 xmlseclibs),并从这里测试 Microsoft 清单,它通过了验证。我听说在 beta 模式下,应用程序内是免费的,并且不会给你签名的收据,但是当我创建了一个 beta 应用程序并尝试从中进行购买时,我有一个签名的收据并且它有版本2.0(msft 样本有 1.0)!

我已经跟踪验证并发现两个收据(msft 样本和我得到的一个)具有相同的 CanonicalizationMethod、SignatureMethod、Transforms 和 DigestMethod,并且 msft 样本一切正常,但摘要值(Signature/SignedInfo/Reference/ DigestValue) 在我的收据中是错误的。

另外我发现如果我只评论摘要验证,签名验证就会成功。所以罪恶的根源在于这个错误的摘要值。

也许是故意的?我的意思是也许我在使用 beta 应用程序时不应该注意摘要检查?还是 MSFT 使用了一些未记录的摘要方法?

更新: 尝试使用 MSFT验证示例检查退回的收据,验证失败。有人有 WP8 应用内购买收据验证的经验吗?看起来在他们将格式更改为 2.0 版后,应用程序开发人员应该会遇到验证问题,因为现在收据未通过验证。

我已经删除了所有不需要的字符,并且我的代码适用于示例 WP8 和 Windows Store 收据,但是要检查这些新的 WP8 收据,必须跳过摘要检查。我会在生产中尝试这个。

0 投票
1 回答
532 浏览

ios - 应用收据中的 iOS 日期格式问题

在验证收据时,我正在解析从 App Store 返回的 JSON。

公共字段之一是 original_purchase_date。但是,此处返回的日期格式为“2014-05-30 14:05:51 Etc/GMT”。问题是当我尝试比较它时,后缀(Etc/GMT)似乎会导致问题。我试图了解如何管理它,因为这个后缀可以是任何时区(比如 America/Los_Angeles 或其他)。

有没有办法将其转换为可用的格式?

我知道在收据中还有一个字段 original_purchase_date_ms 这是我怀疑自 1970 年以来的秒数,但是,这是一个私有字段(在任何文档中都没有提到),所以我不想依赖它的使用,只是为了找到该应用程序被拒绝,或者Apple稍后删除该字段!

提前致谢。

0 投票
1 回答
469 浏览

ios7 - 解析 ASN.1 申请回执时出现错误“预期:[UNIVERSAL 17],预期失败 (tn=0, tm=0)”

我目前正在按照 Apple 的Receipt Validation Programming Guide实施本地收据验证。我可以获得测试收据,但是当我尝试按如下方式解析它时(即如指南清单 1-5 中所建议的那样)

我收到以下错误(来自 的输出ASN_DEBUG()

asn_DEF_Payload(和其他 C 代码)已由ans1c(ASN.1 编译器,v0.9.24)生成,并使用指南的清单 1-1 作为输入。我首先NSData dataWithContentsOfURLNSBundle appStoreReceiptURL. pldpld_sz分别是数据的byteslength

此错误表示什么以及如何避免?

更新当解析器在测试配方的开头预期标签 17(SET 和 SET OF)时,它看起来好像看到了标签 16(SEQUENCE 和 SEQUENCE OF)。清单 1-1 中 Payload 的定义确实是指 SET。

更新我已经管理了以下附带的转换器asn1c

我还设法将收据从物理 iOS 设备复制到 OS X,就像这样。当我现在尝试转储收据时,./progname -d -iber -otext receipt我得到以下输出:

更新嗯,这个在线 ASN.1 解码器可以很好地转储我的测试配方。(不过,它以 SEQUENCE 开头。)这显然是一个签名,我的错误是(可能是)我应该从签名的信封中获取有效负载......

0 投票
4 回答
2938 浏览

swift - 在使用 Swift 的应用程序收据验证中返回代码 21002

我已将数据发送到服务器,希望验证收据并收到格式错误的响应 (21002)。我发送到 iTunes 的 json 在 JSONlint.org 中进行验证,如下所示:

知道我做错了什么吗?我的斯威夫特如下:

0 投票
0 回答
5011 浏览

ios - 应用内购买沙盒环境中的收据刷新:是否可以在不同时购买测试项目的情况下刷新收据?

我知道我已经为沙盒环境正确配置了我的应用程序(适用于 iOS 7),因为我可以进行测试购买,并且当测试购买通过时,我会看到带有 [Environment: Sandbox] 文本的警报。收据同时刷新,我可以使用该+[NSBundle appStoreReceiptURL]方法访问它。

但是每当我尝试SKReceiptRefreshRequest单独使用类中的方法刷新收据时,我只会得到这个序列:

  1. “登录”警报显示我从中选择“使用现有 Apple ID”。

  2. 当出现“Apple ID 密码”警报时,我输入了测试用户的凭据。

  3. 但此警报总是在输入凭据后立即显示:

“此 Apple ID 尚未在 iTunes Store 中使用。点击查看以登录,然后查看您的帐户信息。”</p>

这当然会继续询问您在沙盒环境中不应该做的信用卡信息。

我在应用程序委托中使用此代码来启动收据刷新:

但是唯一调用的委托方法是 didFailWithError: 它给出了消息:

Error Domain=SSServerErrorDomain Code=5001 "Could Not Sign In" UserInfo=0x14d8a780 {NSLocalizedFailureReason=此 Apple ID 尚未在 iTunes Store 中使用。, NSLocalizedDescription=无法登录}

在尝试刷新收据之前,我总是:

  1. 从设备中删除应用程序

  2. 确保 Settings->App Store 没有输入 Apple ID 凭据

  3. 使用我的开发人员凭据签署应用程序

  4. 确保测试帐户之前进行过购买,以便可以生成收据。

  5. 确保从未将测试帐户凭据输入到 App Store 登录中(因为这会使它们在测试时失效)。

是否可以在沙箱中进行收据刷新?

更新:现在工作

我终于让它工作了——但我不知道关键步骤是什么——除了坚持不懈并继续尝试。

为了其他有同样问题的人的利益,这里是我遵循的步骤:

  1. 创建一个全新的测试用户,但没有在帐户上进行测试购买。

  2. 从设备中删除应用程序并确保没有帐户登录到设置-> App Store。

  3. 我在 Xcode 中启动了该应用程序,并在控制台中收到了我一直收到的错误消息 - 带有以下描述文本:

“错误域=SSServerErrorDomain Code=5001“无法登录”UserInfo=0x155f5140 {NSLocalizedFailureReason=此 Apple ID 尚未在 iTunes Store 中使用。NSLocalizedDescription=无法登录}”。

  1. 当“此 Apple ID 尚未在 iTunes Store 中使用。 ”警报出现时,我按下了取消按钮。

  2. 关闭应用程序,不做任何更改,在 Xcode 下重新启动它。在重新启动之前,我没有从设备中删除该应用程序。

  3. 这次“<em>此 Apple ID 尚未在 iTunes Store 中使用”。消息没有出现,而是出现了一个提示输入 Apple ID 和密码的对话框。我在对话框中输入了测试帐户凭据。

  4. 在我输入测试用户凭据后,SKRequestDelegate requestDidFinish:委托方法被调用,并且收据被放置在应用程序包中。顺便说一句,该方法SKRequest提供的实例requestDidFinish:是类型SKReceiptRefreshRequest

我发现一旦它第一次工作,它就会继续工作 - 我不必删除应用程序或从设置 - > App Store清除凭据 - 收据刷新将继续在后台工作,使用从那时起缓存在设置-> App Store 中的测试凭据。

0 投票
2 回答
1539 浏览

ios7 - 无法获取用户安装的原始应用程序版本(收据验证)?

我最近更新了一个应用程序,可以在应用程序购买中使用。以前的版本(付费但没有应用内购买)是 1.0,当前版本是 1.1。

由于应用内购买基本上解锁了所有功能(包括在付费版本 1.0 中),我想要一种方法让最初下载版本 1.0 的用户在按下我的恢复购买按钮时进行升级。

为此,我首先尝试恢复购买,如果响应:

如果这为我提供了一个事务计数为 0 的队列,我会检查收据以查看安装的原始版本是否为 1.0。

获取收据的代码是根据 Apple 的文档

然后调用以下方法:

现在这行不通了。当有人安装 1.1 版并点击恢复购买时,它会在不应该的情况下成功恢复。

我刚刚意识到在我的 Info.plist 中,我的 CFBundleShortVersionString 是 1.1,但我的 CFBundleVersion 是 1.0。

这可能是一个非常愚蠢的问题,但是即使更新版本为 1.1,收据是否提供了 original_application_version 1.0(由于错误的 CFBundleVersion)?

因此,如果我发布一个新的更新,并修正为 1.2 版(对于 CFBundleShortVersionString 和 CFBundleVersion),问题会得到解决吗?

- 更新 -

所以我刚刚上传了一个新版本到应用商店,CGBundleVersion 和 CFBundleShortVersionString 都等于 1.2。但是,我仍然面临同样的问题 - 首次下载 1.2 版并点击恢复购买的用户正在免费升级(由于上述收据检查)。看来 original_application_version 总是要到 1.0。

注意:我正在使用以前未下载过该应用程序的新 iTunes 帐户下载该应用程序。

这是我从应用商店安装然后尝试通过 Xcode 获取收据时的收据

有什么想法吗?

0 投票
1 回答
2221 浏览

ios - iOS 自动更新订阅:收据验证流程

我正在实现一个自动更新订阅方案,其中收据验证将由我的服务器端代码处理。根据 Apple 的文档,我将从 获取收据数据NSBundle,并将该数据传递到我的服务器,服务器将联系 Apple 以验证收据并通知应用程序有关结果。

现在我的问题与收据验证相关的必要流程有关:

  1. 如果用户购买订阅,我的收据是否会自动更新为购买的信息?如果是这样,是否有必要在购买后立即验证该收据,还是我应该立即“解锁”应用程序?

  2. 在什么情况下我的收据会丢失NSBundle?如果发生这种情况,我想我应该使用SKReceiptRefreshRequest刷新收据,并将其发送到服务器进行验证。

  3. 如果用户在不同的设备上安装应用程序并恢复他的购买restoreCompletedTransactions,我是否会同时自动获得收据?我想我需要在恢复后验证收据以确保有一个有效的订阅,对吗?

  4. 当我的服务器尝试验证收据并且该收据无效时,应用程序端会发生什么?刷新收据(这将要求用户提供凭据)并再次将其传递给服务器以进行新的重新验证?

0 投票
1 回答
1532 浏览

ios - 应用更新后 [NSBundle appStoreReceiptURL] 的收据是否仍然存在

在生产环境中,如果用户进行应用内购买,然后更新到较新版本的应用,那么反映应用内购买的收据是否仍然存在于捆绑包中?或者它会被应用程序更新消灭吗?

0 投票
2 回答
775 浏览

ios - 完全免费的 iOS 应用是否需要应用商店收据验证?

在我的应用程序的 Mac 版本上,我曾经像这样验证 App Store 收据:

虽然我之前在 iOS 上做过同样的事情,但在 iOS 的情况下,这似乎不是正确的方法。该应用程序完全免费,并且没有 IAP。那么,是否需要收据验证?如果是的话,免费应用程序的正确做法是什么?