开篇:关于iOS内购整体流程网上能找到很多。我抽丝剥茧,着重说一下二次验证及收据回传的数据问题。

二次验证

关于二次验证,其实有两种做法,第一种是在app端验证,第二种也是安全防盗的一种,在服务端进行验证。

具体区别不一一表述,可以查看下面的链接。

iOS二次验证两种做法的区别

我要着重说的是二次验证的实际做法和收到的数据是什么。

一、二次验证具体如何验证

// 从沙盒中获取交易凭证(收据)

NSURL *receiptUrl = [[NSBundle mainBundle] appStoreReceiptURL];

NSData *receiptData = [NSData dataWithContentsOfURL:receiptUrl];

// 转化为base64字符串

NSString *receiptString = [receiptData base64EncodedStringWithOptions:0];

为了方便拿到数据,我们在app端上进行验证,注意⚠️实际开发中都是在服务端进行验证的。

// 拼接请求数据

NSString *bodyString = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\"}", receiptString];

NSData *bodyData = [bodyString dataUsingEncoding:NSUTF8StringEncoding];

// 创建请求到苹果官方进行购买验证

NSURL *url = [NSURL URLWithString:verifyReceipt_url];

NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url];

requestM.HTTPBody = bodyData;

requestM.HTTPMethod = @"POST";

// 创建连接并发送同步请求

NSError *error = nil;

NSData *responseData = [NSURLConnection sendSynchronousRequest:requestM returningResponse:nil error:&error];

if (error) {

NSLog(@"验证购买过程中发生错误,错误信息:%@",error.localizedDescription);

return;

}

NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingAllowFragments error:nil];

二、收据回传得到的数据分析

上文得到的dic就是我们通过收据得到的所有数据

在这里有个坑,我相信有很多同学都踩过。

就是你支付成功了,但是在这个数组里却找不到你想要的数据。

我们可以看下面一张图,然后再分析分析。

内购类型.png

可以看到有四种类型,但是具体到我们项目中我们该如何选择和操作呢。

1.消耗型:比如我们游戏里的金币,6元600个金币,你使用完了就失效了。比如现在各大视频app推出的电影购买,6元买完一张影片之后,你如果想买下一张影片就必须再次购买。

2.非消耗型:比如某app推出永久会员,购买一次终身使用,就是非消耗型。再比如游戏过关时app的某关,你一直过不去,花钱购买过去了,等你下次再打开app时,他这关默认是已经通过的。

3.自动续订型:具体可以看爱奇艺视频开通会员(腾讯app也类似),里面就有一个自动续订会员。也就是到期了,它会自动从你的苹果账号上扣钱。这个慎点慎点,他们这样搞很坑钱。

4.非自动续订型:这个就是1个月优酷会员啦,或者3个月季度会员啥的。有期限,到期时也不会自动扣钱。一般的都是选择这个,不然像爱奇艺的自动续订,用户不知情时,会被骂死,哈哈

说了这么多,来看看订单数据长啥样

{

product_id = "lalalalahahaha",//商品的标识,和产品定,随便写但是不能重复

quantity = "1",//购买商品的数量

transaction_id = "1000000357637984",//交易的标识

purchase_date_ms = "1512613065000",//购买时间毫秒

original_purchase_date_pst = "2017-12-06 18:17:45 America/Los_Angeles",//购买时间,太平洋标准时间

purchase_date_pst = "2017-12-06 18:17:45 America/Los_Angeles",//太平洋标准时间

original_purchase_date_ms = "1512613065000",//毫秒

is_trial_period = "false",

original_purchase_date = "2017-12-07 02:17:45 Etc/GMT",//原始购买时间

original_transaction_id = "1000000357637984",//原始交易ID

purchase_date = "2017-12-07 02:17:45 Etc/GMT"//购买时间

},

我们得到的字典里如果有多条数据,就会有一个数组in_app。

如果只有一条数据,或者没有数据,就没有in_app。

in_app里的数据格式就如上文代码所书。

所有的订单信息都在in_app里。所以我们要找到最新成功的那条数据,就需要在这里面去找。

注:

1.消耗性的和其他的有区别,消耗性的下一次购买的,会覆盖上一次购买的,所以只有一条消耗性的订单信息,当然也是最新的。

2.其他三种每次购买,都会生成新的订单信息,不会覆盖原来的,所以你购买多少次,上面就会显示多少条。

三、内购二次验证实际开发中具体做法

1.我们把收据信息传给服务器

2.服务器自行处理所有的订单信息,返回一个成功与失败的状态给我们。所有的操作,后台都已经记录在案了,我们不再需要管。我们只需要知道,此次购买是否成功就行了。

结语:内购其实很简单,只是有时候不经意就会入坑,在此特意记录下困惑的地方,帮助自己深刻记忆,也希望帮助到其他遇到该问题的童鞋。

ios内购二次验证安全性问题_iOS内购之二次验证相关推荐

  1. ios内购二次验证安全性问题_iOS 内购遇到的坑

    一.内购沙盒测试账号在支付成功后,再次购买相同 ID 的物品,会提示如下内容的弹窗.您以购买过此APP内购项目,此项目将免费恢复 您以购买过此APP内购项目,此项目将免费恢复.PNG 原因: 当使用内 ...

  2. ios 内购正式环境_iOS 内购的实现

    自己开发的视频直播项目,牵涉到充值金币,用到了苹果公司的内购,趴坑了两天,这里总结下实现苹果内购. 一. 创建测试App 首先你需要登录 App的ItunesConnection,你会看到如下界面 简 ...

  3. ios 内购正式环境_iOS 内购最新讲解

    本文为CocoaChina网友IIronMan投稿 一.总说内购的内容协议.税务和银行业务 信息填写 内购商品的添加 添加沙盒测试账号 内购代码的具体实现 内购的注意事项 二.协议.税务和银行业务 信 ...

  4. 【iOS内购支付】Uniapp拉起苹果内购支付注意事项、实现步骤以及踩过的坑(手把手教程)

    前言 Hello!又是很长时间没有写博客了,因为最近又开始从事新项目,也是第一次接触关于uniapp开发原生IOS应用的项目,在这里做一些关于我在项目中使用苹果内购支付所实现的方式以及要注意的事项,希 ...

  5. java ios内购凭证_iOS内购看我就够了(含代码)

    导入头文件#import 遵循协议 [[SKPaymentQueue defaultQueue] addTransactionObserver:self];// 4.设置支付服务 -(void)sta ...

  6. (0040) iOS 开发之10.3新特性:程序内评价

    程序内评价之SKStoreReviewController 在ios 10.3之后,系统提供了一个SKStoreReviewController类,可以帮助在app内部实现评价.App实现评价一般有下 ...

  7. 【内网安全-隧道搭建】内网穿透_Ngrok上线(美版、国版二开)

    目录 一.准备 1.意义: 2.项目: 二.内网穿透 1.简介: 三.Ngrok(入门上线) 1.简述: 2.Ngrok入门上线(国版二开) 3.相关工具: 2.Ngrok入门上线(美版) 一.准备 ...

  8. 一致性协议raft详解(二):安全性

    一致性协议raft详解(二):安全性 前言 安全性 log recovery 为什么no-op能解决不一致的问题? 成员变更 Single mempership change raft用到的随机时间 ...

  9. .NET (二)委托第二讲:内置委托Func

    .NET (二)委托第二讲:内置委托Func 在上一章节中,我们自己声明了一个委托: public delegate bool Cal(int num); 接受int参数,返回bool类型,目的是过滤 ...

最新文章

  1. C# 数据库连接笔记
  2. tomcat安装apr优化
  3. Extranet MPLS ×××
  4. linux线程一直在增加,在.net core中遇到的奇怪问题:内存与线程数一直增长
  5. 把握人工智能命脉的有效方法
  6. “约见”面试官系列之常见面试题第十五篇之jsonp(建议收藏)
  7. ContOS网络连接及简单的ssh Xshell连接!
  8. Android 系统性能优化(79)---提升Android应用的启动速度与设计
  9. 【文献阅读】ResNet-Deep Residual Learning for Image Recognition--CVPR--2016
  10. extjs FormPanel更改为普通表单提交,提交到iframe显示
  11. 计算机键盘突然失灵,电脑键盘工作时突然失灵,这十个方法可以“救你一命”...
  12. eWebEditor的使用
  13. 【WinHex篇】WinHex制作特定区域镜像教程
  14. qq公众平台出错了609_【萌威分享】无本博客公众号矩阵2.0,接单平台,接广告,卖产品,收费qq群,变现站...
  15. 90%的 CTO 都做不好绩效管理?看看这个十年 IT 老兵都有什么绝活?
  16. Python实现将人脸表情数据集fer2013转化为图像形式存储本地
  17. 怎样把软件从计算机移到桌面上,怎么样才能将旧电脑的重要软件移动到新电脑上?...
  18. 核酸检测预约和结果查询系统
  19. 基于Nano Pi NEO4开发板的AS项目开发
  20. python人脸识别门禁系统_智能人脸识别门禁系统

热门文章

  1. 乐视宣布举行智能生态发布会
  2. VS code代码片段
  3. 第二批计算机专业有哪些学校,第二批!初试科目大调整,又有院校发通知,参考书、大纲都改啦!...
  4. 发红包小程序最终版(趣味)
  5. Linux -- ftok函数
  6. 宝玉论“后生可畏”,存于此以自勉
  7. 【Python】获得指定路径下的所有jpg和png文件
  8. “深入理解”—选择排序算法
  9. 浅谈排序算法:冒泡排序法和选择排序法的区别
  10. Pulsar快速了解