我正在尝试将收据验证与服务器端一起使用.一切都可以,但是有时候我会看到奇怪的是:10次验证还可以,但是在11中,我遇到了21002错误.我不知道该怎么办.有时,当我在启动应用程序后首次验证收据时,我会遇到错误21002. 应用程序: func validateReceipt(productID: String) { let receipt = NSData(contentsOfURL: NSBundle.mainBundle().appStoreReceiptURL!)! let receiptdata = receipt.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) let request = NSMutableURLRequest(URL: NSURL(string: "my_server_url")!) let session =
以下是关于 receipt-validation 的编程技术问答
我从客户端获得收据并通过Apple Server验证它,然后在此收据中获得了新购买的事务ID(这是自动订阅购买).几天后,我从获得了同一客户并验证它的新收据,奇怪的事情发生了:旧购买的交易ID 更改. 我将旧收据中此购买的数据与新收据中的数据进行比较,唯一的变化是Transaction_ID字段,Original_transaction_id,paskure_date,expires_date, web_order_order_order_line_item_id 完全一样. 比我检查数据库,我发现大约1%的交易记录具有相同的情况.而且有一个特征,他们的大多数交易ID 增加或减少了1-2 . . 我曾经认为交易ID是购买的标识符.有人遇到同样的问题还是知道原因? 解决方案 是的,我们也看到了这种情况.我们看到这是由"还原购买"按钮点击触发的. 如果您的"恢复购买"按钮使用然后,这将导致您的交易ID更改.我们已经确认了Apple开发人员的支持. 显然您可
我正在学习如何在iOS/OSX项目中添加应用内购买收据验证. 有一个不错的概述在这里和WWDC14在此主题上有很好的视频. 大量示例代码,但每个人都跳过一步.如何导入OpenSSL标头. Swift编译器抱怨没有这样的模块. import Foundation import StoreKit import openssl //no such module ??? 我在编写一行代码之前已经被卡住了. OpenSSL框架隐藏在哪里? 解决方案 没有内置的openssl模块. 看一下: https://gist.github.com/foozmeat/5154962 http://cocoapopods.org/?q=pepenssl 您绝不应该使用其他人提供的静态模块.始终建立自己的. Apples official explanation here - under OpenSSl - https://developer.apple.com/li
我对此有些困惑.因此,遵循一堆解密的田地.其中包括原始_purchase_date. 我需要跟踪是否在此新版本免费之前购买了应用程序,我认为我需要为此使用此字段.但是由于某种原因在沙盒环境上显示日期 " Original_purchase_date" =" 2013-08-01 07:00:00 etc/gmt"; 在申请之前已经几年了. 所以现在我不确定 为什么它显示该日期. 是原始_purchase_date确实需要跟踪的字段. 解决方案 原始购买日期始终为" 2013-08-01 07:00:00 etc/gmt",用于沙盒环境. 您可以使用原始购买日期来满足您的需要,但我建议使用原始应用程序版本字段.因此,使用日期要容易得多. 其他解决方案 因为您在沙盒环境中. 是的,您应该使用Original_purchase_date!因为Original_application_version完全错误 - 它包含一个构建号,而不是
我在Apple的收据验证编程指南的帮助下,使用OpenSSL和ASN1C编译器在设备上本地实施了收据验证.我的应用仅支持iOS 7及以上. 根据Apple的建议,我致电[[NSBundle mainBundle] appStoreReceiptURL]获取App Store收据.当应用程序在显示任何UI之前"首先"启动时,我也要这样做.需要第一次启动呼叫,因为Apple建议收据首次尝试时刷新收据.由于此调用(SKReceiptRefreshRequest),应用程序要求用户输入其iTunes登录信息. 现在的问题是,苹果公司一直在拒绝该应用程序,说我正在向其生产服务器而不是沙盒服务器拨打电话.但是,根据我从收据验证编程指南中了解的内容,只有在使用第二种验证方法并通过自己的安全服务器将数据发送给Apple时,才有效.但是,我在本地做所有事情,并且对如何区分生产和沙盒环境感到非常困惑,以便我的应用程序可以通过评论. 任何指针或建议都会非常有帮助. 好的 应用程序启动时不
我需要实施一个后端,以验证苹果的应用程序内购买 receipt_data ,以进行应用内购买应用程序内点(即不是订阅,而不是需要的项目在每个应用程序启动中都被"记住"并重新验证). 我不精通iOS.我只需要开发后端,以便可以将其与客户端的移动应用程序集成. 我找到了进行验证的教程和示例代码,但是我非常想拥有一个实际的 receip_data 进行测试. 最好的是拥有两个 receipt_data s:一个沙盒和一个生产. 我知道,我需要支持的 receip_data 的两种变体 - 一个包含一个购买数据的数据,另一个包含一个完整的购买历史记录.如果是这样,那么为每个样本提供样本会很棒... 我意识到这本身不是一个问题,但是样本收据也对其他开发人员也很有用... 解决方案 这是一种不弃用的交易(单交易)样式收据: ewoJInNpZ25hdHVyZSIgPSAiQW5USlN6UUFqZWhXWW1ucWxvZk9ZVnFyWEo1MVVOWnI
我有一个最近更新的应用程序,可以在应用程序购买中使用.以前的版本(付款但没有应用程序购买)为1.0,当前版本为1.1. . 作为在应用中购买本质上是解锁所有功能(其中包括在付费版本1.0中),我想要一种方法,如果他们按下我的Restore购买按钮,则最初下载1.0版的用户可以升级. 为此,我首先尝试恢复购买以及对: 的响应. - (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 如果这为我提供了交易数为0的队列,我检查收据以查看安装的原始版本是否为1.0. 获得收据的代码是根据苹果的文档 - (void)tryRestoreFromOriginalPurchase { // Load the receipt from the app bundle NSError *error; NSData *receipt = [NSDat
我有一个付费iOS应用. 我需要从Apple AppStore收据中获取original_application_version号码(用户购买的第一个版本). 要获取收据,当我的应用程序加载时,我使用checkReceiptFromAppStore()函数: func checkReceiptFromAppStore() { let receipt = self.getReceipt() print("receipt Data is: \(receipt)") // prints this: receipt Data is: Optional(5141 bytes) } getReceipt()功能如下: func getReceipt() -> Data? { if Bundle.main.appStoreReceiptURL != nil { print("app receipt: \(Bundle.m
我一直在示例应用程序中的iOS购买应用程序中测试.我需要弄清楚我是否可以在发布会上立即致电refreshReceipt API,以检查用户的某些试用期订阅等的资格. 我在AppDelegate的application:didFinishLaunching:options方法中打了refreshReceipt,但它要求我提供AppStore凭据,基本上是Sandbox用户的密码.我没想到Apple Docs阅读的这种行为.是由于沙箱环境而发生的事情还是在生产环境中发生的. 另外,do Restore Purchase触发AppStore登录警报. Apple Docs说,但是最近我在手机上看到了其中一个音乐应用程序,当我选择该选项时没有要求证书.可能是他们没有使用自己的机制来调用Storekit的RestoreRorePurchase API. 解决方案 每当设备上不存在收据时,您都会收到登录提示.在沙箱中,没有安装收据,因此您总是看到弹出窗口.您还应该注意到,除非您进
在iOS中进行应用内购买,有必要验证使用订阅的收据.是否有必要验证消耗品的收据? 解决方案 不,您不需要验证消耗品的收据. 您也不需要验证订阅的收据.这里重要的是您可以还原运行订阅;但是为此,您可以使用购买ID. 一如既往地使100%确定您已向用户付款,然后告诉iOS购买成功! (您想在服务器上保留相关信息的其他各种考虑,但这不是您所问的.) 其他解决方案 必要,否.推荐,是的. 所有购买;消耗品,无偿物品和订阅容易受到欺诈性攻击.通常是IAP饼干或网络欺骗.验证收据可以减轻此问题. You can validate the receipt locally in the app (see 在本地验证收据),尽管它仍然容易受到破解. 防止欺诈的最安全方法是通过将收据发送到您的服务器,然后将其发送到Apple(请参阅 valling noroflow noreferrer">使用应用程序商店进行验证的收据). ). ). 但是,请
我已经搜索过,找不到任何方法来创建显示消息的延迟:"您的购买成功"等到验证收据完成. 我试图引用该行SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction),但消息仍然发射. func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { print("Received Payment Transaction Response from Apple"); for transaction:AnyObject in transactions { if let trans:SKPaymentTransaction = transaction as? SKPaymentTran
我的应用程序当前是一个付费应用程序.我想免费将应用程序与IAP和祖父免费转换为免费的应用程序(为所有付费应用程序的用户)免费提供IAP功能.我认为我可以使用收据验证来(1)确定应用程序的原始购买日期 - 但这似乎仅适用于IAP或(2)使用原始应用程序版本(似乎是构建版本而不是应用程序版本).但是,当我在TestFlight中测试此版本时,原始版本号始终为" 1.0".各种消息来源都说这是一个测试范围问题,并且发布应用程序将在购买应用程序的日期正确识别构建. https://forums.developer.apple.apple.apple.com/message.com/message/42107#42107 我还没有在Stackoverflow上看到此问题 - 有关查找应用购买日期的许多问题是在iOS 7中的收到验证之前或应用于应用内购买的,而不是初次购买应用程序 我有3个相关问题,可以查看我是否沿着正确的轨道前进: 问题1:我可以使用原始应用程序版本来识别在我的应用程序转换
我目前正在尝试进行本地收据验证并进行测试. 但是从苹果收据的响应来看,我得到了错误的时间响应,因此目前我很难测试申请. 这是日志信息: 这是我用于收据验证的源代码: public void CheckIfSubscriptionIsActive(bool validateReceipt) { ConfigurationBuilder builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance()); IAppleConfiguration appleConfig = builder.Configure(); bool isSubscriptionRunning = false; if (!string.IsNullOrEmpty(appleConfig.appReceipt)) { if
使用Sandbox Tester帐户来测试应用内购买收据验证的有很多示例. 但是付费应用程序本身的收据如何?我们如何在开发环境中获取应用程序收据? 我想做两件事: 防止未购买应用程序的用户运行的我们的应用程序的非法副本. 正如我看到的那样,检测到Itune帐户已连接的应用程序没有拥有该应用程序(它向用户显示了他们不拥有该应用的用户,但他们没有阻止用户继续使用该应用程序) 将应用收据发送到我们的服务器.我们想知道他们什么时候购买我们的应用程序,他们带来了什么版本的应用程序. 解决方案 可以找到答案的大多数部分/uid/tp40010573-CH104-SW1" rel =" noreferrer">在苹果文档中.但是存在差距,而Objective-C代码正在使用折衷的方法. 此Swift 3代码显示了如何获取应用程序收据并将其发送到应用程序商店进行验证.在保存所需的数据之前,您绝对应该使用App Store验证应用程序收据.要求App Store验证的
我正在Swift 3中开发一个iOS应用程序,并在本教程之后尝试实现收据验证: http://savvyapps.com/blog/how-setup-test-auto-renewable-subscription-ios-app .但是,该教程似乎是使用较早版本的Swift编写的,因此我不得不进行多个更改.这是我的收据()函数: func receiptValidation() { let receiptPath = Bundle.main.appStoreReceiptURL?.path if FileManager.default.fileExists(atPath: receiptPath!){ var receiptData:NSData? do{ receiptData = try NSData(contentsOf: Bundle.main.appStoreReceiptURL!, option
我们当前在AppStore中有付费的iOS应用程序.我们计划将其转换为使用应用内购买的免费申请.我们希望向已经在上一版本中付款的用户免费购买应用程序内购买.我认为这可以通过应用收据验证来完成.但是,一旦申请从付款转换为免费,收据会更新,购买详细信息会丢失吗? 解决方案 如果您将应用程序从付款中转换为免费,您仍然可以检查收据,并查看最初下载的版本并相应地采取行动. 当我们在一个标题中进行此操作时,我们实现了一个三层系统: 我们碰到了保存文件的版本.每当我们从版本 我们有一个"还原IAP"按钮.无论如何,如果您有任何不足的IAP,则需要在iOS上,但是我们还添加了App Store收据的检查,该收据使您可以发现用户是否最初为游戏付款.这是教程我们基于我们的代码,选择了简单的方法,但是您可能需要权衡盗版问题. 我们的报销系统还检查了我们托管的文件,该文件可以给出额外的硬币/Doubleer Unlocks/AD删除剂.如果收据检查失败(我们支持Pre-ios 7
从我的Google Play游戏机中,我链接了一个项目.然后我创建了一个服务帐户.不过,在刷新控制台时,它仍然说"与您的项目没有服务帐户". 已经等待了24小时.所有收据验证的目的. 图片1:链接项目: 图片2:创建服务时: 解决方案 我有同样的问题,我以这种方式修复了它: 在步骤2中创建服务帐户时,您需要选择一个角色来授予此服务帐户一些权限,尽管它显示了步骤是可选的,但是在某些情况下不是.如果跳过此步骤,新创建的服务帐户将不会在Google Play Console API访问页面上显示,并且您将在运行代码时收到此错误消息. . 其他解决方案 您通过凭据启用了" Google Play Android Developer API"(Google API&Services之一)的" Google Play Android Developer API"(之一). Google提供了许多用于开发人员的API,可以从他们的应用程序中调用它们.与许可证相同的凭
我有几个相似的应用程序 (A1-A3) 具有非常相同的代码库.他们都做类似的事情(图表),每一个都有针对特定用例的专业化.我现在正在考虑创建一个应用程序 (B),将专业化作为 Mac App Store In App Purchase 进行销售.所以基本上,我减少了应用程序的数量,但会提供相同的图表,只是将它们从专用应用程序销售到应用程序内. 我怎样才能最好地确保“旧"应用程序 A1-A3 的购买者可以使用他们在新软件 B 中购买的专业化?我不想向他们收取两次费用.所以,他们应该能够“恢复"他们在 B 中作为 A2 购买的专精.这可能吗?如果有,怎么做? 解决方案 在应用 B 中,在后台执行以下步骤或点击恢复 IAP 按钮: 使用 NSBundle bundleWithIdentifier 查找“旧"应用 A1-A3使用 appStoreReceiptURL 获取此捆绑包的收据验证收据 解锁功能 请记住,Apple 的条款和条件中提到了“仅应使用应用商店
我正在使用 Receigen (http://receigen.etiemble.com/) 做收据验证我的 MacOS 应用程序之一.这已经很好地工作了几年,但有些事情发生了变化.我已经有一年左右没有对此应用进行更新并提交了更改,但由于收据验证不起作用而被拒绝. 当我尝试在本地测试收据时,它会弹出 App Store 登录,我输入我的电子邮件+密码,然后我收到“应用程序已损坏"的消息. 我使用 Receigen Code Assistant 生成验证码(它会生成收据验证码并尽可能随机化,这样您就不能轻易破解每个使用 receigen 的应用程序). 我使用的是 macOS 10.14.3 和 Xcode 10.2. 这是我的接收生成代码的标题: // // This code was generated by RECEIGEN 4.0.4 on 2019-04-08 15:54:01 and will use: // // Bundle