iOS苹果IAP 充值
这次遇到的问题主要有两点
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 充值相关推荐
- java(jfinal) 接入ios苹果内购(连续包月订阅),服务端将二次验证。
大致流程: 1.ios端进行支付,然后收到苹果的一串数据(也叫收据),然后ios端将其转码为BASE64编码的字符串. 2.ios端请求服务端接口,将数据传给服务端,服务端拿到数据后,通过一系列处理后 ...
- JAVA项目之苹果IAP内购JAVA服务器验证流程详解
1.前言 本博客是经历过多个项目检验的, 绝对真实, 适应于对苹果iap内购稍微有些了解的JAVA开发人员, 认真看, 定能完美解决苹果内购问题. 苹果IAP内购支付实际上是"将客户端支 ...
- uni app ios 苹果内购
app ios 苹果内购 的步骤 1,准备工作先要uniapp 开发ios 内购需要准备的沙盒 测试账号,在苹果手机登录沙盒账号 也就是把自己的Apple ID退出登录沙盒账号,manifest.js ...
- ios 内购正式环境_php服务端处理 ios内购充值
app一直没有接入iOS内购充值,随着业务支付功能越来越多,ios内购充值就提到日程上来了.那么,ios内购充值怎么做呢? 其实iOS内购充值是通过客户端接入iOS的IAP模块(In-AppPurch ...
- iOS内购充值 服务器端处理
文章已迁移到新博客 http://cwqqq.com/2017/12/ios_in-app_pay_server_side_code iOS内购充值,是通过客户端接入iOS的IAP模块(In-App ...
- iOS 苹果2.1大礼包回复模版-guideline 2.1 Information Needed
iOS 苹果2.1大礼包回复模版-guideline 2.1 Information Needed 回复模板 1 XX彩票 Dear Aoo Review Team. 您好,我们这边按照您说的那些可能 ...
- 苹果IAP内购验证工具类
苹果内购 java验证类 package com.utils.ios; import lombok.extern.slf4j.Slf4j;import javax.net.ssl.*; import ...
- 【IAP支付之三】苹果IAP安全支付与防范 receipt收据验证
这里网上的朋友已经介绍的很详细了,具体的链接已经无法找到了. 这里主要说几点本人在开发中遇到的问题: 1.漏单必须要处理,玩家花RMB购买的东西却丢失了,是绝对不能容忍的.所谓的漏单就是玩家已经正常付 ...
- 鸿蒙手机王者荣耀怎么充值,苹果手机王者荣耀怎么充值?苹果系统充值王者荣耀教程...
在苹果系统中其实是可以充值王者荣耀的,具体该怎么充值呢?一起来看吧. 苹果系统充值王者荣耀教程 首先,请大家登录苹果系统中安装的王者荣耀游戏,这里我以iPad为例,打开IOS系统中安装的王者荣耀游戏主 ...
最新文章
- 命令行下从bak文件恢复sqlserver数据库方法
- linux ace platform_linux.gnu,Linux下配置和使用ACE笔记
- mui 头部横向滚动菜单
- 【HTTP请求】、详解
- Pyserial相关知识
- 微信小程序 图片长按识别功能 笔记
- android TV 开发规范
- 中国计算机学会推荐国内期刊目录
- 处理Nginx返回octet-stream数据流的配置
- 【python】setup.py的作用
- 项目实战:51单片机无线音乐门铃设计资料 五首歌曲自由切换 (含实物 图纸 程序 仿真)
- c语言栈的实现和表示
- mysql数据库j电子课件_mysql数据库(学习课件).ppt
- Num.01- java 之 mybatis 框架
- zookeeper连接,报caught end of stream exception EndOfStreamException: Unable to read additional data fro
- 关于32位系统中int、float、short、double等占多少个字节
- 实验篇(7.2) 05. 通过浏览器访问远端内网服务器 (SSL) ❀ 远程访问
- Java小结|Java入门知识点
- Apple iOS产品硬件参数.
- 教学用计算机房活荷载,机房建设地面承重的计算,比如楼板承重一平方活荷载是200kg...
热门文章
- 麻将胡牌算法——C#
- 开发者如何应对新技术暗潮
- XILINX FPGA 7系之 CLB/LUT/FF/Multiplexers
- Pointnet(part_seg)train.py,test.py代码随记
- 金属有机骨架MOFs装载抗病毒药物|ZIF-8/石墨烯复合纳米颗粒(ZIF-8/GQDs)负载阿霉素(DOX)齐岳
- PMP笔记-区分质量保障(QA)和质量控制(QC)
- AlphaGo挑战围棋九段高手李世石
- 3-1 改变色度空间—OpenCV-Python教程翻译
- 2-2 图像算数操作—OpenCV-Python教程翻译
- 静态存储器(SRAM)工作原理