美文网首页ios学习iOS带我飞4
最新详细苹果应用内支付IAP开发教程

最新详细苹果应用内支付IAP开发教程

作者: Levan_li | 来源:发表于2015-12-07 16:47 被阅读3791次

    前段时间公司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有所疑问的开发者能有所帮助。

    相关文章

      网友评论

      本文标题:最新详细苹果应用内支付IAP开发教程

      本文链接:https://www.haomeiwen.com/subject/fcdehttx.html