为你的应用添加内置收费 In App Purchase

自从09年10月16日苹果发送给所有开发者的那一封信,通知了程序内购买将可用于免费应用,我认为这也宣告了pTE版的时代结束。

成千上万的免费版的软件或游戏,将作为限制了功能的完整版免费发售,如果用户觉得有意购买,可以直接解锁完整版的功能或购买附加内容。

本文讲阐述如何为你现有的应用或游戏添加程序内购买(In App Purchase)功能。

阅读前提:假设了你拥有一定的iPhone SDK开发基础,和App Store实践经验。

你的程序需要唯一的Bundle ID, 如果已经发布的程序使用了通配符,那么就不能直接添加该功能。如果拥有了唯一的ID,请在program portal中添加你的app id,允许程序使用内购买(Enable In App Purchase)。

在设计好你的程序内购买的功能以后,首先需要定义元数据。来到iTunes Connect,在Manage Your In App Purchases中为你的程序添加一个程序内购买的商品。

为你的应用添加内置收费 In App Purchase

上面第一个部分是添加的内部信息。参考名称,ID,类型,和价格。以及各种本地化信息。

这里简单说一下类型的选择,其他信息,以及In App Purchase支持什么类型的商品请查看Getting Started with In App Purchase

Non-consumable 默认类型,非消耗品,具有持久性,特点是一次性购买,可用在所有设备。例如解锁游戏的储存关卡功能。

Consumable 消耗品,用完或使用后消失,可多次购买,不能用在所有的设备,例如游戏中的血瓶或技能书。

Subscription 订阅,和消耗品一样,除了可以在设备之间共享。

创建购买流程

大致可以分为十个步骤:

验证App Store存取权限 这样做是因为,家长控制或一些公司的配置文件阻止了此功能,使用支付队列的查询功能canMakePayments来确定用户是否有权限购买,返回值 YES代表可以购买/NO代表没有权限购买。

载入目录 载入储存在本地或者远程的商品目录。

获得商品本地化信息 程序向App Store发起查询请求获得目录中商品的本地化信息:

myPossibleProds = [NSSet setWithObjects: @”myProd1”, @”myProd2”, @”myProd3, nil]; 


myProdRequest = [[SKProductsRequest alloc] initWithProductIdentifiers: myPossibleProds]; 


myProdRequest.delegate = myProductsRequestDelegate; [myProdRequest start];  

程序接收来自App Store的回应: -(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response response包含可能的信息 response.products //产品信息 response.invapdProductIdentifiers //错误的产品标示符 错误的产品可能由下面的原因导致:

商品未在 iTunes Connect中录入。

商品没有选择“Cleared for Sale”。

商品还没有传播到所有服务器。

创建商品信息 前面的步骤获得了产品信息的数组用以呈现:

myAvailableProductsArray = response.products; 


for (SKProduct* aProduct in myAvailableProductsArray) { 


    diplayTitle = aProduct.locapzedTitle; 


    displayDesc = aProduct.locapzedDescription; 


    displayPrice = aProduct.price; 


} 

呈现商品信息 在UI中显示前面获得的信息

请求支付

myPayment = [SKPayment paymentForProductIdentifier: selectedProdID userInfo: nil];  


myPayment = [SKPayment paymentForProduct: selectedProduct userInfo: nil]; 

然后提交到队列

defaultPaymentQueue = [SKPaymentQueue defaultQueue]; [defaultPaymentQueue addTransactionObserver: myObserver]; [defaultPaymentQueue addPayment: myPayment];  


[defaultPaymentQueue addPayment: myRequest];  


- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 

验证支付的事务

for(SKPaymentTransaction *aTransaction in transactions) {  


       switch (aTransaction.transactionState )  


           { 


            // 商品进入购买流程 


            case SKPaymentTransactionStatePurchasing: ... break;  


            // 成功购买商品  


            case SKPaymentTransactionStatePurchased: ... break;  


            // 已经购买过该商品  


            case SKPaymentTransactionStateRestored: ... break;  


            // 用户取消交易  


            case: SKPaymentTransactionStateFailed ... break;  


           } 

Used to vapdate e-commerce transaction

Cryptographically signed chunk of data

Contains information about the purchase

Can vapdate using Web-based API

收到交易回执以后可以传送到你的服务器处理该交易。

你的服务器可以向苹果发送交易验证信息。 苹果的交易验证地址:https://buy.itunes.apple.com/verifyReceipt 验证数据格式:{ receipt-data : &helpp;} 苹果的返回值如果是{ status : 0 } 那么交易是正确,如果返回任何其他值 { status : any_other_value } 交易就是不成立。 你的服务器收到苹果的验证成功信息以后,返回给应用程序类似于解锁功能等消息。

解锁内置物品火提供远程存取地址 需要注意的地方

用户可能随时退出程序。

Store Kit 的交易队列是持久化的。

交易是持久化的。

验证存取。

移除交易。

[[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 

储存购买 需要将非消耗的购买记录在服务器上,以供用户更换设备或删除程序以后重新安装时再次解锁功能。

提供物品恢复 前面的代码中,已经购买过该商品的处理就是直接解锁。 defaultPaymentQueue = [SKPaymentQueue defaultQueue]; [defaultPaymentQueue restoreCompletedTransactions];

测试沙盒环境

只供给测试用户,并且设备上才有效,不能使用模拟器测试。

可以为每个国家的商店添加测试帐号。

不能用来测试其他的iTunes Store特性。

需要为每个测试添加唯一的email地址,可以考虑使用+

payam+usa@example.com—测试美国的商品

payam+uk@example.com—测试英国的商品

payam+jp@example.com—测试日本的商品

测试步骤,需要在设备的设置菜单中iTunes Store登出原有帐户。

然后不要在设置菜单中登录测试帐号,而是直接打开需要测试的程序进行测试。

在这之前需要在iTunes Connect的Manage Users菜单中添加In App Purchase测试用户。

财务报表

收入和应用程序同样的规则

你获得总收入的70%。

支付日程,使用税,报表等全部都一样。

报表

一样的报表格式。

相关推荐