这次遇到的问题主要有两点

1.税收那一块没有填好一些东西,这样会导致 在代码里面调用SDK 没有办法返回 预先创建好的商品类。

2.进行付款时候 将记录进行本地存储。服务端也做这样的处理。 (毕竟这个是涉及到钱,谨慎一点好)

假设 我选择的product_id : com.mytest.xixi

这个id 是在 itunesconnect 设置好

首先要 假如通知,通知是一对的

-(void)dealloc
{//解除监听的通知[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.//假如监听的通知[[SKPaymentQueue defaultQueue] addTransactionObserver:self];//假如这里是选择了product_id = @"com.mytest.xixi";selectProductID = @"com.mytest.xixi";[self doIAPAction:selectProductID];
}

首先要判断是否能够可以使用IAP, 发起请求向苹果询问是否有哪些商品可售

- (void)doIAPAction:(NSString *)selectArg
{if([SKPaymentQueue canMakePayments]){[self requestProductData:selectArg];}else{NSLog(@"不允许程序内付费");}
}//请求商品
- (void)requestProductData:(NSString *)selectArg
{NSLog(@"-------------请求对应的产品信息----------------");NSArray *product = [[NSArray alloc] initWithObjects:selectArg,nil];NSSet *nsset = [NSSet setWithArray:product];self.request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];self.request.delegate = self;[self.request start];}

有网络请求 那么肯定会有成功或者失败,下面这几个都是代理里面可以找到

//收到产品返回信息
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{NSLog(@"--------------收到产品反馈消息---------------------");NSArray *product = response.products;if([product count] == 0){NSLog(@"--------------没有商品------------------");return;}NSLog(@"productID:%@", response.invalidProductIdentifiers);NSLog(@"产品付费数量:%ld",(long)[product count]);SKProduct *p = nil;for (SKProduct *pro in product){NSLog(@"%@", [pro description]);NSLog(@"%@", [pro localizedTitle]);NSLog(@"%@", [pro localizedDescription]);NSLog(@"%@", [pro price]);NSLog(@"%@", [pro productIdentifier]);if([pro.productIdentifier isEqualToString:selectProductID]){p = pro;}}SKPayment *payment = [SKPayment paymentWithProduct:p];NSLog(@"发送购买请求");[[SKPaymentQueue defaultQueue] addPayment:payment];
}
//请求失败
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error
{NSLog(@"------------------错误-----------------:%@", error);
}- (void)requestDidFinish:(SKRequest *)request
{NSLog(@"------------反馈信息结束-----------------");
}
//监听购买结果
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction
{for(SKPaymentTransaction *tran in transaction){switch (tran.transactionState){case SKPaymentTransactionStatePurchased:NSLog(@"交易完成");[self completeTransaction:tran];break;case SKPaymentTransactionStatePurchasing:NSLog(@"商品添加进列表");break;case SKPaymentTransactionStateRestored:NSLog(@"已经购买过商品");break;case SKPaymentTransactionStateFailed:NSLog(@"交易失败");NSLog(@"%@",tran);[self failedTransaction:tran];break;default:break;}}
}//交易结束
- (void)completeTransaction:(SKPaymentTransaction *)transaction
{NSLog(@"交易结束");// Your application should implement these two methods.NSString * productIdentifier = transaction.payment.productIdentifier;if ([productIdentifier length] > 0){// 向自己的服务器验证购买凭证[self verifyPruchase:transaction];}// Remove the transaction from the payment queue.[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}- (void)failedTransaction:(SKPaymentTransaction *)transaction
{HIDE_PROGRESS(self.view);if(transaction.error.code != SKErrorPaymentCancelled){NSLog(@"购买失败");}else{NSLog(@"用户取消交易");}[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
#pragma mark 验证购买凭据
- (void)verifyPruchase:(SKPaymentTransaction *)transaction
{// 验证凭据,获取到苹果返回的交易凭据// appStoreReceiptURL iOS7.0增加的,购买交易完成后,会将凭据存放在该地址NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];// 从沙盒中获取到购买凭据NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL];NSString *encodeStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];NSString *transId = transaction.transactionIdentifier;NSString *productId = transaction.payment.productIdentifier;if (!encodeStr){return;}//下面开始描述处理的逻辑/** 1.首先将这些数据(encodeStr,productId,transId,...)进行加密什么的 存储在本地数据库* 2.然后将 这些数据 传到服务端 让服务端 跟apple 进行一次验证(也有人放在客户端代码里面进行验证),服务端接收到这些数据最好也是存储一下* 3.服务端和apple验证成功之后返回告诉客户端通过之后,客户端这边就把本地数据库存储的相关数据给删掉,服务端也删。(两边都做处理保证一下,毕竟涉及到金钱)* 4.这就完成一个正常的流程。(我自己个人认为)** 3.1 也会出现这种情况 可能服务端和apple 验证的时候 时间太久了导致超时,那么在客户端要做点处理,可以选择在打开app的时候把数据库的存储的数据找出来重新进行一下验证,或者做一个定时器什么的 多久就扫一下数据库 是否有数据要重新验证。*/
}

iOS苹果IAP 充值相关推荐

  1. java(jfinal) 接入ios苹果内购(连续包月订阅),服务端将二次验证。

    大致流程: 1.ios端进行支付,然后收到苹果的一串数据(也叫收据),然后ios端将其转码为BASE64编码的字符串. 2.ios端请求服务端接口,将数据传给服务端,服务端拿到数据后,通过一系列处理后 ...

  2. JAVA项目之苹果IAP内购JAVA服务器验证流程详解

    1.前言 本博客是经历过多个项目检验的, 绝对真实, 适应于对苹果iap内购稍微有些了解的JAVA开发人员,  认真看,  定能完美解决苹果内购问题. 苹果IAP内购支付实际上是"将客户端支 ...

  3. uni app ios 苹果内购

    app ios 苹果内购 的步骤 1,准备工作先要uniapp 开发ios 内购需要准备的沙盒 测试账号,在苹果手机登录沙盒账号 也就是把自己的Apple ID退出登录沙盒账号,manifest.js ...

  4. ios 内购正式环境_php服务端处理 ios内购充值

    app一直没有接入iOS内购充值,随着业务支付功能越来越多,ios内购充值就提到日程上来了.那么,ios内购充值怎么做呢? 其实iOS内购充值是通过客户端接入iOS的IAP模块(In-AppPurch ...

  5. iOS内购充值 服务器端处理

    文章已迁移到新博客 http://cwqqq.com/2017/12/ios_in-app_pay_server_side_code iOS内购充值,是通过客户端接入iOS的IAP模块(In-App ...

  6. iOS 苹果2.1大礼包回复模版-guideline 2.1 Information Needed

    iOS 苹果2.1大礼包回复模版-guideline 2.1 Information Needed 回复模板 1 XX彩票 Dear Aoo Review Team. 您好,我们这边按照您说的那些可能 ...

  7. 苹果IAP内购验证工具类

    苹果内购 java验证类 package com.utils.ios; import lombok.extern.slf4j.Slf4j;import javax.net.ssl.*; import ...

  8. 【IAP支付之三】苹果IAP安全支付与防范 receipt收据验证

    这里网上的朋友已经介绍的很详细了,具体的链接已经无法找到了. 这里主要说几点本人在开发中遇到的问题: 1.漏单必须要处理,玩家花RMB购买的东西却丢失了,是绝对不能容忍的.所谓的漏单就是玩家已经正常付 ...

  9. 鸿蒙手机王者荣耀怎么充值,苹果手机王者荣耀怎么充值?苹果系统充值王者荣耀教程...

    在苹果系统中其实是可以充值王者荣耀的,具体该怎么充值呢?一起来看吧. 苹果系统充值王者荣耀教程 首先,请大家登录苹果系统中安装的王者荣耀游戏,这里我以iPad为例,打开IOS系统中安装的王者荣耀游戏主 ...

最新文章

  1. 命令行下从bak文件恢复sqlserver数据库方法
  2. linux ace platform_linux.gnu,Linux下配置和使用ACE笔记
  3. mui 头部横向滚动菜单
  4. 【HTTP请求】、详解
  5. Pyserial相关知识
  6. 微信小程序 图片长按识别功能 笔记
  7. android TV 开发规范
  8. 中国计算机学会推荐国内期刊目录
  9. 处理Nginx返回octet-stream数据流的配置
  10. 【python】setup.py的作用
  11. 项目实战:51单片机无线音乐门铃设计资料 五首歌曲自由切换 (含实物 图纸 程序 仿真)
  12. c语言栈的实现和表示
  13. mysql数据库j电子课件_mysql数据库(学习课件).ppt
  14. Num.01- java 之 mybatis 框架
  15. zookeeper连接,报caught end of stream exception EndOfStreamException: Unable to read additional data fro
  16. 关于32位系统中int、float、short、double等占多少个字节
  17. 实验篇(7.2) 05. 通过浏览器访问远端内网服务器 (SSL) ❀ 远程访问
  18. Java小结|Java入门知识点
  19. Apple iOS产品硬件参数.
  20. 教学用计算机房活荷载,机房建设地面承重的计算,比如楼板承重一平方活荷载是200kg...

热门文章

  1. 麻将胡牌算法——C#
  2. 开发者如何应对新技术暗潮
  3. XILINX FPGA 7系之 CLB/LUT/FF/Multiplexers
  4. Pointnet(part_seg)train.py,test.py代码随记
  5. 金属有机骨架MOFs装载抗病毒药物|ZIF-8/石墨烯复合纳米颗粒(ZIF-8/GQDs)负载阿霉素(DOX)齐岳
  6. PMP笔记-区分质量保障(QA)和质量控制(QC)
  7. AlphaGo挑战围棋九段高手李世石
  8. 3-1 改变色度空间—OpenCV-Python教程翻译
  9. 2-2 图像算数操作—OpenCV-Python教程翻译
  10. 静态存储器(SRAM)工作原理