iOS应用内支付(IAP)的开发经验交流

       最近几个星期,应产品需求开发了应用内支付流程,即IAP。提笔写下大致过程,分享与大家交流。我这里是从development开发者中心创建证书和配置文件,在iTunes后天创建应用,创建虚拟商品,接入OC代码这样一套逻辑来写的,如果新手不太明白具体内容,建议先看看苹果官方文档的中文翻译版本,了解一二!!!

1,配置Developer.apple.com

(1)登录到Developer.apple.com,创建证书,即开发者开发证书

(2)为应用建立建立一个不带通配符的App ID

(3)用该App ID生成和安装相应的Provisioning Profile文件

(4)添加真机测试的手机

2,配置iTunes Connect

(1)登录到iTunes Connet,用该App ID创建一个新的应用,大致信息填写

(2)在功能模块,创建虚拟物品


创建物品


第二步

这里的产品ID,最好写的有意义,在后面代码接入购买的时候用到

(3)设置税务和银行卡信息

我这边是经理事先填好的,需要的话,请看这里http://openfibers.github.io/blog/2015/02/28/in-app-purchase-walk-through/

(4)创建应用的沙盒测试账号

点击用户与职能

点击+号,根据具体信息填写

3,接入代码

(1)设置bundleID,填加证书和配置文件,保证能在手机上跑起来

(2)普及一个,我这边学到的知识

IAP的支付流程分为两种,一种是有服务器参与的,一种是没有服务器参与的。有服务器参与就是说,在购买之前,需要把产品的相关信息发送到服务器,服务器验证购买凭证,如果成功,我们能拿到订单字符串,发起支付购买,完成之后,苹果服务器返回结果,我们拿到结果在跟服务器验证,验证成功后,可以由服务器发放具体的商品;没有服务器参与的话,就是跳过了验证过程,是由客户端自己处理逻辑。具体在看代码吧。

官方的两张图,有服务器和无服务器

(3)需要在工程中引入 Storekit.framework框架

          支付控制器中 #import <StoreKit/StoreKit.h>

          遵守两个代理协议 SKProductsRequestDelegate 和 SKPaymentTransactionObserver, 前者是获取产品信息的回调,后者是购买的观察者。

(4)创建一个获取产品信息的请求

NSSet * set = [NSSet setWithArray:@[prodectId]]; // 这个就是产品ID,在iTunes后台创建

SKProductsRequest * request = [[SKProductsRequest alloc] initWithProductIdentifiers: set];

request.delegate = self; // 遵守SKProductsRequestDelegate代理

[request start];

查询产品信息的回调函数

-  (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {

            NSArray *myProduct = response.products;    // 获取到的商品数组

            if (myProduct.count == 0) {

                    // 没有获取到

           {

// 代码到此,就是有商品了。这时就有两种操作,一种是向服务器验证购买凭证,获取订单字符串,发起购买;一种是直接拿商品ID发起购买。

            SKMutablePayment *mPayment = [[SKMutablePayment alloc] init];

            mPayment.productIdentifier = productID; // 产品ID

            [[SKPaymentQueue defaultQueue] addPayment:mPayment];  // 调起支付界面,发起购买

}

(5)把控制器设置为监听购买操作的观察者,这一步,在ViewDidLoad中设置

   [[SKPaymentQueue defaultQueue]  addTransactionObserver: self];

购买结果的回调

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

           for (SKPaymentTransaction *transaction in transactions) {

                          switch (transaction.transactionState) {

                                 case SKPaymentTransactionStatePurchasing:

                                {

                                    NSLog(@"商品加入列表,正在购买中..."); 

                                }

                                break;

                                case SKPaymentTransactionStatePurchased:    // 购买完成

                               {

                                  NSLog(@"购买完成");

                                  [self finishedTransaction:transaction];

                                }

                                break;

                                case SKPaymentTransactionStateFailed:      // 交易失败

                               {

                               [self failedTransaction:transaction];

                               }

                               break;

                               case SKPaymentTransactionStateRestored: //已经购买过该商品

                              {

                              NSLog(@"已经购买过该商品");

                              [self alreadyBuyWithTransaction:transaction];

                              }

                             break;

                             default:

                             break;

                      }

           }

}

注: 完成购买的操作中,如果有服务器,需要向服务器验证购买结果,如果没有,就直接完成。

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

调起支付后,输入注册的沙盒账号即可点击购买。


注:这里有几个注意事项

一,测试支付的ipa必须使用[App-Store]证书

二,越狱机器无法测试IAP

三,用SandBox账号测试支付的时候,必须把在系统[设置]里面把[Itunes Store 与 App Store]登录的非                               SandBox账号注销掉,否则向苹果服务器请求不到订单信息

四,Sandbox账号不要在正式支付环境登陆支付,登陆过的正式支付环境的SandBox账号会失效

五,所有在itunes上配置的商品都必须可购买,不能有某些商品根据商户自己的服务器的数据在某个时期出现免费的情况

六,商品列表不能按照某些特定条件进行排序(比如说下载量)

七,非消耗型商品必须的有恢复商品功能

八,非消耗类型的商品不要和商户自己的服务器关联

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • iOS应用内付费(IAP)开发步骤 1.苹果iTunes Connect内购产品信息录入。 1)创建app内购买项...
    MillerWang阅读 10,944评论 0 7
  • 在我们应用开发中我们经常在自己的项目中使用到支付,下面我们来谈谈iOS这块的支付;iOS支付主要分为两类,第三方支...
    Hither阅读 8,254评论 9 42
  • iOS支付 iOS支付分为两类,第三方支付和应用内支付(内购)。 第三方支付包括:支付宝支付、微信支付、银联支付、...
    sillen阅读 1,351评论 0 1
  • iOS支付 iOS支付分为两类,第三方支付和应用内支付(内购)。 第三方支付包括:支付宝支付、微信支付、银联支付、...
    帅不过oneS阅读 2,844评论 2 8
  • 脑子清醒得像上了发条 好像是25年来第一次 认认真真得剖析自己对感情的态度 我遇见你 一个暂时还未让我心动的人 ...
    0803号岛屿阅读 272评论 1 0