现在很多的app里面都添加了应用内购买,网上关于苹果证书的生成和设置的教程比较多,这里就不多赘述了,推荐几个个人觉得说的比较详细的网址:

http://www.jianshu.com/p/86ac7d3b593a

http://blog.csdn.net/shenjie12345678/article/details/40978977

在项目中我使用了RMStore的第三方来实现内购代码,因为这个框架对内购代码进行了很好的封装,所以依赖框架后的代码十分简单:

向appStore请求商品:

    NSString *productIds = @[@"ID_1",@"ID_2",@"ID_3"],
[[RMStore defaultStore] requestProducts:[NSSet setWithArray:productIds] success:^(NSArray *products, NSArray *invalidProductIdentifiers) { if([products count] == ){
NSLog(@"--------------没有商品------------------");
return;
} } failure:^(NSError *error) {
NSLog(@"--------------请求商品失败------------------");
}];

购买商品:

    NSString *appleProductId = productId;
[[RMStore defaultStore] addPayment:appleProductId success:^(SKPaymentTransaction *transaction) { NSLog(@"------交易成功------"); } failure:^(SKPaymentTransaction *transaction, NSError *error) {
NSLog(@"------交易失败------");
NSLog(@"error:%@",error); }];

原本繁琐的的代码就以上两个方法就可以搞定了,购买过程中详细的信息可以在block中的 transaction 和 error 等参数中获取.

购买成功后,为了防止不被人破解无限刷币,所以购买完成后要进行订单验证.要详细了解的话可以看看api Receipt Validation Programming Guide

为了确保验证的准确和稳定,一般交由后台去验证,在iOS端我们需要获得订单的receipt数据,然后把这个数据发给后台:

    NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL];
NSString *receiptStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
//把receiptStr发给服务器;

原先在SKPaymentTransaction 这个类中有receipt这个参数,直接transaction.receipt就可以获得验证数据,但iOS7后就已经过期了,所以根据app适配的系统版本来选择获取receipt的方式。

后台的小伙伴收到这串receipt后,将其通过下面的url发送给苹果服务器,要注意测试和发布用的验证地址是不一样的。

沙盒测试: https://sandbox.itunes.apple.com/verifyReceipt

app发布后: https://buy.itunes.apple.com/verifyReceipt

验证后苹果服务器会返回验证信息,大概是3s左右,服务器的小伙伴就根据返回的信息确认订单是否有效。具体app返回的参数可以在api中找到。

iOS开发 使用RMStore简化内购代码 + 内购买订单验证的更多相关文章

  1. iOS开发中一些有用的小代码

    1.判断邮箱格式是否正确的代码: //利用正则表达式验证 -(BOOL)isValidateEmail:(NSString *)email {   NSString *emailRegex = @&q ...

  2. RestKit:iOS开发必备,告别众多无聊代码

    http://www.csdn.net/article/2014-04-15/2819312-RestKit-frameworkRestKit是一款专为iOS设计的Objective-C框架,旨在与R ...

  3. iOS开发——实用技术OC篇&8行代码教你搞定导航控制器全屏滑动返回效果

    8行代码教你搞定导航控制器全屏滑动返回效果 前言 如果自定了导航控制器的自控制器的leftBarButtonItem,可能会引发边缘滑动pop效果的失灵,是由于 self.interactivePop ...

  4. iOS In-App Purchase(IAP)内购服务端二次验证注意事项

    前端iOS完成对应的商品购买之后,会得到一个Transaction(交易)的数据结构指针,后端实际上只需要这个结构内的一个东西,那就是 transaction.transactionReceipt. ...

  5. iOS开发系列--Objective-C之协议、代码块、分类

    概述 ObjC的语法主要基于smalltalk进行设计的,除了提供常规的面向对象特性外,还增加了很多其他特性,这一节将重点介绍ObjC中一些常用的语法特性.当然这些内容虽然和其他高级语言命名不一样,但 ...

  6. IOS开发-UI学习-使用代码创建button

    使用代码创建button分5个步骤,分别是: 1.定义一个按钮,根据定义位置不同可定义为局部变量或者全局变量: 2.初始化按钮,一般使用一个矩形初始化: 3.设置按钮控件的其他属性,如背景图片,或者背 ...

  7. iOS开发点滴 - 如何通过Segue写代码传递数据从一个ViewController到另一个ViewController(Swift代码)

    1. 拖线 按住Control键,用鼠标从源控制器的某个控件开始,拖动到目的控制器 2. 选择弹出类型并设置Segue Identifier 在弹出的对话框中,选择“Selection Segue-& ...

  8. iOS开发--应用国际化,应用内切换语言

    1.前言 自己负责的项目需要做国际化,并且要求应用内部切换语言.这个是可以做到的,也并不难,可以直接戳Github看一下 https://github.com/leo90821/Localiztion ...

  9. IOS开发学习笔记037-九宫格代码实现

    九宫格布局,用手机输入法时经常见到.先按3行3列写. 代码的实现主要是计算插入图片的位置. 每一张图片的位置和所在的行列密切相关.分析过程如下: 界面: 代码实现 1.把需要的图片资源添加进来 然后给 ...

随机推荐

  1. 如何查看distirbution agent的执行进度

    在transactional replication troubleshooting的过程中,经常会遇到下面的场景: 客户在发布端执行了一个几百万行的更新,结果导致性能下降. 客户很想知道目前dist ...

  2. codeforces A. Bayan Bus(简单模拟)

    #include <queue> #include <string> #include <cstdio> #include <cstring> #inc ...

  3. [Design Patterns] 2. Design principle

    Single Responsibility Principle 类的设计趋向于:Use Case Diagram --> (derived) --> Detail Open-Closed ...

  4. Laravel在不同的环境调用不同的配置文件

    Laravel在不同的环境调用不同的配置文件   Laravel如何在不同的环境调用不同的配置文件?社区这个问题问的蛮多,如何优雅的方法实现呢,应该有好多方法吧,我一般习惯用两种方法,设置环境变量,或 ...

  5. iOS-NSDate

    一.概念解释 1.什么是NSTimeZone? NSTimeZone:时区是一个地理名字,是为了克服各个地区或者国家之间在时间上的混乱设定的. 1).GMT:0:00格林威治标准时间:UTC +00: ...

  6. LeetCode——Contains Duplicate III

    Description: Given an array of integers, find out whether there are two distinct indices i and j in ...

  7. HTML5 LocalStorage 本地存储的用法

    本地存储变量b的值: localStorage.setItem("b","isaac"); 本地获取变量b的值: localStorage.getItem(&q ...

  8. SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第3部分)(完结)

    一个简单的更新查询 现在应该知道只读取数据的查询生命周期,下一步来认定当你需要更新数据时会发生什么.这个部分通过看一个简单的UPDATE查询,修改刚才例子里读取的数据,来回答. 庆幸的是,直到存取方法 ...

  9. 《Node.js+MongoDB+AngularJS Web开发》读书笔记及联想

    总体介绍 <Node.js+MongoDB+AngularJS Web开发>,于2015年6月出版,是一本翻译过来的书,原书名为<Node.js,MongoDB and Angula ...

  10. 重新想象 Windows 8 Store Apps (71) - 其它: C# 调用 C++

    [源码下载] 重新想象 Windows 8 Store Apps (71) - 其它: C# 调用 C++ 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 其它 C# ...