1、发送请求,注意请求ID

NSString *productID = @"这是创建内购项目填写的ID";
NSArray *product = [[NSArray alloc] initWithObjects: productID,nil];
NSSet *nsset = [NSSet setWithArray:product];
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];
request.delegate = self;

2、 在监听购买结果后,一定要调用[[SKPaymentQueue defaultQueue] finishTransaction:tran];来允许你从支付队列中移除交易。

//监听购买结果
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction{for(SKPaymentTransaction *tran in transaction){switch (tran.transactionState) {case SKPaymentTransactionStatePurchased:{NSLog(@"交易完成");// 发送到苹果服务器验证凭证,进行二次验证[self verifyPurchaseWithProductionEnvironment];[[SKPaymentQueue defaultQueue] finishTransaction:tran];}break;case SKPaymentTransactionStatePurchasing:NSLog(@"商品添加进列表");break;case SKPaymentTransactionStateRestored:{NSLog(@"已经购买过商品");[[SKPaymentQueue defaultQueue] finishTransaction:tran];}break;case SKPaymentTransactionStateFailed:{NSLog(@"交易失败");[[SKPaymentQueue defaultQueue] finishTransaction:tran];[SVProgressHUD showErrorWithStatus:@"购买失败"];}break;default:break;}}
}

3、 沙盒环境测试appStore内购流程的时候,请使用没越狱的设备。
请务必使用真机来测试,一切以真机为准。
4、 项目的Bundle identifier需要与您申请AppID时填写的bundleID一致,不然会无法请求到商品信息。
5、真机测试的时候,一定要退出原来的账号,才能用沙盒测试账号
6、二次验证,请注意区分宏, 测试用沙盒验证,App Store审核的时候也使用的是沙盒购买,所以验证购买凭证的时候需要判断返回Status Code决定是否去沙盒进行二次验证,为了线上用户的使用,验证的顺序肯定是先验证正式环境,此时若返回值为21007,就需要去沙盒二次验证,因为此购买的是在沙盒进行的。

//沙盒测试环境验证
#define SANDBOX @"https://sandbox.itunes.apple.com/verifyReceipt"
//正式环境验证
#define AppStore @"https://buy.itunes.apple.com/verifyReceipt"
/***  验证购买,避免越狱软件模拟苹果请求达到非法购买问题**/
-(void)verifyPurchaseWithProductionEnvironment{//从沙盒中获取交易凭证并且拼接成请求体数据NSURL *receiptUrl=[[NSBundle mainBundle] appStoreReceiptURL];NSData *receiptData=[NSData dataWithContentsOfURL:receiptUrl];NSString *receiptString=[receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];//转化为base64字符串NSString *bodyString = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\"}", receiptString];//拼接请求数据NSData *bodyData = [bodyString dataUsingEncoding:NSUTF8StringEncoding];/*
注意:
自己测试的时候使用的是沙盒购买(测试环境)
App Store审核的时候也使用的是沙盒购买(测试环境)
上线以后就不是用的沙盒购买了(正式环境)所以此时应该先验证正式环境,在验证测试环境正式环境验证成功,说明是线上用户在使用
正式环境验证不成功返回21007,说明是自己测试或者审核人员在测试
*///第一步,验证正式环境//创建请求到苹果官方进行购买验证(正式环境)NSURL *url=[NSURL URLWithString: AppStore];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];NSLog(@"%@",dic);if([dic[@"status"] intValue]==0){//正式环境验证通过(说明是上线以后的用户购买)NSLog(@"购买成功!");//在此处对购买记录进行存储,可以存储到开发商的服务器端}else if([dic[@"status"] intValue]== 21007){//This receipt is from the test environment, but it was sent to the production environment for verification. Send it to the test environment instead.//购买凭证来自于测试环境,但是却发送到了正式环境,请改成测试环境(这种情况下可能是自己测试的,也可能是审核人员测试的)//第二步,验证测试环境[self verifyPurchaseWithTestEnvironment];}
}//创建请求到苹果官方进行购买验证(测试环境)
- (void)verifyPurchaseWithTestEnvironment {NSURL *url=[NSURL URLWithString:SANDBOX];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];NSLog(@"%@",dic);if([dic[@"status"] intValue]==0){NSLog(@"购买成功!");//在此处对购买记录进行存储,可以存储到开发商的服务器端}else{NSLog(@"购买失败,未通过验证!");}
}

iOS-内购注意 沙盒二次验证相关推荐

  1. ios沙箱模式开启_【iOS】苹果IAP(内购)中沙盒账号使用注意事项

    目标 沙盒账号的正确使用方式 沙盒账号使用的注意事项 1.沙盒账号是什么 iOS应用里面用到了苹果应用内付费(IAP)功能,在项目上线前一定要进行功能测试.测试肯定是需要的,何况这个跟money有关. ...

  2. 苹果内购中沙盒账号使用注意事项

    目标 沙盒账号的正确使用方式 沙盒账号使用的注意事项 1.沙盒账号是什么 iOS应用里面用到了苹果应用内付费(IAP)功能,在项目上线前一定要进行功能测试.测试肯定是需要的,何况这个跟money有关. ...

  3. Unity IAP iOS 内购以及获取交易收据进行验证

    1. 准备工作,先到iTunesConnect 上进行添加内购项目和沙盒测试账号 创建APP 内购项目 选择其中一种类型,进行创建 填写内购项目的内容(其中的产品 ID 记住,在接下来有很多地方需要用 ...

  4. iOS 内购的最新讲解

    来源:简书 - IIronMan 链接:http://www.jianshu.com/p/4f8a854ff427(点击尾部阅读原文前往) 一.总说内购的内容 1.协议.税务和银行业务 信息填写 2. ...

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

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

  6. IOS内购自动续费订阅测试

    一.IOS 内购类型 1.消耗型商品: 只可使用一次的产品,使用之后即失效,必须再次购买. 示例:抽奖券. 2.非消耗型商品: 只需购买一次,不会过期或随着使用而减少的产品. 示例:游戏 App 的赛 ...

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

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

  8. iOS——内购支付详解后台操作(一)

    一.思维导图 二.重点总结: 1.获取内购列表(从App内读取或从自己服务器读取) 2.App Store请求可用的内购列表 3.向用户展示内购列表 4.用户选择了内购列表,再发个购买请求,收到购买完 ...

  9. ios 内购正式环境_iOS开发-2017苹果内购最新教程

    公司项目中有虚拟产品,所以要使用苹果内购.自此记录一下苹果内购的流程.前提是已有开发者账号 协议,税务和银行业务 协议,税务和银行业务 协议,税务和银行业务 申请合同 这里提示地址太长,按照要求重新填 ...

最新文章

  1. webpack+vue+mint-ui 实现上拉加载更多(Loadmore组件)
  2. JavaScript实现depth First Search深度优先搜索算法(附完整源码)
  3. bagging and boosting
  4. linux 内核配置mmc,Linux内核编译,配置本机驱动
  5. freemarker list size问题
  6. 使用ABAP SAT工具分析SAP OData service实现明细
  7. 刷新本地的DNS缓存数据
  8. 倒计时小工具_这款高颜值的 APP 可以让小仙女/男神们的日子过得更精致
  9. 去哪儿-15-keep-alive
  10. 《Python语言程序设计》——3.4 实例研究:最小数量的硬币
  11. r语言 悲观剪枝_R语言实战(5) ——高级数据管理
  12. linux安装启动svn
  13. hive order by sort by distribute by总结
  14. java处理paypal支付
  15. 攻防世界 Reverse logmein
  16. 32单片机与迪文屏通信的开发学习
  17. 无人超市信息管理系统——需求分析
  18. 剑~~~~~~~~~~
  19. 下班路上捡了一部手机,我用8年开发知识主动找到了失主
  20. 在 Kubernetes 实施混沌工程—— Chaos Mesh® 原理分析与控制面开发

热门文章

  1. 获取PC 服务器 可用的GPU
  2. autojs左右滑动脚本代码_Swiper.js实现移动端元素左右滑动
  3. 四阶段课堂总结解决问题
  4. 离散数学——图论中图的同构的应用
  5. 倒计时三天-谈谈互联网的删除和被遗忘权
  6. PE文件格式”1.9版 完整译文
  7. 【C语言】第五章 - 操作符
  8. Dva 的connect使用
  9. 拆掉思维里的墙--书摘+个人理解
  10. java中laber字体颜色设置,QLabel:设置文本和背景的颜色