内购介绍

With the StoreKit framework, you can offer in-app purchases to sell a variety of items — including premium content, virtual goods, and subscriptions — directly from within your app.(来自Apple官方文档)

大致的意思:使用StoreKit框架,你可以直接在你的app销售各种项目-包括优质的内容,虚拟商品和订阅类物品.

In-App Purchase allows you to embed a store inside your app using the Store Kit framework. This framework connects to the App Store on your app’s behalf to securely process payments from users, prompting them to authorize payment. The framework then notifies your app, which provides the purchased items to users. Use In-App Purchase to collect payment for additional features and content.(来自Apple官方文档)

大致的意思:内购允许你使用StoreKit框架在你的应用中嵌入一个商店(当然,不是真实的商店),StoreKit框架支持安全的支付并且提示用户授权支付。然后这个框架通知你的app(提供购买项目的app)。

需要注意的一点:首先要确定一点你的app中需要内购的项目是否符合内购的要求。内购的商品严格的要求其实就是要满足-虚拟商品,比如:游戏的关卡、视频等。其实对于实物,比如:衣服,键盘等其实可以直接集成第三方的支付方式,比如:支付宝,微信等。

集成内购

1.准备工作:证书、iTunnes Connect中的一些协议问题等

1.1 证书颁发

https://developer.apple.com 按照正常的证书发布流程,注意的就是在 选择App需要支持的服务 的时候要注意下 In-App Purchase 要勾选起来。

1.2 完成iTunnes Connect一些协议的签约

上面的图片来自官方文档In-App Purchase Configuration Guide for iTunes Connect
大致的意思:
前提条件

  • 最新Apple开发者程序许可协议

  • 最新的app支付合同

  • 一个有合适角色的iTunes Connect账户

  • 在iTunes Connect里有该app的纪录

其实主要的想讲的是1,2两点。

在这次的集成内购中正好赶上了Apple发布了新的开发者程序许可协议,这里只需要同意协议就好了。

协议、税务和银行业务 在iTunes Connect了request最新的就ok了。

注意:上面提到的两点没有完成的话,在下面添加内购商品的时候会出现 创建按钮 是灰色的

2.添加内购商品

内购商品可以分为三大类:消耗型项目、非消耗型项目、订阅项目。

按照iTunes Connect的引导流程来就可以了。

注意:添加完成之后,内购商品有个ProductId是程序所需要的

3.移动端的程序部分

我们主要关注你的这一部分。

导入头文件:#import <StoreKit/StoreKit.h>

3.1 检查app是否允许内购
1
2
3
4
5
if([SKPaymentQueue canMakePayments]){  
[self requestWithProductId:productId];
}else{
NSLog(@"该app不允许内购");
}
3.2 向app Store请求商品信息
1
2
3
4
5
6
7
	- (void)requestWithProductId:(NSString *)productId{   

NSSet * set = [NSSet setWithArray:@[productId]];
SKProductsRequest * request = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
request.delegate = self;
[request start];
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
	// 请求的回调函数
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
NSArray *products = response.products;
if (myProduct.count == 0) {

NSLog(@"无法获取产品信息,购买失败。");
return;
}
SKMutablePayment * payment = [SKMutablePayment paymentWithProduct: products[0]];
//添加数量
payment.quantity = 2;
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
// 请求结束的回调函数
- (void)requestDidFinish:(SKRequest *)request {

}
3.3 添加观察者
1
2
// 在支付页面添加监听购买结果
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
	//在各自的状态添加相应的操作
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
for (SKPaymentTransaction *transaction in transactions) {

switch (transaction.transactionState) {

case SKPaymentTransactionStatePurchased: //交易完成
NSLog(@"transactionIdentifier = %@", transaction.transactionIdentifier);
[self completeTransaction:transaction];
break;
case SKPaymentTransactionStateFailed: //交易失败
break;
case SKPaymentTransactionStateRestored: //已经购买过该商品
break;
case SKPaymentTransactionStatePurchasing: //商品添加进列表
NSLog(@"商品添加进列表");
break;
default:
break;
}
}
}

监听用户的支付操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- (void)completeTransaction:(SKPaymentTransaction *)transaction {
// Your application should implement these two methods.
NSString * productIdentifier = transaction.payment.productIdentifier;
NSURL *recepitURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receipt = [NSData dataWithContentsOfURL:recepitURL];

if ([productIdentifier length] > 0 && receipt) {

// 向自己的服务器验证购买凭证
[self setIapCertificateWithReceipt:receipt];

}
//
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

#warning 请求购买课程 成功
}

注意:最好是在自己的服务器端完成证购买凭证,只有验证通过了,才会给用户发放 ‘ 道具 ‘

4.测试部分

要在 iTunes Connect 中的 用户和职能 项目中添加一个沙盒测试员,这样就可以模拟内购的流程。

总结

在这次的集成中,深刻体会到官方文档的重要性,前提条件 很重要,遇到 创建按钮灰色的问题 其实还是挺纳闷的,网上的资料也没有很强调 添加商品签约协议 的顺序,现在回头想其实, 签约协议 本应该就在 添加商品 之前认为是一个很正常的逻辑,所以没有点出这个顺序吧。对于 内购丢单 的问题暂时还没遇到。

参考

iOS应用程序内购/内付费(一)
iOS开发内购全套图文教程
官方文档