iOS应用内付费(IAP)开发步骤列表
iOS应用内付费(IAP)开发步骤列表
前两天和服务端同事一起,完成了应用内付费(以下简称IAP, In app purchase)的开发工作。步骤繁多,在此把开发步骤列表整理如下。因为只是步骤列表,所以并不含详细的说明教程,需要看教程的新手,可以看我附在最后的一些参考链接。
配置Developer.apple.com
登录到Developer.apple.com,然后进行以下步骤:
- 为应用建立建立一个不带通配符的App ID
 - 用该App ID生成和安装相应的Provisioning Profile文件。
 
配置iTunes Connect
登录到iTunes Connet,然后进行以下步骤:
- 用该App ID创建一个新的应用。
 在该应用中,创建应用内付费项目,选择付费类型,通常可选的是可重复消费(Consumable)的或是永久有效(Non- Consumable)的2种,然后设置好价格和Product ID以及购买介绍和截图即可,这里的Product ID是需要记住的,后面开发的时候需要。如下图所示:

添加一个用于在sandbox付费的测试用户,如下图所示。注意苹果对该测试用户的密码要求 和正式账号一样,必须是至少8位,并且同时包含数字和大小写字母:
 
填写相关的税务,银行,联系人信息。如下图所示:

开发工作(ios端)
1、 在工程中引入 storekit.framework 和 #import <StoreKit/StoreKit.h>
2、 获得所有的付费Product ID列表。这个可以用常量存储在本地,也可以由自己的服务器返回。
3、 制作一个界面,展示所有的应用内付费项目。这些应用内付费项目的价格和介绍信息可以是自己的服务器返回。但如果是不带服务器的单机游戏应用或工具类应用, 则可以通过向App Store查询获得。我在测试时发现,向App Store查询速度非常慢,通常需要2-3秒钟,所以不建议这么做,最好还是搞个自己的服务器吧。
4、当用户点击了一个IAP项目,我们先查询用户是否允许应用内付费,如果不允许则不用进行以下步骤了。代码如下:
1  | 
 | 
5、 我们先通过该IAP的ProductID向AppStore查询,获得SKPayment实例,然后通过SKPaymentQueue的 addPayment方法发起一个购买的操作。
1  | 
 | 
6、 在viewDidLoad方法中,将购买页面设置成购买的Observer。
1  | 
 | 
7、 当用户购买的操作有结果时,就会触发下面的回调函数,相应进行处理即可。
1  | 
 | 
8、服务器验证凭证(Optional)。如果购买成功,我们需要将凭证发送到服务器上进行验证。考虑到网络异常情况,iOS端的发送凭证操作应该进行持久化,如果程序退出,崩溃或网络异常,可以恢复重试。
开发工作(服务端)
服务端的工作比较简单,分4步:
- 接收ios端发过来的购买凭证。
 - 判断凭证是否已经存在或验证过,然后存储该凭证。
 - 将该凭证发送到苹果的服务器验证,并将验证结果返回给客户端。
 - 如果需要,修改用户相应的会员权限。
 
考虑到网络异常情况,服务器的验证应该是一个可恢复的队列,如果网络失败了,应该进行重试。
与苹果的验证接口文档在这里。简单来说就是将该购买凭证用Base64编码,然后POST给苹果的验证服务器,苹果将验证结果以JSON形式返回。
苹果AppStore线上的购买凭证验证地址是https://buy.itunes.apple.com/verifyReceipt ,测试的验证地址是:https://sandbox.itunes.apple.com/verifyReceipt
参考链接
以下参考链接详细说明了完成应用内付费开发的步骤:
iOS应用内付费(IAP)开发步骤列表的更多相关文章
- iOS应用内付费(IAP)开发步骤
		
1.苹果iTunes Connect内购产品信息录入. 1)创建app内购买项目(Create New),选择类型: 1.消耗型项目 对于消耗型 App 内购买项目,用户每次下载时都必须进行购买.一次 ...
 - Cocos2d-x使用iOS游戏内付费IAP(C++篇)
		
本文章转载 http://www.ityran.com/archives/5515.非本人原创! 前期准备 设备与账号 在开始编码之前我们需要准备测试环境. IAP只能真机测试,准备一台iOS设备是必 ...
 - [转]iOS 应用内付费(IAP)开发步骤
		
FROM : http://blog.csdn.net/xiaoxiangzhu660810/article/details/17434907 参考文章链接: (1)http://mobile.51c ...
 - iOS应用内支付(IAP)的那些坑
		
本文转载至 http://blog.devtang.com/2013/04/07/tricks-in-iap/ 前言 udacity 中的在线课程 <How to build a startup ...
 - iOS 应用内付费(IAP)开发步骤
		
折腾好几天,原来是税务信息没有填写,哎... 国内就是好啊,没有这些麻烦的事情... :) 等24小时,等税务的审核结果... 有结论了 才能测试内购.... 如果税务信息没有填写完毕,p ...
 - IOS应用内支付IAP从零开始详解
		
前言 什么是IAP,即in-app-purchase 这几天一直在搞ios的应用内购,查了很多博客,发现几乎没有一篇博客可以完整的概括出所有的点,为了防止大伙多次查阅资料,所以写了这一篇博客,希望大家 ...
 - 苹果内付费 IAP
		
创建app内购买项目 消耗型项目:对于消耗型App内购买项目,用户每次下载时都必须进行购买.一次性服务通常属于消耗型项目,例如钓鱼App 中的鱼饵. 非消耗型项目:对于非消耗型App内购买项目,用户仅 ...
 - 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取”产品付费数量等于0的问题”】
		
转的别人的 看到很多童鞋问到,为什么每次都返回数量等于0?? 其实有童鞋已经找到原因了,原因是你在 ItunesConnect 里的 “Contracts, Tax, and Banking”没有完成 ...
 - iOS开发支付篇-内购(IAP)
		
一,前言 经典文章参考: . http://yimouleng.com/2015/12/17/ios-AppStore/ 内购流程 . http://www.jianshu.com/p/b199a46 ...
 
随机推荐
- HDU5556 Land of Farms(二分图 2015 合肥区域赛)
			
容易想到将问题转化为求图的独立数问题 ,但求一般图的独立集是一个NPC问题,需要一些转化. 状态压缩,枚举每个上古农场是否选择,然后将剩下的新农场根据i + j奇偶性分为x , y集. 结果为 max ...
 - .NET yield
			
.Net Yield 其实比较简单,手动yield,一学就会. public static class GalaxyClass { public static void ShowGalaxies() ...
 - a个人经验总结2
			
金额 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8& ...
 - 10gRAC运行srvctl报错error while loading shared libraries:
			
数据库10g才会有这个错,因为11g的grid和oracle是分开的. [oracle@news01 orcl]$ srvctl /u01/app/oracle/db_1/jdk/jre/bin/ja ...
 - 接口API测试和返回值JSON解析的插件
			
火狐插件1. HttpRequest作用:接口API测试例子:http://192.168.10.61:8080/ZHCS/user/loginApp.do?phone=admin&pwd ...
 - Codeforces Round #14 D. Two Paths(求树上两条不相交的路径的乘积最大值)
			
题目链接:  http://codeforces.com/problemset/problem/14/D 思路:直接枚举每一天路径的两端,然后求以每一端为树根的树上最长路径,然后相乘就可以了. # ...
 - git warning: LF will be replaced by CRLF in...
			
如果你有git项目,在提交代码的过程中可能会碰到上面的警告,特别是的项目中包含序列化对象的时候,你可能要小心!! 警告的含义是说换行符的,不同的操作系统的换行符是不一致的,如果你不清楚,真得看看这个 ...
 - vc++ 加载,卸载自己的驱动程序
			
用vc++加载自己的驱动程序主要分为以下几个步骤: 1.加载驱动服务 主要要用到以下几个函数 SC_HANDLE WINAPI OpenSCManagerA( __in_opt LPCS ...
 - Arduino101学习笔记(十三)—— 101六轴传感器
			
一.相关API 1.begin:需要在其他CUIREIMU前调用 //***************************************************************** ...
 - Java学习笔记(八)——封装
			
一.封装 1.定义 将类的信息隐藏在类的内部,不允许外部程序直接进行访问,而是通过该类提供的方法来实现对隐藏信息的操作和方法. 2.优点 (1)只能通过规定的方法访问数据 (2)隐藏类的细节,方便修改 ...