IOS 内购分为四种商品类型:

  1. 消耗品项目
  2. 非消耗品项目
  3. 自动续期订阅
  4. 非续期订阅

基本实现流程

  1. 添加支付监听
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

2.删除支付监听
在界面销毁处,添加删除支付监听,或者在 deallo方法处销毁

 [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];

3.查询商品
IOS的查询商品信息、支付,都需要先调用以下方法,获取SKProduct后,进行购买。

 SKProductsRequest *buyRequets = [[SKProductsRequest alloc] initWithProductIdentifiers:productIDs];buyRequets.delegate = self;[buyRequets start];

4.实现SKProductsRequestDelegate接口

//MARK: - SKProductsRequestDelegate
//接受到产品返回的信息
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {NSArray *products = response.products;if (products == nil || products.count <= 0) {DLog(@"商品均不存在,请检查传递的商品ID"); return;}if (response.invalidProductIdentifiers.count > 0) {DLog(@"不可用的商品ID: %@",response.invalidProductIdentifiers); }//向苹果发送请求for(SKProduct *product in products){if ([self.productIdentifier isEqualToString:product.productIdentifier] ) {//self.productIdentifier 研发传递过来需要购买的商品ID//支付逻辑SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];payment.applicationUsername = applicationUsername;[[SKPaymentQueue defaultQueue] addPayment:payment];}}
}
  1. 实现SKRequestDelegate接口
//MARK: - SKRequestDelegate
//请求商品列表等请求完后的回调
- (void)requestDidFinish:(SKRequest *)request {if ([request isMemberOfClass:[SKReceiptRefreshRequest class]]) {DLog(@"刷新凭据完成,开始检查是否有遗留的校验订单");//此处需要重新校验订单 }DLog(@"反馈信息结束");
}
//请求商品列表失败等回调
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {DLog(@"购买请求错误: %@", error);
}
  1. 实现SKPaymentTransactionObserver接口
    当用户进入购买流程后,购买结果会在次回调中响应。
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions {for (SKPaymentTransaction *tran in transactions) {switch (tran.transactionState) {case SKPaymentTransactionStatePurchasing:DLog(@"商品加入列表"); break;case SKPaymentTransactionStatePurchased:{DLog(@"商品购买成功");                NSString *applicationUsername = tran.payment.applicationUsername;NSString *orginalID;if (tran.originalTransaction) {orginalID = tran.originalTransaction.transactionIdentifier;// 如果是自动续费的订单,originalTransaction会有内容DLog(@"自动续费的订单,originalTransaction =%@",tran.originalTransaction);} else {// 普通购买,以及第一次购买自动订阅DLog(@"普通购买,以及第一次购买自动订阅");} [[SKPaymentQueue defaultQueue] finishTransaction:tran];break;} case SKPaymentTransactionStateFailed:{ DLog(@"商品购买失败");[[SKPaymentQueue defaultQueue] finishTransaction:tran]; }break;case SKPaymentTransactionStateRestored:DLog(@"已经购买过此商品 =%@",tran.payment.productIdentifier); [[SKPaymentQueue defaultQueue] finishTransaction:tran];break;case SKPaymentTransactionStateDeferred:DLog(@"交易状态未决定"); break;default:[[SKPaymentQueue defaultQueue] finishTransaction:tran];break;}}
} //所有的Restore结束后,进入此回调
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {}

如果需要透传参数(把参数传递给苹果服务器,然后再把此参数原样返回,可用于标识用户),需要设置:

 SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];//设置透传参数payment.applicationUsername = applicationUsername;

获取透传参数:
transaction.payment.applicationUsername

对于 1.非消耗 2.自动续期订阅 3.非续期订阅 要提供restore功能

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

IOS OC IPA内购流程相关推荐

  1. iOS苹果内购流程(Apple Pay)

    好文:https://github.com/lintide/ApplePayDemo 苹果内购流程 字数631 阅读133 评论1 喜欢6 1.登录开发者中心[开发者中心链接](https://dev ...

  2. iOS开发·内购流程

    2019独角兽企业重金招聘Python工程师标准>>> 说明: 涉及到金额交易,苹果审核的一般严格许多.苹果在涉及需要支付中间币的购买必须走苹果内购(例:点券.钻石.K币等等),若是 ...

  3. iOS内购流程文档-Lion

    iOS内购流程: iOS内购 什么时候用到呢? 虚拟产品就需要用到iOS内购; 购买的商品,是在本app中使用和消耗的,就一定要用内购,否则会被拒绝上线,例如:游戏币,在线书籍,app中使用的道具等. ...

  4. iOS:苹果内购实践

    iOS 苹果的内购 一.介绍 苹果规定,凡是虚拟的物品(例如:QQ音乐的乐币)进行交易时,都必须走苹果的内购通道,苹果要收取大约30%的抽成,所以不允许接入第三方的支付方式(微信.支付宝等),当然开发 ...

  5. iOS-iOS内购流程(手把手图文教程)

    前言 一直觉得苹果生态圈很安全,iOS操作系统也很流畅,而且软件有严格的审核机制,软件来源唯一(当然是你不越狱),但是这也为苹果的霸权铺路:上家公司做了一个APP,可以充值虚拟金币,但是如果是虚拟道具 ...

  6. 【iOS】苹果内购调研

    参考文章 官方文档 iOS开发内购全套图文教程 App Store上架指导 苹果不允许 iOS 应用内置购买(IAP)使用第三方支付方式,那么跨平台的电子书阅读器怎么解决这个问题? 应用内购(In-A ...

  7. iOS开发支付 — 内购(IAP)

    为什么要使用内购? 如果你购买的商品,是在本App中使用和消耗的,就一定要用内购,否则会被拒绝上线,例如:游戏币.在线书籍.直播中用来打赏用的金币.app中使用的道具等.如果是直接购买商城之类的快递包 ...

  8. 关于iOS订阅型内购开发

    ####由于公司项目里面有一个类似购买一个时期的产品,原本使用消耗式内购来做,但是被苹果审核拒绝了,苹果建议(要求)使用订阅式内购来做这个,于是就来研究一下 #####1.第一步添加内购产品 首先还是 ...

  9. IOS内购流程从0-1手把手教会

    苹果掌握着可能是全球最重要的APP分发渠道,然而30%的抽成近年来也被人批评,现在苹果似乎也看到反对意见了,从2021年1月1日开始,部分小型企业的分成费用降低到15%. 据报道,苹果将于2021年1 ...

最新文章

  1. mysql自动挂载存储_Linux开机自动挂载存储
  2. SVG基本形状及样式设置
  3. 电路板必须用c语言编程吗,上大学才知道绿油油的板子叫PCB,如何成为一名电子工程师...
  4. 与登录shell相关的文件
  5. :host :host-context ::ng-deep详解
  6. 带注释的控制器– Spring Web / Webflux和测试
  7. 万字长文!java读取json文件数据给对象
  8. 编码规范 | Java函数优雅之道(下)
  9. 持久化框架数据持久化框架(JPA)及其具体实现
  10. linux sftp 增加用户(centos)
  11. 2009年计算机一级考试真题及答案
  12. 宝塔面板搭建方维直播图文教程
  13. RFC(请求注解)--各种协议-标准
  14. springboot基于协同过滤算法的书籍推荐毕业设计源码101555
  15. php整数溢出 ctf,PWN INTEGER OVERFLOW 整数溢出
  16. 微软新版edge浏览器如何开启画中画模式 (微软新版edge)
  17. JS高级 之 RegExp - 正则表达式
  18. 中国互联网11个创业派系456创始人名单大全
  19. python animation 轨迹_在jupyter noteb之外显示动画
  20. 使用QE绘制Band Structure

热门文章

  1. Java Web开发技术教程入门-初识动态网页
  2. 硅光模块和普通光模块的区别以及两者的市场前景分析
  3. 过于在意别人的看法,怎么办?
  4. 用二维数组遍历 公司销售额
  5. react h5 自定义数字+大写字母键盘
  6. 合格率计算(只作新手参考)
  7. 国庆节,零代码帮你搞定假期美食菜单
  8. 路径规划、路径平滑与跟踪
  9. jquery如何设置占位隐藏_jquery控制元素的隐藏和显示的几种方法。
  10. Ubuntu下dpkg安装软件遇到包依赖问题的处理方法