如果有人以后要在做内购这一块。希望可以好好的阅读这篇文章,虽然不是字字珠玑。但是也是本人亲人趟过了无数的坑,希望可以对大家有所帮助! 
下面是在研究工程中遇到的问题(
iOS 内购的流程如下

1. 程序向服务器发送请求,获得一份产品列表。
2. 服务器返回包含产品标识符的列表。
3. 程序向App Store发送请求,得到产品的信息。
4. App Store返回产品信息。
5. 程序把返回的产品信息显示给用户(App的store界面)
6. 用户选择某个产品
7. 程序向App Store发送支付请求
8. App Store处理支付请求并返回交易完成信息。
9. 程序从信息中获得数据,并发送至服务器。
10. 服务器纪录数据,并进行审(我们的)查。
11. 服务器将数据发给App Store来验证该交易的有效性。
12. App Store对收到的数据进行解析,返回该数据和说明其是否有效的标识。
13. 服务器读取返回的数据,确定用户购买的内容。
14. 服务器将购买的内容传递给程序。
因为我在填写完税务信息之后一直显示合同正在处理,然后也没处理就开始集成代码但是一直提示我产品获取失败,尝试了各种方法之后依然没什么卵用。后来才知道因为我们的项目是第一次进行内购方面的申请需要所以需要必须审核通过之后才能进行测试。终于开始测试了,一点要切记!在完成这一步后苹果会给你一份官方的文档。但是写的比较简单。时不时就会崩溃!最大的问题就是连接不到itunes 所以这一块一定要自己在做一步处理。要不就是在给自己挖坑!SKPaymentQuent来做一个一个监听,处理各种反馈情况!
 
 
2.内购的话还有一点是需要注意的就是内购的时候发生漏单的情况
1.你和苹果交互成功了。但是苹果没有把订单的信息给服务器造成了漏单的情况
2.你和苹果交互成功了。苹果和你的服务器也交互成功了但是服务器没有把成功的信息给你造成漏单的情况(当然这样的情况会与很多可能在服务器给你数据的时候应用闪退或者请求超时都可能造成这种情况的发生)
大概的内购发生漏单的情况主要就是这2种
 
下面我们来说说如何去避免这种情况的发生
1.首先苹果的服务器并没有大家想的那么的稳定。苹果的服务器其实很多时候都是不稳定的。所以入如果是第一种情况下造成的漏单的情况。只能说我们也是无能为力了。因为我们根本拿不到关于订单的任何信息。这样发生的漏单的
我们暂时做不了任何的处理 (在平常的项目使用中这种情况还是比较常见。)
2.针对第二种情况我们还是可以有好多的优化地方。基本上可以规避这种情况下的漏单。不是有那么一句话吗尽人事。知天命!
下面就是解决办法
1. 我们用的是SKPaymentQuent
 [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
通过这样的方法来监听购买的结果,SKPaymentQuent有个机制有个特点就是如果监听到的结果是失败,那么在下次APP重新启动的时候就会继续往下走。所以这个监听类可以
处理一部分的漏单情况直到直到SKPaymentQuent 这个类销毁
 
 
 [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
2.本地的缓存 下面是具体实现的逻辑和思路
在请求咱们的服务器的时候把苹果给你的那一长串验证码先进行一个的本地的缓存  。经过慎重的思考和讨论建议缓存如下几个内容:1.验证码,2.用户名 3.当前的时间
 
如果请求成功则把当前缓存的内容删除。如果没成功在下次进入该界面的时候直接进行请求。
 
3.服务器做一个记录。苹果给服务器的时候做个记录以确保万无一失!
 
 

by : 乔智祥

 

iOS - 内购总结的更多相关文章

  1. IOS内购支付server验证模式

    IOS 内购支付两种模式: 内置模式 server模式 内置模式的流程: app从app store 获取产品信息 用户选择须要购买的产品 app发送支付请求到app store app store ...

  2. IOS内购支付服务器验证模式

    IOS 内购支付两种模式: 内置模式 服务器模式 内置模式的流程: app从app store 获取产品信息 用户选择需要购买的产品 app发送支付请求到app store app store 处理支 ...

  3. Unity苹果(iOS)内购接入(Unity内置IAP)

    https://www.jianshu.com/p/4045ebf81a1c Unity苹果(iOS)内购接入(Unity内置IAP) Kakarottog                       ...

  4. iOS 内购遇到的坑

    一.内购沙盒测试账号在支付成功后,再次购买相同 ID 的物品,会提示如下内容的弹窗.您以购买过此APP内购项目,此项目将免费恢复 原因: 当使用内购购买过商品后没有把这个交易事件关,所以当我们再次去购 ...

  5. 苹果IOS内购二次验证返回state为21002的坑

    项目是三四年前的老项目,之前有IOS内购二次验证的接口,貌似很久都没用了,然而最近IOS的妹子说接口用不了,让我看看啥问题.接口流程时很简单的,就是前端IOS在购买成功之后,接收到receipt后进行 ...

  6. iOS 内购相关

    iOS 内购相关 下面总结一下过往订阅和内购的项目的代码方面的实现细节和注意事项,特别是掉单方面的处理. 后台的协议.商品ID.银行卡.内购类型.沙盒账号测试人员都由运营或者产品在苹果后台中申请处理. ...

  7. iOS 内购讲解

    一.总说内购的内容 1.协议.税务和银行业务 信息填写 2.内购商品的添加 3.添加沙盒测试账号 4.内购代码的具体实现 5.内购的注意事项 二.协议.税务和银行业务 信息填写 2.1.协议.税务和银 ...

  8. IOS内购--后台PHP认证

    参考网址:https://blog.csdn.net/que_csdn/article/details/80861408 http://www.php.cn/php-weizijiaocheng-39 ...

  9. IOS - 内购

    内购的五种产品类别 •非消耗品(Nonconsumable)买了就有,头衔,功能 –指的是在游戏中一次性购买并拥有永久访问权的物品或服务.非消耗品物品可以被用户再次下载,并且能够在用户的所有设备上使用 ...

随机推荐

  1. 简单倒计时js代码

    //倒计时 var timer=null; var interval = 1000; function ShowCountDown(year,month,day,hour,minute,second, ...

  2. 腾讯织云:DevOps 流水线应用平台践行之路

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:梁定安,腾讯织云负责人,目前就职于腾讯社交网络运营部,任运维技术总监,开放运维联盟委员,腾讯云布道师,腾讯课堂运维讲师,EXIN D ...

  3. 如何修改ionic Popup的样式

    第一次用ionic的Popup时感觉很好用,但是太丑了.但是又不会修改自定义的样式,只能自己写了个模态框.后来仔细搜索了一下.发现还是可以修改的. var confirmPopup = $ionicP ...

  4. spring boot 登录注册 demo (四) -- 体验小结

    之前没有折腾过Spring,直接上来怼Spring Boot异常痛苦,参考着官网的guide(https://spring.io/guides)写了几个demo: spring boot 跑起来确是方 ...

  5. GC选择之CMS 并发标记清除

    CMS收集器 Concurrent Markup Sweep 并发标记清除 使用了标记-清除算法 与标记-压缩相比,并发阶段会降低吞吐量 算法作用在老年代以及永久区(新生代使用ParNew) -XX: ...

  6. 【Ubuntu 16】 wifi连接 并解决无桌面图标问题

    笔记本上装了win10和ubuntu16双系统,ubuntu16有半年多没使用了,今天一登录成功后,没有桌面啦,一个干净的壁纸映入眼帘,真操蛋. 上网搜索后总结:应该是应用软件中心出了问题,可是,没法 ...

  7. java模拟斗地主发牌看牌

    import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; public class Dou ...

  8. Spring(三)--AOP【面向切面编程】、通知类型及使用、切入点表达式

    1.概念:Aspect Oriented Programming 面向切面编程 在方法的前后添加方法   2.作用:本质上来说是一种简化代码的方式      继承机制      封装方法      动 ...

  9. 【全面总结】js获取元素位置大小

    [js获取元素位置+元素大小]全面总结 目录 1.关于offset offsetParent(只读) offsetTop(只读) offsetLeft(只读) offsetHeight(只读) off ...

  10. mysql 返回自增id

    String dateNow=  DateTime.Now.ToString("yyyyMMddhhmmss"+  new Random().Next(1, 99)); //随机数 ...