FROM : http://blog.csdn.net/xiaoxiangzhu660810/article/details/17434907

参考文章链接:

(1)http://mobile.51cto.com/iphone-389249.htm

(2)http://blog.csdn.net/xiaominghimi/article/details/6937097

(3)http://zengwu3915.blog.163.com/blog/static/2783489720137485857701/

步骤如下:

第一步:你需要在iTunesConnect中创建个新的App,然后为这个App设置一些产品(付费道具)等;

OK,这里Himi稍微解释下,iTunesConnect是苹果提供的一个平台,主要提供AP发布和管理App的,最重要的功能是创建管理项目信息,项目付费产品(道具)管理、付费的测试账号、提交App等等,这里就简单介绍这么多,关于产品一词在此我们可以理解成游戏道具即可;在苹果看来所有付费都属于产品 =。 =千万不要纠结字眼哦~

OK,打开iTunesConnect网站:https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa (注意:企业级的用户必须使用公司主开发者账号登陆才可!)

成功登陆后的页面如下:

这里大概说下重要的一些项:

 Contracts, Tax, and Banking   : 管理银行账号、联系人以及税等等;这里要根据提示完成对应的信息填写!一定要详细填写喔~

             Manage Users :管理用户的,比如主账号以及测试付费的(测试App)账号;

             Manage Your Applictions:管理应用程序的,你所有发布的应用和每个应用的状态都在这里面;

下面我们新建一个App项目,大家放心,我们这里创建的是不会直接提交给App审核的,所以放心创建,只要控制好App的状态不要是待审核状态即可,不过即使你不小心将项目提交了,也没事,直接更改App状态即可了;

选择Manage Your Applictions选项,然后新建一个项目:【Add New App】,根据提示来填写吧,这里就不细致说明了~

创建好一个App之后,在点击Manage Your Applictions后的界面应该如下:

这里你将看到自己创建的App,点击你创建的App项目,这里Himi创建的项目名字叫”ProjectForBuyTest“,点击你的App进入如下界面:

 

  (注意:这里的Bundle ID一定要跟你的项目中的info.plist中的Bundle ID保证一致!!!!)

这里可以管理你的项目的信息、状态、是否嵌入GameCenter等等选项,那么本章我们重点介绍如何使用IAp沙盒测试程序内付费,所以这里我们点击右上角的”Manage In-App Purchases“选项进入创建产品(游戏道具)界面如下:

上图中的下方看到Himi创建过的四个产品(道具)了,你可以点击”Create New“选项新建一个产品(付费道具),点击新建如下界面:

上图中Himi没有截图出所有的选项,这里大概介绍下,这个界面是选择你的消费道具的种类,种类说明如下:

   类型选择有四种选择:

   1.Consumable(消耗品): 每次下载都需要付费;

   2.Non-consumable(非消耗品): 仅需付费一次;

   3.Auto-Renewable Subscriptions:自动订阅;

   4.Free Subscription:免费订阅

   最下方是你沙盒测试的截图,暂且不管即可;

   这里Himi选择Consumable选项,比如很多游戏都是购买金币啦这样子就可以选择这个;然后出现如下界面:

Reference Name: 付费产品(道具的)参考名称

   Product ID(产品ID): 你产品的唯一id。通常格式是 com.xx.yy,但它可以是任何形式,不要求以程序的App ID作为前缀。

   Add Language: 添加产品名称与描述语言;

   Price Tier:选择价格,这里你选择价格后,会出现如上图最下方的价格对照表

   Screenshot(截屏): 展示你产品的截屏。(这个直接无视,测试App务必要管这个的)

 

Product ID(产品ID)可以创建多个,比如我想游戏中分为0.99$ 、1.99$等道具那就创建对应多个产品ID

  我们填写好了”Reference Name“与”Product ID“以及”Price Tier“后,点击”Add Language“选项然后出现如下界面:

上图中的选项:

Language:语言

      Displayed Name(显示名称): 用户看到的产品名称。

      Description(描述): 对产品进行描述。

Ok,一路 Save保存回到”Manage In-App Purchases“界面中会看到我们新建的产品(道具)如下:

大家可以看到新建的产品(道具)ID:这里Himi创建的产品ID是com.himi.wahaha ,这里要记住这个产品ID哦~

第二步:申请测试帐号,利用沙盒测试模拟AppStore购买道具流程;

  回到itunesconnect主页中,选择“Manage Users”然后选择“Test User”,然后出现的界面如下图:

这里Himi已经创建了两个测试账号了,点击界面中的 “Add New User”进行创建即可;记住账号和密码哈,记不住就删掉重新建 娃哈哈~(切记:不能用于真正的AppStore中使用此账号,不仅不能用,而且一旦AppStore发现后果你懂得~)

第三步:填写相关的税务,银行,联系人信息;

1.这里需要先设置一下。
点击“Request”,填写一下Legal Entity的基本信息

完成之后同意一个协议并提交

之后页面中会出现Contracts In Process.
2.这时,分别来设置Contact Info、Tax Info和Bank Info
(1)、Contact
点击Contact Info下的“Set Up”,进入Contact Information页面,并点击“Add New Contact”来增加新的contact
填写好里面对应的信息,点Save保存就可以了
然后回到Contact Information页面,刚增加的Contact就会出现在下拉框中,将对应的Role设置对应的Contact然后点Done完成
(2)、Bank
回到Contracts, Tax, and Banking主页面,选择Bank Info下面的”Set Up“,进入Bank Information 页面。选择“Add Bank Account”来增加一个银行信息
选择你银行卡开户所在哪个国家,这里有China了,呵呵
下一步设置银行的CNAPS Code,这个号有的地方说是联行号,可以理解为每个银行支行的唯一ID吧,这个可以打电话问你银行卡开户行,就是他们那的一个唯一12位的标示号码,也可以通过苹果的Look up Transit Number去搜索。

不过,我觉得苹果的搜索全英文的,都不知道国内银行的英文名叫什么,什么支行的英文又是什么。好吧,那就用下面这个网站去查询也是可以的https://e.czbank.com/CORPORBANK/WebBank?&tranFlag=0&dse_operationName=wgQueryUnionBankSrvOp

复制获取的现代化支付系统行号,粘帖到上面苹果页面中的CNAPS Code项。点击下一步,苹果会根据你写的那个代码读出对应的银行信息,这在你可以验证一下你写的银行号是否正确。

再下一步就设置你的卡号,账户名以及币种(人民币是CNY,当初还以为是RMB呢,找了半天,纳闷。当然,如果你的卡支持美元什么的也可以选择别的币种)

 
这步设置完后就是显示你设置的所有信息,这在你可以核对一下是否有误,问没题的话点“Save”保存,保存后就回到前面的Choose Bank页面,选择刚才设置的这个银行“Save”完成银行设置
 
(3)、Tex
回到Contracts, Tax, and Banking主页面,选择Tex Info下面的”Set Up“,进入Tex Information 页面。如果上面有你所在的国家就选,没有的都选择U.S. Tax Forms。下面就来设置一下在天朝的情况:
A. 选择第一个U.S Tax Forms,点击下面的“Set Up”
B. 是否美国公民、或美国公司什么的,这个选择“No”就可以了,不然后面要你设置税号的,这个,真心木有。
C. 有没有美国商业活动.这个也用“No”吧,这个神马的太遥远了,呵呵

D. 设置Tax Infomation。设置一下基本的信息

设置好后点“Confirm”就完成了

 
同样的,把World也设置一下。设置完成后会需要一个处理时间,理论值会在24小时内完成。

第四步:在项目中申请购买产品代码以及监听;

一、开发工作(ios端)

1、 在工程中引入 storekit.framework 和 #import <StoreKit/StoreKit.h>

2、 获得所有的付费Product ID列表。这个可以用常量存储在本地,也可以由自己的服务器返回。

3、 制作一个界面,展示所有的应用内付费项目。这些应用内付费项目的价格和介绍信息可以是自己的服务器返回。但如果是不带服务器的单机游戏应用或工具类应用, 则可以通过向App Store查询获得。我在测试时发现,向App Store查询速度非常慢,通常需要2-3秒钟,所以不建议这么做,最好还是搞个自己的服务器吧。

4、当用户点击了一个IAP项目,我们先查询用户是否允许应用内付费,如果不允许则不用进行以下步骤了。代码如下:

  1. if ([SKPaymentQueue canMakePayments]) {
  2. // 执行下面提到的第5步:
  3. [self getProductInfo];
  4. } else {
  5. NSLog(@"失败,用户禁止应用内付费购买.");
  6. }

5、 我们先通过该IAP的ProductID向AppStore查询,获得SKPayment实例,然后通过SKPaymentQueue的 addPayment方法发起一个购买的操作。

  1. // 下面的ProductId应该是事先在itunesConnect中添加好的,已存在的付费项目。否则查询会失败。
  2. - (void)getProductInfo {
  3. NSSet * set = [NSSet setWithArray:@[@"ProductId"]];
  4. SKProductsRequest * request = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
  5. request.delegate = self;
  6. [request start];
  7. }
  8. // 以上查询的回调函数
  9. - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
  10. NSArray *myProduct = response.products;
  11. if (myProduct.count == 0) {
  12. NSLog(@"无法获取产品信息,购买失败。");
  13. return;
  14. }
  15. SKPayment * payment = [SKPayment paymentWithProduct:myProduct[0]];
  16. [[SKPaymentQueue defaultQueue] addPayment:payment];
  17. }

6、 在viewDidLoad方法中,将购买页面设置成购买的Observer。

  1. - (void)viewDidLoad {
  2. [super viewDidLoad];
  3. // 监听购买结果
  4. [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
  5. }
  6. - (void)viewDidUnload {
  7. [super viewDidUnload];
  8. [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
  9. }

7、 当用户购买的操作有结果时,就会触发下面的回调函数,相应进行处理即可。

  1. - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
  2. for (SKPaymentTransaction *transaction in transactions)
  3. {
  4. switch (transaction.transactionState)
  5. {
  6. case SKPaymentTransactionStatePurchased://交易完成
  7. NSLog(@"transactionIdentifier = %@", transaction.transactionIdentifier);
  8. [self completeTransaction:transaction];
  9. break;
  10. case SKPaymentTransactionStateFailed://交易失败
  11. [self failedTransaction:transaction];
  12. break;
  13. case SKPaymentTransactionStateRestored://已经购买过该商品
  14. [self restoreTransaction:transaction];
  15. break;
  16. case SKPaymentTransactionStatePurchasing:      //商品添加进列表
  17. NSLog(@"商品添加进列表");
  18. break;
  19. default:
  20. break;
  21. }
  22. }
  23. }
  24. - (void)completeTransaction:(SKPaymentTransaction *)transaction {
  25. // Your application should implement these two methods.
  26. NSString * productIdentifier = transaction.payment.productIdentifier;
  27. NSString * receipt = [transaction.transactionReceipt base64EncodedString];
  28. if ([productIdentifier length] > 0) {
  29. // 向自己的服务器验证购买凭证
  30. }
  31. // Remove the transaction from the payment queue.
  32. [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
  33. }
  34. - (void)failedTransaction:(SKPaymentTransaction *)transaction {
  35. if(transaction.error.code != SKErrorPaymentCancelled) {
  36. NSLog(@"购买失败");
  37. } else {
  38. NSLog(@"用户取消交易");
  39. }
  40. [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
  41. }
  42. - (void)restoreTransaction:(SKPaymentTransaction *)transaction {
  43. // 对于已购商品,处理恢复购买的逻辑
  44. [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
  45. }

8、服务器验证凭证(Optional)。如果购买成功,我们需要将凭证发送到服务器上进行验证。考虑到网络异常情况,iOS端的发送凭证操作应该进行持久化,如果程序退出,崩溃或网络异常,可以恢复重试。

二、开发工作(服务端)

服务端的工作比较简单,分4步:

  1. 接收ios端发过来的购买凭证。
  2. 判断凭证是否已经存在或验证过,然后存储该凭证。
  3. 将该凭证发送到苹果的服务器验证,并将验证结果返回给客户端。
  4. 如果需要,修改用户相应的会员权限。

考虑到网络异常情况,服务器的验证应该是一个可恢复的队列,如果网络失败了,应该进行重试。

与苹果的验证接口文档在这里。简单来说就是将该购买凭证用Base64编码,然后POST给苹果的验证服务器,苹果将验证结果以JSON形式返回。

苹果AppStore线上的购买凭证验证地址是https://buy.itunes.apple.com/verifyReceipt ,测试的验证地址是:https://sandbox.itunes.apple.com/verifyReceipt

[转]iOS 应用内付费(IAP)开发步骤的更多相关文章

  1. iOS应用内付费(IAP)开发步骤列表

    iOS应用内付费(IAP)开发步骤列表 前两天和服务端同事一起,完成了应用内付费(以下简称IAP, In app purchase)的开发工作.步骤繁多,在此把开发步骤列表整理如下.因为只是步骤列表, ...

  2. iOS应用内付费(IAP)开发步骤

    1.苹果iTunes Connect内购产品信息录入. 1)创建app内购买项目(Create New),选择类型: 1.消耗型项目 对于消耗型 App 内购买项目,用户每次下载时都必须进行购买.一次 ...

  3. Cocos2d-x使用iOS游戏内付费IAP(C++篇)

    本文章转载 http://www.ityran.com/archives/5515.非本人原创! 前期准备 设备与账号 在开始编码之前我们需要准备测试环境. IAP只能真机测试,准备一台iOS设备是必 ...

  4. iOS应用内支付(IAP)的那些坑

    本文转载至 http://blog.devtang.com/2013/04/07/tricks-in-iap/ 前言 udacity 中的在线课程 <How to build a startup ...

  5. iOS 应用内付费(IAP)开发步骤

    折腾好几天,原来是税务信息没有填写,哎...  国内就是好啊,没有这些麻烦的事情...  :) 等24小时,等税务的审核结果...     有结论了 才能测试内购.... 如果税务信息没有填写完毕,p ...

  6. IOS应用内支付IAP从零开始详解

    前言 什么是IAP,即in-app-purchase 这几天一直在搞ios的应用内购,查了很多博客,发现几乎没有一篇博客可以完整的概括出所有的点,为了防止大伙多次查阅资料,所以写了这一篇博客,希望大家 ...

  7. 苹果内付费 IAP

    创建app内购买项目 消耗型项目:对于消耗型App内购买项目,用户每次下载时都必须进行购买.一次性服务通常属于消耗型项目,例如钓鱼App 中的鱼饵. 非消耗型项目:对于非消耗型App内购买项目,用户仅 ...

  8. 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取”产品付费数量等于0的问题”】

    转的别人的 看到很多童鞋问到,为什么每次都返回数量等于0?? 其实有童鞋已经找到原因了,原因是你在 ItunesConnect 里的 “Contracts, Tax, and Banking”没有完成 ...

  9. iOS开发支付篇-内购(IAP)

    一,前言 经典文章参考: . http://yimouleng.com/2015/12/17/ios-AppStore/ 内购流程 . http://www.jianshu.com/p/b199a46 ...

随机推荐

  1. IOS SDWebImage实现原理详解

    在之前我写过SDWebImage的使用方法,主要是用与获取网络图片,没有看过的朋友可以看看. 这篇文章将主要介绍SDWebImage的实现原理,主要针对于获取网络图片的原理,如果没有第三方我们该怎么去 ...

  2. 【原】IOS中KVO模式的解析与应用

    最近老翁在项目中多处用到了KVO,深感这种模式的好处.现总结如下: 一.概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单 ...

  3. 全球最低功耗蓝牙单芯片DA14580的软件体系 -层次架构和BLE消息事件处理过程

    在作者之前发表的<全球最低功耗蓝牙单芯片DA14580的系统架构和应用开发框架分析>.<全球最低功耗蓝牙单芯片DA14580的硬件架构和低功耗>.<全球最低功耗蓝牙单芯片 ...

  4. IOS之UI--小实例项目--综合使用

    前言: 本博文是基于前一个小实例项目:IOS之UI--小实例项目--添加商品和商品名 进行继续综合学习积累的. 内容大纲 01-综合使用01-plist的使用 02-综合使用02-模型取代字典的好处分 ...

  5. android 进程间通信数据(二)------parcel的实现

    Serialize是java原生就自带的东西,我们可以看到android的源码 所以看看android是如何实现parcel的,这对我们自己代码设计有什么启发. Parcel: 在android中,p ...

  6. Atitit.一个cms有多少少扩展点,多少api wordpress  cms有多少api。。扩展点

    Atitit.一个cms有多少少扩展点,多少api wordpress  cms有多少api..扩展点 1. Api分类 WordPress APIs1 1.1. 1 函数分类2 1.2. 函数api ...

  7. Effective Java 01 Consider static factory methods instead of constructors

    Advantage Unlike constructors, they have names. (BigInteger.probablePrime vs BigInteger(int, int, Ra ...

  8. Java并发大师Brain Goetz和Doug Lea 的中英文博客文章地址

    Java并发大师Brain Goetz和Doug Lea是Java并发方面最权威的人物,他的文章绝对是最具有参考价值的,值得仔仔细细的推敲和研究. Brain Goetz 中文地址:http://ww ...

  9. JavaScript吸顶灯的实现

    吸顶灯是各站点常用的一个功能,它有两个特性 向下滚动到div位置时,该div一直固定在页面的顶部 向上滚动到div原有位置时,div又恢复到文档中的原位置 div可能是一个“分类菜单”,也可能是一个“ ...

  10. Python pass语句作用与用法

    Python中的pass语句作用是什么?表示它不做任何事情,一般用做占位语句.pass语句具体作用及使用方法,我们往下看. pass语句在函数中的作用 当你在编写一个程序时,执行语句部分思路还没有完成 ...