苹果App Store应用内支付(In-App Purchase)
IAP简介
IAP的全称是In-App Purchase,应用内付费。这种业务模式允许用户免费下载试用,对应用内提供的商品选择消费,比如购买游戏道具,购买游戏等级等等。相比完全收费的应用而言,应用内付费给用户试用的机会,不会让优秀的应用因为缺乏用户的认知而丧失消费者;而且对于开发商,也不需要为了让用户试用而单独发布一款免费的精简版本。
下面详细介绍一下应用内支付的详细步骤:
1.点开应用,点击manager in-app purchases
2.点击添加一个新的应用
3.选择相应的类型
IAP里有两个关键的词,商品(Product)和交易(Transaction)。
商品可以是一种虚拟的道具,一个隐藏的关卡或者地图,但必须是直观的,可以让用户购买后直接获益的产品。IAP的商品从消费性质上分为四种:
消耗型商品,比如游戏道具,子弹,药品等等。由于这类商品可以被消耗,所以支持重复购买。苹果应用商店不保存此类商品的购买记录,如果要保存则需要开发者同步到自己的服务器上。
非消耗型商品,比如游戏关卡,隐藏地图等等。这类商品只要购买一次便可以了,苹果应用商店里每一个用户对非消耗型商品的购买都有记录,可以在不同的设备上恢复购买状态,这个恢复的过程叫做Restore。
自动重置型订阅,比如电子杂志,读物等。消费者购买这类商品时会从列表中选择一个有效期限,卖家在定义商品的时候从一群固定的选项中选择添加一个有效期,比如7天,一个月,两个月。过了有效期之后,商品的购买状态会被自动重置成未购买,要想继续获得内容则需要再次订阅。这种类型的商品和非消耗型商品一样,会在苹果商店内保存购买记录。
非自动重置型订阅,比如用户订阅电子杂志和读物报刊时需要从自定义的期限列表中选择期限,而不是苹果提供的固定选项,比如9天,一个半月或任意时间。在这种情况下,苹果商店无法根据期限来控制订阅的到期行为,所以一切都需要开发商自己编写相应的逻辑来实现。
交易是指用户对一个商品的购买行为,当用户点击购买一件商品时,一个新的付费行为就被添加到付费队列中,付费队列是一条系统线程,即使应用程序终止仍然会继续执行。
4.添加相应的应用信息
Reference Name 应用名字
Product ID 应用的id
添加语言和支付的名字
添加相应的价格
添加相应的图片
点击保存
5.测试IAP的准备流程
如果你是一个注册的苹果开发者,接受了最新的苹果开发者协议,并且签署了iOS付费应用合同,那么你就可以继续IAP的测试了。
使用未越狱的设备
苹果应用商店是一个交易环境,任何用户可以在这个环境内购买应用,但如果要测试正在开发过程中的应用内付费,我们不能在真正的苹果商店里进行。苹果给开发者提供了一个用于调试购买行为的测试沙箱,它完全复制了应用商店的交易环境,但在沙箱环境中我们不能用平常的苹果帐号,而是需要用测试帐号。
在iTunesConnect的首页可以点击Manage Users进入用户管理页面,然后选择Test User来创建测试帐号。根据苹果开发者的最新谢意,创建测试帐号必须使用一个真实的Email地址,而且密码必须是符合规范的,测试账号需要在邮件里激活后才可以使用。这里创建的帐号可以用来购买开发过程中的应用内付费,但必须记住,测试帐号不能用来登陆真正的应用商店并在产品环境中进行购买行为,否则你的iTunes帐号将有可能被停用。
6.实现ios开发
测试代码:http://easymorse-iphone.googlecode.com/svn/trunk/PurchaseTest/
在App Delegate中添加Observer
[[ECPurchase shared] addTransactionObserver];
.设置ECPurchase的product delegate(产品列表代理),transaction delegate(购买结果代理),验证方式
[[ECPurchase shared] setProductDelegate:self];
[[ECPurchase shared] setTransactionDelegate:self];
[[ECPurchase shared] setVerifyRecepitMode:ECVerifyRecepitModeiPhone];
.请求商品列表
[[ECPurchase shared] requestProductData:identifiers];
实现代理函数绘制UI
-(void)didReceivedProducts:(NSArray *)products;
.购买商品
[[ECPurchase shared] addPayment:proIdentifier];
.确认结果
如果不需要收据认证实现代理函数
-(void)didFailedTransaction:(NSString *)proIdentifier;
-(void)didRestoreTransaction:(NSString *)proIdentifier;
-(void)didCompleteTransaction:(NSString *)proIdentifier;
否则实现代理函数
-(void)didCompleteTransactionAndVerifySucceed:(NSString *)proIdentifier;
-(void)didCompleteTransactionAndVerifyFailed:(NSString *)proIdentifier withError:(NSString *)error;
运行内部支付demo,点击测试:
内部支付的逻辑:
iOS App 向 Developer Server 发送请求,获得一份产品列表(一般都是 Product ID)。
获取产品列表需要 iOS App 主动获得,这样就可以在不升级iOS的情况下添加产品。
Developer Server 返回给 iOS App 包含 Product ID 的列表。
iOS App 向 App Store 发送请求,期望获得到产品的信息。