前段时间公司app需要接入苹果支付,看了很多有关IAP的教程,虽然写的都很不错,但每篇文章都不是很全很详细,有的容易出问题的地方都一笔而过了。当然,如果你有一定的iOS开发经验,这些也就应该是一笔而过。
最近有很多人问我IAP的问题,所以准备写一篇教程,完全面对小白,手把手传授技能,希望大家不要让IAP难住或者耽误较多的开发时间与成本,也希望大家看过会对自己有所帮助。
首先呢,IAP的工作流程大概是这样的:
1.向服务器请求商品订单号码以及ituns配置的商品ID
2.根据商品ID,向服务器发起购买商品请求
3.购买流程结束后, 向服务器发起验证凭证以及支付结果的请求
4.验证流程结束完成购买流程。
itunesconnect
下面是具体的流程了:
1.首先,你要有一个开发者账号(这好像是废话了...)
登录itunesconnect.apple.com。
点击协议、税务和银行业务,把里面的Contact Info,Bank Info,Tax Info这三个信息填完整(少一个都不会拿到商品信息)
2.创建App或者选择已经有的App, 点击进入详情之后, 点击App内购项目这一选项
点击加号。
这里解释一下这几种类型:
1.消耗型项目
对于消耗型 App 内购买项目,用户每次下载时都必须进行购买。一次性服务通常属于消耗型项目,例如钓鱼 App 中的鱼饵。
2.非消耗型项目
对于非消耗型 App 内购买项目,用户仅需要购买一次。不会过期或随使用而减少的服务通常为非消耗型项目,例如游戏 App 的新跑道。
3.自动续订订阅
通过自动续订订阅,用户可以购买指定时间期限内的更新和动态内容。除非用户取消选择,否则订阅(例如杂志订阅等)会自动续订。
4.免费订阅
免费订阅是开发人员在“报刊杂志”中推广其内容的绝佳方式。用户注册免费订阅后,此订阅内容在与该用户 Apple ID 相关联的所有设备上可用。免费订阅不会过期,并且仅能在位于“报刊杂志”类别中的 App 中提供。
5.非续订订阅
非续订订阅允许有时限性的营销服务。对于 App 内购买项目中的限时访问内容,就需使用非续订订阅。例如,导航 App 中语音导航功能的一周订阅,或者年度订阅已存档的视频或音频的在线目录。
举个例子:比如Q币,就属于消耗型的商品,或比如QQ会员,就属于非续订订阅了。通常的的开发是使用这两种类型的比较多。其他的就不举例说明了,大家自己发现吧,啊哈哈。
选择消耗形项目, 然后继续,输入商品的名称, 产品的ID(自定义), 在下边添加语言的地方添加一下商品的描述信息, 然后上传一张商品界面的截图(这里可以随便, 影响不是很大)保存就可以了。 这里是创建好的商品商品id是你获取商品的标示,当然id是你自己命名的。
好了,到这里itunesconnect的配置就基本完成了,下面是代码了。
代码
导入 StoreKit.Framework 这个框架
在需要支付的vc里 #import<StoreKit/StoreKit.h>
1在 - (void)viewDidLoad里添加购买监听
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
2 检测是否允许内购
if([SKPaymentQueue canMakePayments]){
[selfrequestProductData:productID];
}else{
NSLog(@"不允许程序内付费");
}
3请求商品信息
- (void)requestProductData:(NSString*)type{
NSArray*product = [[NSArrayalloc] initWithObjects:type,nil];
NSSet*nsset = [NSSetsetWithArray:product];
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];
request.delegate=self;
[request start];
}
4.1成功收到产品返回信息
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
NSArray*product = response.products;
if([product count] ==0){
NSLog(@"没有商品");
return;
}
SKPayment * payment = [SKPayment paymentWithProduct:p];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
4.2失败执行的方法
- (void)request:(SKRequest*)request didFailWithError:(NSError*)error {
NSLog(@"商品信息请求错误:%@", error);
}
- (void)requestDidFinish:(SKRequest*)request {
NSLog(@"请求结束");
}
5监听购买结果
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction {
for(SKPaymentTransaction *tranintransaction){
switch(tran.transactionState) {
caseSKPaymentTransactionStatePurchased:
NSLog(@"交易完成");
break;
caseSKPaymentTransactionStatePurchasing:
NSLog(@"商品添加进列表");
break;
caseSKPaymentTransactionStateRestored:
NSLog(@"已经购买过商品");
break;
caseSKPaymentTransactionStateFailed:
NSLog(@"交易失败");
break;
default:
[SVProgressHUDdismiss];
break;
}
在请求商品信息的时候,因为是去请求苹果的服务器,所以请求时间会稍微有点长,所以响应的解决方法也是有的,就是做一些本地化。不过我没搞(啊哈哈),大家有需求的可以弄一下。
测试
有关测试呢,需要添加沙箱的测试帐号, 在itunsconnect中选择用户与职能,然后添加测试帐号, 这个帐号可以用于测试购买。 另外, 在测试的时候, 可能比较慢, 所以我的项目中加入了不可交互的HUD进行提示, 避免用户进行多次商品的添加与购买。
添加一个测试用户就好了恩,我所知道的有关IAP的大体上这些,可以满足简单的支付了。
这篇文章可能会漏掉一些知识点,代码也不是很健全,大家所需了解的应该是原理和流程,其他的就好说了。
希望这篇文章会对一些初学者,或者对IAP有所疑问的开发者能有所帮助。
网友评论