对于iOS 6.1或更早版本,购买或恢复后收到的应用内购买交易ID在每次都是唯一的,即使在还原后,原始交易ID也不会更改.

但是,对于iOS7,事务ID和原始事务ID始终相同!我甚至尝试刷新收据,从设备中删除应用程序并重新放回来.两个字段总是相同的.

有谁知道交易ID在哪种情况下会改变?我的服务器逻辑依赖于收据本身的唯一交易ID,目前在iOS7的情况下不起作用.

以下是Apple服务器解密的应用收据.同样的结果,如果我在本地解密.

{
    environment = SandBox;
    receipt =     {
        "adam_id" = 0;
        "application_version" = "1.0";
        "bundle_id" = "com.###";
        "download_id" = 0;
        "in_app" =         (
                        {
                "is_trial_period" = false;
                "original_purchase_date" = "2014-02-18 14:23:40 Etc/GMT";
                "original_purchase_date_ms" = 1392733420000;
                "original_purchase_date_pst" = "2014-02-18 06:23:40 America/Los_Angeles";
                "original_transaction_id" = 1000000101860870;
                "product_id" = "com.###";
                "purchase_date" = "2014-02-24 09:12:21 Etc/GMT";
                "purchase_date_ms" = 1393233141000;
                "purchase_date_pst" = "2014-02-24 01:12:21 America/Los_Angeles";
                quantity = 1;
                "transaction_id" = 1000000101860870;
            }
        );
        "original_application_version" = "1.0";
        "original_purchase_date" = "2013-08-01 07:00:00 Etc/GMT";
        "original_purchase_date_ms" = 1375340400000;
        "original_purchase_date_pst" = "2013-08-01 00:00:00 America/Los_Angeles";
        "receipt_type" = ProductionSandBox;
        "request_date" = "2014-02-24 09:12:56 Etc/GMT";
        "request_date_ms" = 1393233176903;
        "request_date_pst" = "2014-02-24 01:12:56 America/Los_Angeles";
    };
    status = 0;
}

解决方法

交易日期正确更新

我们可以利用交易日期正确更新的观察结果(即使在SanBox环境中,肯定在生产中):

"in_app":[{"quantity":"1","product_id":"###","transaction_id":"1000000122762089","original_transaction_id":"1000000122762089","purchase_date":"2014-09-07 16:15:13 Etc/GMT","purchase_date_ms": "1410106513000","purchase_date_pst":"2014-09-07 09:15:13 America/Los_Angeles","original_purchase_date":"2014-09-07 05:35:16 Etc/GMT","original_purchase_date_ms":"1410068116000","original_purchase_date_pst":"2014-09-06 22:35:16 America/Los_Angeles","is_trial_period":"false"}]

您可以看到purchase_date_ms和original_purchase_date_ms有所不同.

因此:强制转录ID和日期的组合的唯一性

不仅在您的服务器数据库中存储交易ID,而且存储购买日期(而不是原始购买日期).这两个值的组合在您的数据库中不会存在于合法还原事务中,但如果收据是重播,则会与现有记录相冲突.

请注意,我们正在查看验证服务器的响应,这意味着客户端将无法更改日期,因为它们无法更改交易ID而不会破坏收据的有效性.

当iOS7应用收据中的交易ID正在更改时?的更多相关文章

  1. xcode – Mavericks下的Cocoa Receipt Verification测试 – 问题

    在MountainLion下,一切都很完美.小牛,不是那么多.问题:我无法在Mavericks下进行任何收据验证测试.我正在使用Receigen生成启动和应用内购买收据验证.我在Mavericks10.9下使用Xcode5.02.这是它在MountainLion下的工作方式……与上面相同–存档/测试MASID/Finder运行应用程序.但是,现在我在控制台中收到了这个:退出代码:173[这应该没问题,如上所述]storeagent:未签名的应用.???

  2. ios – Apple应用程序内购买收据 – 在服务器端验证

    我想验证它,并确保这是独一无二的.我担心的是:如果有人会收到一张有效收据,他就可以破解我们的服务器端API,并使用相同的有效收据进行无限数量的应用内购买.我应该以某种方式解密并检查transaction_id的“原始”收据,即我发送给Apple进行验证的收据?

  3. 对于NSManagedObject,Xcode 9构建了Date vs NSDate的问题

    Xcode9为模拟器与设备中的实体的Date类型属性生成不同的代码.我在coredata中将类设置为类别/扩展名下的codegen功能.直到Xcode8.3(最新)它一切正常.下面是Xcode9为属性自动生成的代码–在设备上:–和,在模拟器上:–有谁遇到过这个问题?对于一个有50个成员的项目来解决这个问题的最佳解决方案是什么,直到Xcode更新修复它?

  4. iOS兼容输入类型日期 – 设置最小值最大值

    我试图在UIWebViewiOS应用程序中使用jQueryMobile设置日期,值设置正确但最小和最大属性日期设置不起作用.和当我在模拟器上运行它时,当选择日期字段时,日期选择器可见,但未设置最小,最大日期.解决方法模拟器的safari不支持设置输入类型=“日期”的最小值和最大值.您可以通过导航到thissite并尝试控制来测试它.它(可能)可以在桌面浏览器上运行,但不会在模拟器的浏览器或UIWebView中运行.

  5. ios – 设置NSDataDetector的上下文日期

    假设今天是2014年1月20日.如果我使用NSDataDetector从“明天下午4点”字符串中提取日期,我将得到2014-01-21T16:00.大.但是,假设我希望NSDataDetector假装当前日期是2014年1月14日.这样,当我解析“明天下午4点”时,我将得到2014-01-15T16:00.如果我在设备上更改系统时间,我会得到我想要的.但是,有没有办法以编程方式指定它?

  6. 无法从iOS 7中的App Store Receipt获取original_application_version

    我正在尝试为我当前的客户实现从付费模式到免费增值模式的无缝过渡,但是在收据中获取original_application_version时遇到了问题.我的应用程序仅适用于iOS7,如您所知,Apple在iOS7中引入了UnifiedReceipt,如上所述,它应包含有关用户原始购买的信息.所以我的想法如下:1.解码收据.2.检查是否在此新的免费增值版本之前购买了原始产品.3.如果是–解锁所有IAP

  7. ios – 如何自动生成日期属性为Date而不是NSDate的NSManagedObject子类?

    我目前正在将我的项目更新为Swift3,并且我将所有的NSDate方法和扩展都移动到Date以便在应用程序中保持标准.问题是我使用Xcode自动生成我的NSManagedobject子类,它生成日期属性为NSDate而不是Date.有没有办法用日期属性作为日期生成它?

  8. ios – 如何减去日期组件?

    今天是星期五,根据NSCalendar,这是6.我可以通过使用以下内容得到这个我怎么得到上周六的工作日组件,应该是7?

  9. iOS – 友好的NSDate格式

    我需要在我的应用程序中显示帖子的日期给用户,现在我用这种格式:“5月25日星期五”.如何格式化NSDate以阅读“2小时前”的内容?使其更加用户友好.解决方法NSDateFormatter不能做这样的事情;你将需要建立自己的规则.我想像:所以这是打印’x分钟前’或’x小时前’从日期起24小时,通常是一天.

  10. ios – NSDate得到上周,上个月的问题

    我需要从当前日期开始获得上一个礼拜.所以我找到了可以重新计算当前日期添加间隔的解决方案这个参数:[[NSDatedate]dateByAddingTimeInterval:-604800.0](前一周)[[NSDatedate]dateByAddingTimeInterval:-2629743.83](取得上个月)正如我想,为了让周,这种方法运行良好,没有任何问题,因为每周有七天,间隔没有改变.但

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部